David J. MALAN: Ito ang CS50 at ito ay ang simula ng linggo sa apat. At, batang lalaki, ay Volkswagen in problema lahat dahil sa software. Ipaalam sa amin kumuha ng isang hitsura. [Playback ng video] -Cars, Ang smartest mga character sa Mabilis at galit na galit movies. Sa linggong ito German automaker Natagpuan Volkswagen mismo sa gitna ng isang iskandalo ng potensyal na kriminal na sukat. -Volkswagen Ay pagkakabit para sa mga bilyun-bilyong sa mga multa, posibleng kasong kriminal para sa mga executive nito, pati na Humihingi ng paumanhin ang kumpanya para sa rigging 11 milyong mga sasakyan sa tulungan itong matalo pagsusuri emissions. -Certain Diesel modelo ay dinisenyo na may sopistikadong software na sa paggamit ng impormasyon kabilang ang mga posisyon ng mga pangunahin at sasakyan bilis upang matukoy ang mga kotse ay sumasailalim sa emissions testing. Sa ilalim ng na kalagayan, ang mga engine ay magbabawas toxic emissions. Ngunit ang kotse ay lutong sa bypass na kapag ito ay hinihimok. Emisyon nadagdagan 10 hanggang 40 beses sa itaas tanggap na mga antas EPA. [END playback] David J. MALAN: Kaya sabihin tingnan ang mga ito at makita kung paano mismo ito maaaring ipatupad at kung paano maaaring makaapekto ito kaya maraming mga kotse na tulad nito. Kaya sa aking kamay dito ay ang mga press release na inisyu ng EPA-- Environmental Protection Agency na ay ang US regulatory agency na humahawak sa kapaligiran alalahanin, at pagkatapos ay ang aktwal na legal na notice na ipadala sa Volkswagen lamang ng ilang mga araw ang nakalipas. Kaya nagsusulat ang EPA, at nagbubunyag ngayon publiko, isang sopistikadong software algorithm sa mga tiyak Nakikilala Volkswagen sasakyan kapag ang sasakyan ay sumasailalim opisyal emissions testing at nagiging full emissions kumokontrol sa lamang sa panahon ng pagsubok. Ang pagiging epektibo ng mga sasakyan polusyon control emissions aparato ay lubos na nabawasan sa panahon ng lahat normal driving sitwasyon. Ang mga resulta sa mga kotse na matugunan ang mga pamantayan sa laboratoryo o testing station, ngunit sa panahon ng normal na operasyon naglalabas ng nitrogen oxides-- o NOx-- at hanggang sa 40 beses ang standard. Ang software na ginawa ng Volkswagen ay isang aparato quote magpanipi, pagkatalo, gaya ng nilinaw ng Clean Air Act sa US. Pumunta sila sa pagsasabi na EPA at iba pang ahensiya walang takip ang aparato pagkatalo software pagkatapos ng independiyenteng pagsusuri ng mga mananaliksik sa West Virginia University. NOx polusyon-aambag sa nitrogen dioxide, antas ng lupa ozone, at pinong particulate matter. Exposure sa mga pollutants ay nakaugnay sa isang malawak na hanay ng mga malubhang epekto sa kalusugan, kabilang ang nadagdagan hika pag-atake at iba pang respiratory sakit na maaaring maging malubha sapat upang magpadala ng mga tao sa ospital. Exposure sa ozone at particulate bagay ay mayroon ding ay nauugnay sa napaaga kamatayan dahil sa respiratory kaugnay o cardiovascular kaugnay na mga epekto. Mga bata, mga matatanda, mga taong may preexisting sakit sa paghinga ay partikular na nasa panganib para sa epekto sa kalusugan ng mga pollutants. Magkasiya ay upang sabihin, ito ay lubos na seryoso. At pumunta sa upang basahin ipaalam lamang ng isa pang excerpt at pagkatapos ay gagamitin namin ang isang tumingin sa ang pinagbabatayan implikasyon ng mga ito sa konteksto ng isang kotse. Partikular, Volkswagen panindang at naka-install software sa ang tinatawag na electronic control module-- o ECM-- ng ang mga sasakyan na naramdaman kapag ang sasakyan ay sinusuri para sa pagsunod sa mga pamantayan ng EPA paglabas. Batay sa iba't-ibang mga input kabilang ang posisyon ng manibela, sasakyan bilis, ang tagal ng engine operasyon, at barometric presyon, mga input tiyak sinusubaybayan ang mga parameter ng pederal na pamamaraan ng pagsubok na ginagamit para sa paglabas pagsubok para sa EPA certification mga layunin. Sa panahon ng paglabas testing EPA, ang mga sasakyan ECM software bumangga software na ginawa sang emissions resulta. Sa lahat ng iba pang mga beses, na ang sasakyan ECM software bumangga sa isang hiwalay na kalsada calibrate na nabawasan ang pagiging epektibo ng kabuuang sistema emission control, partikular na ang pumipili catalytic pagbabawas ng Lean NOx trap-- na kung saan kami ay makita ang tungkol sa ilang sandali. Bilang isang resulta, emissions ng Nox nadagdagan ng isang factor ng 10 hanggang 40 oras sa itaas ng EPA sang antas depende sa uri ng mga drive cycle. Kaya kung ano talaga ang ibig sabihin nito, at ang source code sa ang software na tumatakbo sa Volkswagen ay may hindi pa isiwalat sa publiko, ay na, mabisa, ito katumbas ay isang lugar doon sa loob ng code Volkswagen ni. Kung ikaw ay sinusuri, at kung ang kotse Nakikilala ang ilang mga bagay sa kapaligiran tulad ng manibela posisyon o sa paggalaw o kakulangan nito ng mga sasakyan o anumang bilang ng mga iba pang mga kadahilanan na kasalukuyang hypothesized upang maging bahagi ng formula na ito, i lamang sila sa kontrolin full emissions. Sa ibang salita, simulan nila na nagpapalabas ng mas mababa ng mga pollutants. Iba Pa, sa bawat iba pang mga sitwasyon kapag hindi ito ay napansin na rin ang pagiging sa laboratoryo, ang mga ito lamang ay hindi. At kaya maaari mong gawing simple ito sa mas kongkreto pseudocode sa isang bagay ganito. Kung ang mga gulong ay magkakaroon ngunit ang manibela ay hindi, ipinahihiwatig na ang sasakyan ay sa ilang mga uri ng umiikot silindro ngunit sa ilang mga uri ng warehouse sinusuri, pagkatapos ay kumilos bilang ang EPA ang nais mong. Kung hindi man ay hindi. Kaya sabihin tumagal ng isang pagtingin sa isang maikling video na tumatagal ng isang pagtingin sa kung ano ang mga implikasyon Isasama ng mga ito ang tunay na wala sa loob. [Playback ng video] -Last Biyernes ang EPA inihayag na ang ilang mga Volkswagen Audi kotse na ginawa sa pagitan ng 2009 at sa taong ito ay gumagamit ng isang tinatawag device pagkatalo upang makakuha ng paligid emissions batas dinisenyo upang panatilihing malinis ang hangin. Ngunit ano ang ibig sabihin na eksakto? Well, modernong sasakyan ay may dose-dosenang ng mga computer sa loob ng mga ito. At ang ilan sa mga computer makatulong sa coordinate ng mga function ng engine para sa pinakamainam na pagganap habang tinitiyak na hindi masyadong maraming basura galing ng tambutso. Sila na talagang na-nagtatrabaho sa ganitong paraan para sa ilang mga dekada ngayon. Karaniwang, ang bawat bahagi ng engine ng isang modernong kotse ni may isang sensor o controller sa mga ito, at ang mga computer Nagbabasa sa data libu-libong mga beses bawat segundo adjustments making tulad ng ratio ng gasolina sa air na ang pagpunta sa cylinders. Ang mga pandaraya Volkswagen at Audi modelo ay diesels, at diesels magkaroon ng isa pa talagang mahalaga na computer kinokontrol ng mga parameter, na kung saan ay ang halaga ng mga unburned fuel pagpunta sa maubos. Ngayon na ang tunog masama. Hindi tunog tulad ng gusto mo unburned fuel pagpunta sa maubos. Ngunit sa kaso ng isang diesel, mayroon kang isang bagay tinatawag na isang NOx bitag na kung saan ay isang aparato na sumisipsip at lalang sa nitrogen oxides na pollutants na gagawin kung hindi man pumunta sa kapaligiran. At ang epekto ng na NOx bitag ay pinahusay na may unburned fuel. Kaya isang aparato pagkatalo ay isang espesyal na programa sa loob ng mga computer na ito ay maaaring gumawa ng hitsura ng kotse ay nakakatugon sa paglabas pamantayan kahit na kapag ito ay hindi. Volkswagen nagkaroon ng problema sa kanyang mga kamay. Diesel engine nito ay kilala para sa pagkuha ng mahusay na gasolina ekonomiya, ngunit gumagana lamang ang Nox bitag mabuti kapag mas maraming gasolina ay ginagamit. Kaya ang sasakyan ay matagpuan, gamit na ito pagkatalo device, kapag ito ay nakakakuha ng isang emissions test, magiging gumamit ng higit gasolina, gumawa ng mabuti ang Nox bitag trabaho, emissions ay magiging masarap. Ngunit pagkatapos mong makakuha ng sa daan, ang aparato Ino-off, ikaw ay nasusunog mas mababa gasolina ngunit ikaw ay paglagay ng mas maraming bilang 40 beses higit pollutants sa kapaligiran. Ngunit kung paano ginawa ang ano Alam ang kotse na ito ay sinusuri para sa pagsunod emissions? Sinasabi ng EPA ito ay isang sopistikadong sistema na naka-check bagay tulad ng posisyon ng manibela, bilis, kung gaano katagal ang engine ay noong, at kahit na ang atmospheric presyon. Sa ibang salita, nagkaroon walang paraan na ito ay aksidenteng dahil ang software ay dinisenyo tunay mabuti upang makita ang isang opisyal na test emissions. Iyon ang ilang mga medyo seryosong panlilinlang at iyon ang bakit Volkswagen ay sa tulad ng malubhang problema. Sa katunayan, ang kanilang mga CEO, Martin Winterkorn, lamang stepped down. Kaya kung ano ang susunod na mangyayari? Well, kung ikaw ay isa sa mga kalahating milyong diesel Jettas, Beatles, Golfs, Passats, o Audi A3s maapektuhan sa, ang mabuting balita ay ay na ang iyong sasakyan ay ligtas upang humimok pa rin. Hindi mo na kailangang ilagay ito sa malayo hanggang ibibgay Volkswagen isang pagpapabalik. Ngunit sa ilang mga punto na ang mga ito marahil pagpunta sa may i-update ang software sa loob ng iyong kotse. Kapag nangyari iyon maaari ka makakuha ng mas kaunting mga milya bawat tangke. Lawyers ay giring up para sa mga class action na kaso kaya may-ari ay maaaring makakuha ng bayad sa ilang mga punto sa hinaharap. Ngunit iyon ay hindi pagpunta sa mangyari sa anumang oras sa lalong madaling panahon. [END playback] David J. MALAN: Kaya ito ang tunay na iaangat isang nakawiwiling mas malaking tanong na larawan pati na ang tiwala. Right? Lahat tayo ay may mga iPhone o Androids o isang bagay sa aming mga bulsa malamang mga araw na ito, o laptop sa aming mga lap na software na tumatakbo ginawa sa pamamagitan ng Apple at Microsoft at mga kumpol ng ibang mga kumpanya. Ngunit paano ko malalaman namin na kung ano ang mga produktong software ginagawa ay talagang kung ano ang mga ito sabihin companies na kanilang ginagawa? Halimbawa, kung sino ang sa sabihin na ang bawat panahon na kayo gumawa ng tawag sa telepono sa iyong iPhone o Android phone o mga katulad, na na numero ng telepono ay hindi rin na-upload sa server ng ilang kumpanya dahil sa ilang mga program na sa iyo nakasulat, maging ito man ay ang operating sistema mismo tulad ng iOS o Android, o dahil na-download mo ang ilang mga third party na app na kahit papaano ay nakikinig sa lahat ng bagay ka nagta-type o lahat ng bagay ikaw ay tunay na sinasabi. Paano mo malalaman na, kapag ka guys ay tumatakbo Clang o Gumawa upang itala ang iyong sariling software sa CS50, kung paano gawin mo sariling mga kawani na CS50, sa pamamagitan ng paraan ng CS50 library, ay hindi pa pag-log sa bawat string na iyong na-tapat na paraan o bawat pulgada kailanman na iyong nakuha? Well, maaari mong tiyak tumingin sa source code para sa isang bagay tulad ng CS50 library, ikaw maaaring tingnan ang source code para sa Linux operating system tumatakbo sa CS50 IDE. Ngunit isang kamangha-manghang pagtatanghal ay ibinigay pabalik sa 1984 sa pagtanggap ng Turing Award sa pamamagitan ng isang napaka sikat na computer scientist na kilala as-- nagngangalang Ken Thompson na natanggap ang Turing Award na ay isang uri ng computer science ni Nobel Prize, kung ikaw ay, para sa kanyang trabaho sa isang tinatawag na operating system Unix, na kung saan ay lubos na katulad sa espiritu sa kung ano ang ginagamit namin na kung saan ay Linux. At ang tanong ay tinanong niya sa kanyang pagtanggap pagsasalita, mahalagang aalay ng framework para sa taon at taon ng talakayan tungkol sa tiwala at seguridad, ay ito. Hanggang saan dapat isa tiwala ng isang pahayag na ang isang program-- isang piraso ng software-- ay libre ng mga Trojan horse? Marahil ito ay mas mahalaga na ang tiwala ang mga tao na sinulat ni ang software. At sa katunayan, na-link namin sa talk na siya Ibinigay kapag tumatanggap ng award na ito sa '80s sa website CS50 sa ilalim ng pahina ng Mga aralin para sa araw na ito. Dahil kung ano ang makikita mo ay na siya ang tunay na nagbibigay isang pantay simpleng halimbawa ng kung paano kahit isang tagatala tulad Clang o ano man compiler ang iba ay may ginagamit sa nakalipas, paano kung naka-embed sa compiler namin ang ating mga sarili ay gumagamit ay isang maliit na kung condition na mahalagang sabi, kung napansin mo na ang code na ito ay gumagamit ng ang GetString function o ang GetInt function, sige at ipasok isang pinto sa likod o isang Trojan horse tulad na programa na na ngayon ay may ilang mga zero at mga na gawin ang isang bagay masamang hangarin. Pag-log ng lahat ng iyong keystroke, pag-upload ng data na iyon sa ilang mga server, o talagang kahit ano. At kung ano Ken Thompson napupunta sa upang gawin sa kanyang talk ay upang ipakita na kahit na mayroon kang access sa source code ng isang tagatala na malisyoso maaaring paggawa nito, hindi mahalaga dahil mayroong ito manok at ang itlog katotohanan ng nakalipas na maraming taon kung saan ang mga compiler ay ginagamit upang ipunin ang kanilang mga sarili. Sa ibang salita, paraan pabalik kapag ang isang tao ay na may nakasulat na ang unang compiler. At pagkatapos nito, anumang oras na na-update ang mga ito isang tagatala pamamagitan ng pagbabago ng source code nito, pagdagdag ng mga tampok at recompiling ito para sa mga taong katulad sa amin upang gamitin, well, sila ay gumagamit ng lumang bersyon ng tagatala upang ipunin ang mga bagong bersyon ng tagatala. At kung ikaw ay kumuha ng isang pagtingin sa talk na ibinigay niya, makikita mo na dahil ng na circularity, Maaari mong aktwal na magkaroon ng mga bug o Trojan horse-embed sa software aming ginagamit. At kahit na tumingin ka sa mga source code para sa mga programa, hindi ito maaaring maging kahit na maliwanag dahil ang panlilinlang ay talagang sa ilang mga mas lumang bersyon ng isang tagatala na mula pa ay injecting ang banta sa aming software. Alin lamang sabihin, kami talagang hindi maaari at hindi dapat tiwala software na tumatakbo sa aming mga laptop o phone o anumang bilang ng mga lugar. At sa katunayan, sa bandang huli ng semester kapag namin simulan ang pakikipag-usap tungkol sa mga web programming at talagang simulan ang paggawa web mga aplikasyon sa ating sarili, kami makipag-usap tungkol sa mga pagbabanta at iba pa. Ngayon, maaari ka na ba at napansin na nagkaroon ng isang maliit na maliit maliit Darth Vader sa clip na Ang labi ay nagpapakita ng may tungkol sa Volkswagen. Kapag hindi mo na makikita, ako naisip dapat naming pagaanin mood dahil ito ay ang lahat ng tunay mapagpahirap at nakakatakot. Pupunta ako upang tumingin sa likod sa Super Bowl 2011 kapag ang isang commercial sa pamamagitan ng Volkswagen-- at ito halos gumagawa ng mga ito kaibig-ibig again-- naisahimpapawid para sa unang pagkakataon sa TV. Ito ay ang 60 segundong clip na sa tingin ko na magugustuhan ninyo. [Playback ng video] [MUSIC - TEMA MULA SA "Star Wars"] [Aso barks] [CAR Pagsisimula] [END playback] David J. MALAN: Oo. Lamang ako ay suri. Car Iyon ay nasa listahan ng mga paglabag. Lahat tama. Kaya tayo ay tumingin sa ilang mga Pseudocode ilang sandali ang nakalipas. At narito ang isang mas malaking snippet ng pseudocode code na nakakita kami ng ilang beses kaya sa ngayon. At ni gamitin ito ay isang pagkakataon hayaan ngayon upang maipakilala ang isang bagong programming pamamaraan na aming ginawa makita algorithmically huling linggo kapag kami ay tumingin sa pagsasama-uuri. Ngunit gawing pormal ni ito at makita kung paano ipaalam maaari naming gamitin ang mga ito sa aktwal na code, at pagkatapos kami ay pagpunta sa paggamit na ito pamamaraan pababa ng kalsada pinaka malamang na malutas ang ilang iba pang mga problema. Kaya ito ay isa sa mga unang programa namin kailanman nagsulat, kahit na sa pseudocode code. At kung ano ang program na ito pinapayagan sa amin upang gawin course ay upang mahanap ang Mike Smith sa isang libro ng telepono. At mapansin sa partikular na linya walong at 11 na kung saan ay nagkaroon na ito Pumunta Upang statement. At sa katunayan, ang ilang mga wika, C kasama ng mga ito, talagang gawin ay may isang pahayag na ito ay literal pumunta sa na nagbibigay-daan sa iyo upang lumipat sa isang tiyak na linya. Sa pangkalahatan Ito ay sinasang-ayunan dahil maaaring ito ay tunay madali inabuso at maaari mong simulan ang paglukso iyong program sa buong lugar bilang laban sa paggamit ng mga uri ng lohika at ang kontrol ng daloy na kami ay ginagamit sa gayon ay malayo sa pamamagitan lamang loops at kundisyon at mga katulad nito. Ngunit maaari naming gawing simple ang algorithm na ito sa pseudocode code bilang mga sumusunod. Sa halip na ito umuulit o looping diskarte kung saan panatilihin namin ang pagpunta sa likod at pabalik-balik sa line tatlo, bakit hindi namin lamang uri ng tumikin at higit pa karaniwang sabihin sa linya ng pitong at 10, palitan ang mga lamang ng dalawang pares ng mga linya sa, iba kung Smith ay mas maaga sa aklat bibigyan namin ng maghanap para sa Mike sa kaliwang kalahati ng libro. Iba Pa kung Smith ay mamaya sa book, maghanap para sa Mike sa tamang kalahati ng libro. At mapansin na ang circularity. Right? Ako ay naghahanap ng Mike sa ang telepono ng libro at pagkatapos ay Ako sa wakas hit siguro pitong linya o marahil line 10 at ang aking pagtuturo sa aking sarili ay ang paghahanap para sa Mike sa kalahati ng mga libro ng telepono. Well, paano ako maghahanap ng Mike? Ako ay nasa gitna ng naghahanap para sa Mike, bakit ikaw ay ang uri ng pagpapadala sa akin sa isang lupon? Ngunit iyon lamang ang OK dahil kung ano ang nangyayari sa laki ng problema, tulad ng nakasulat sa linya 7 at 10? Na hindi lamang sinasabi namin ang paghahanap para sa Mike, maghanap para sa Mike. Kami mismo ay sinasabi kung ano? Maghanap para sa kanya sa kaliwang kalahati ng ang kanang kalahati kung saan ay epektibo kalahati ang laki ng problema. Kaya ito ay OK na kami ng uri ng makatawag pansin sa ganitong circularity, ito pabilog argument, dahil hindi bababa sa hindi namin paggawa ng mas maliit at mas maliit ang problema. At sa huli kami ay pagpunta upang maabot na tinatawag na base kaso kung saan kami ay may lamang ng isang pahina left-- bilang aming volunteer noong nakaraang linggo did-- nagkaroon kami ng isang pahina pakaliwa at pagkatapos ay hindi namin kung patuloy na maghanap para sa Mike Smith dahil siya ang alinman sa pahinang iyon o siya ay hindi. Kaya kung paano namin ipatupad ang mga ideya na ito, ito uri ng circularity sa aktwal na code? Well, maaari naming pagkilos ng isang pamamaraan na karaniwang kilala bilang recursion. At nakakita kami ng ito sa pseudocode para sa pagsasama-uuri noong nakaraang linggo. Alalahanin na ito ay ang pseudocode para sa pagsasama-uuri. Ito ay arguably mas simple kaysa bubble o pagpili o insertion sort lamang sa mga tuntunin ng pagiging simple na kung saan maaari mong ipahayag ang mga ito. Ngunit iyon ay dahil sa hindi namin uri ng circularly na nagsasabi, maghanap para sa isang bagay sa pamamagitan ng paghahanap para sa itong muli. Ngunit kami ay naghahanap sa alinman sa kaliwang kalahati o ang karapatan sa kalahati at pagkatapos ay sa huli hindi namin pinagsasama sa kasong ito. Ngunit dito, masyadong, na may mga dalawang linya uri, ay muli na namin ito ideya ng recursion. At concretely ano ang ibig sabihin nito, sa konteksto ng isang algorithm, ay na ang isang algorithm ay recursive kung ito ay gumagamit o tawag sa sarili. O sa mga tuntunin ng C, ang isang function ay recursive-- isang function na tinatawag foo ay recursive kung foo, saanman sa source code nito, tawag mismo ang function foo. At iyon ang masama kung kahit minsan ay ang lahat ng foo ay tumawag muli at muli mismo. Ito ay OK kung foo kalaunan ay tumigil, tulad ng ginagawa sumanib uri, sa pamamagitan ng pagsasabi, maghintay ng isang minuto, kung ang problemang ito ay sobrang maliit, halimbawa, o natagpuan ko yaong Ako hinahanap, bumalik lang. Huwag recursively, hindi cyclically tumawag muli ang aking sarili. At tumagal ng isang pagtingin sa upang ipaalam sa kung paano ito maaaring talagang gumagana. Kaya ako pagpunta sa sige at bukas up ng dalawang mga halimbawa source code dito. Isa na kung saan ay tinatawag na palatandaan 0. At ito ay hindi sa lahat recursive, ngunit ipaalam sa tumagal ng isang pagtingin sa kung ano ang ginagawa ng programang ito. Na Nakuha ko ang lahat Tingnan ang mga komento mula sa mga ito ngunit ang lahat ng ng source code sa CS50 website ay may mga komento kung ikaw nais na basahin sa pamamagitan ng ito muli sa ibang pagkakataon. At gawin ang isang pares ipaalam ng kaliwanagan ng isip sumusuri dito. Kaya sa tuktok ng kodigong ito, mayroon kaming isama CS50.h. Ano ang ginagawa nito? Bakit eto? Sa mga tuntunin ng makatwirang karaniwang tao. Ano ang ginagawa nito? Oo. Madla: Kaya na gumagana GetInt function. David J. MALAN: Kaya na gumagana ang GetInt function. Dahil sa loob ng mga ito file, CS50.h, na kami makita bago mahaba sa tuntunin ng source code nito, ay may isang bungkos ng mga function declared-- GetInt, GetString, at ng grupo ng others-- at maliban kung ang tunay na kami ay may na Isama line, ang tagatala Clang ay hindi pagpunta upang malaman na ito ay umiiral na. At parehong napupunta para sa line dalawang kung saan int ay tinukoy printf, na kung saan ay isang function panatilihin namin ang paggamit pa ng kaunti. Ngayon, apat na linya ay tila isang maliit funky dahil sa ito ay lamang ng isang one liner. Ito ay nakuha ng isang tuldok-kuwit, walang kulot braces, walang code sa loob ng mga ito. Ngunit kung ano ang ginawa ang tawag namin ang bagay na ito sa linggo nakaraan? Oo. Kaya ang isang prototype. At bakit kami ay may isang prototype na tila upang maging isang maliit na maulit karaniwang dahil kami ay karaniwang makita muli ang pag-andar mamaya sa file, i-right? Kaya bakit have-- namin ikaw lamang scratching iyong ulo ngunit Kukunin ko ito. Oo. Madla: [hindi marinig] function na pagkatapos ng pangunahing. David J. MALAN: Eksakto. Kaya na alam mo ang tagatala ay tuluyang tukuyin o ipatupad na function na pagkatapos ng main, siguro. Kaya Clang at pinaka compiler ay uri ng pipi at ang mga ito lamang ang nakakaalam kung ano ang iyong sabihin sa kanila. At kung gusto mong gamitin isang function na tinatawag na palatandaan, ikaw ay mas mahusay na turuan ang mga compiler na ito ay umiiral nang maaga. Ngayon, main mismo, kahit kahit na ito ay isang bungkos ng mga linya, ay medyo pamilyar sana sa ngayon. Ito ay nakuha ng isang gawin habang loop ang layunin sa buhay dito ay tila upang makakuha ng isang positive integer mula sa user. At patuloy lang pestering kanya o kanyang hanggang tumulong sila. Pagkatapos ay sa 16 na linya mayroon akong isang nakawiwiling call. IntAnswer. Alin sa mga nasa kaliwa nagbibigay sa akin ng side ng isang int na maaaring store-- tinatawag Answer-- na kung saan ay pagpunta sa tindahan, tila, ang return halaga ng palatandaan. Kaya na palatandaan ay lamang ng isang arbitrary ngunit makabuluhang pangalan na ko na ibinigay sa isang function ang layunin sa buhay ay gumawa ng isa argument-- kami ay tumawag ito N sa case-- at upang kumuha lamang ang kabuuan ng mga numero na plus bawat positibong numero na mas maliit kaysa sa mga ito. Kaya kung pumasa ako sa number 2 sa palatandaan, gusto kong magdagdag ng 2 plus 1 plus 0-- hindi 0-- sa gayon ay nagbibigay sa akin ng 3. Kung pumasa ako sa 3 na palatandaan, gusto kong magkaroon ng 3 plus 2 plus 1, na kung saan ay nagbibigay sa akin 6. At iba pa. Kaya ito lamang ang nagdadagdag up ang lahat ng mga numero ng mas mababa sa o katumbas ng mga ito. Ngayon, pababa dito ako lamang ang pagpunta upang i-print out ang sagot. Kaya bilang isang mabilis katinuan check, sabihin gumawa ng palatandaan 0-- dot slash palatandaan 0-- at hayaan mo akong i-type sa 2. At sa katunayan ko makakuha ng 3. Hayaan akong i-type sa 3. Sa katunayan ako makakuha ng 6. At kung maaari gawin ang matematika mabilis sa kahit sino, kung gagawin ko 50 ano ako pagpunta makuha? Madla: [hindi marinig]. David J. MALAN: Well, hindi. Ngunit 1275 na kung saan ay malapit sa katangian. Kaya ito ay ang resulta ng paggawa 50 plus 49 plus 48 plus 47 plus 46 lahat ng mga paraan pababa sa 1. Kaya na ang lahat na palatandaan ay. Ngunit sabihin makita kung paano namin nai ipinatupad ito ngayon. Kaya down na dito ay ang function ng kanyang sarili. At ito ay hindi mukhang upang magkaroon ng anumang gawin sa recursion pa. Sa katunayan, kami ay gumagamit ng isang lumang pamamaraan paaralan. Ako Sinisimulan sum isang variable na tinatawag sa zero, at pagkatapos ay mayroon akong isang foreloop dito, at ako deklarasyon ng isang int na tinatawag na Ako, ang pagtatakda ito katumbas ng 1-- bagaman maaari itinakda ko ito katumbas ng zero, ngunit dahil ako paggawa karagdagan, na nagmamalasakit kung ito ay zero o isa. Ito ay pagpunta sa ay walang epekto. Kaya ako iterating habang ako'y ay mas mababa sa o katumbas ng m, na kung saan ay ang argument na ay lumampas na sa. At pagkatapos ay ako lamang panatilihin incrementing I. At pananaw ng loop sa lahat ako ng paggawa ay ginagawa sum plus ay katumbas I. At na sinadya. Hindi ko nais na gawin, sa ganitong kaso, tulad ng kabuuan plus plus. Gusto ko na talagang si sa kasalukuyang halaga ng ko na mapigil ang pagkuha ng mas malaki at mas malaki at mas malaki sa pagpapatakbo tally. At pagkatapos ay ako babalik sum. At kaya ang makakakuha ng sagot ang halaga sum. At pagkatapos ay ako i-print ito. Kaya mayroong isang pagkakataon dito, bagaman, sa uri ng gawing simple ang code na ito conceptually at ang uri ng suntok ang isa ay isip sa mga tuntunin ng kababaang-kahit na ito tumatagal ng isang habang upang maipagsama-sama ng pahalagahan kung bakit ito ay makapangyarihan sa mga maliit na mga halimbawa. Narito ang palatandaan one-- kaya ang ikalawang bersyon ng code na ito. Lahat ng bagay up top ay kapareho kaya nalalapat na parehong kuwento tulad ng dati. Ngunit tingnan natin ang ngayon hayaan pagpapatupad ng mga palatandaan na Na whittled ko down na lamang ang mga ito lines-- apat na linya ng code, tunay, kasama ang ilang mga kulot braces and white space. Ngunit kung ano ang aking ginagawa? Kung m ay mas mababa sa o katumbas ng zero, kailangan ko na ng uri ng hawakan na sobrang simple na kaso. At kung ang mga kamay mo sa akin zero o anumang bagay negatibong kung saan ay lamang kakaiba, Lamang ako ng pagpunta sa nagkataon ngunit babalik zero tuloy-tuloy. Hindi ko gusto ang bagay na ito sa kumuha sa ilang mga kakatwang walang hanggan loop dahil sa isang negatibong halaga. Kaya ko sinasabi lang, kung bigyan mo ako zero o mas mababa, ako bumabalik zero. Ngunit iyon lamang ang mabuti dahil na na nag-iisang pahina ng direktoryo ng telepono na natitira. Ako masakit off isang napaka-tukoy na problema at hindi pagtawag ng isang bagay recursively. Ngunit sa 31 na linya, kung ano ako mukhang ginagawa? Ang mga panaklong ay pagsunod lamang mga bagay-bagay, sana, ang isang maliit na mas malinaw. Ngunit ang lahat ng ako ng paggawa ay Ako bumabalik M-- anuman kamay mo me-- plus ang halaga ng M-- Paumanhin, plus ang halaga ng palatandaan ng m minus 1. Kaya kung ano ang ibig sabihin nito? Kung ako magbibigay sa iyo ang bilang 3 bilang input, ang sagot na gusto ko upang makakuha ng ganap na ay 6 dahil 3 plus 2 plus 1 ay nagbibigay sa akin 6. Ngunit paano tingin ko tungkol sa kung paano ang code na ito ay tumatakbo? Ang unang pagkakataon na ang tawag ko na palatandaan at pumasa ako sa ang halaga 3, na tulad ng sinasabi sa isang piraso ng papel, narito ang halaga 3 at ako ay lumipas na ito bilang palatandaan. 3 ay malinaw na hindi mas mababa sa 0 upang KUNG kalagayan ay hindi akma. Iba Pa Ang ginagawa nito. Kaya kung ano ang gagawin ko? Gusto kong bumalik m, na kung saan ay 3, kasama na palatandaan ng m minus 1. Kaya hayaan mo akong subaybayan ang mga ito. Pupunta ako upang ilagay ito piraso ng papel down. At kung ano ang halaga, upang maging malinaw, ako ay pagpunta sa pumasa sa na palatandaan sa puntong ito sa kuwento? Anong numero? 2, i-right? 3 minus 1 ay 2. Kaya kailangan ko lang ng kaunti piraso ng papel dito. Kaya ngayon na palatandaan ay nakakakuha ng tinatawag muli. At kusa ko na ilagay down na ito dahil sa ito ay uri ng tulad ng pag-pause na bersyon ng kuwento dahil ngayon ako nakatutok sa signal ng m minus 1. Kaya m ay 3, m minus 1 ay 2. Kaya dito ay 2 na ako ng lumipas. 2 ay hindi malinaw naman mas mababa sa 0 kaya kasong iyon ay hindi akma. Iba Pa bumalik ako m, na kung saan ay ito bagay, kasama na palatandaan ng kung ano ang halaga? Kaya kung na palatandaan ng 1-- dahil m ay ngayon 2 kaya 2 minus 1 ay 1. Kaya ngayon ko na lang ay ang halaga 1. Ako makapasa lamang ang bilang 1 sa function sigma-- o ang aking sarili here-- kaya 1 ay malinaw naman hindi mas mababa sa zero, hindi pa rin mag-aplay. Iba Pa return 1 plus na palatandaan ng kung ano? 0. Kaya hayaan tandaan ako na lang. Kukunin ko bumalik sa na mamaya. Ngayon ako pagpunta sa sige at itala down ang numero ng 0 dahil na aking argumento o parameter. Ako lumipas ang numero ng 0 at sa wakas ay ang proseso na ito na lamang ang paulit-ulit sa aking sarili ad nauseum ay titigil dahil kung ano huwag agad kong gawin sa sandaling makita ko ito 0? Bumalik ako zero. Kaya ngayon ay mayroon mong i-rewind ang kuwento. Kung pupunta ako ngayon pabalik sa oras, kung ano ang pinakahuling bagay Ginawa ko kung kayo ay literal nagre-rewind ang video? Pupunta ako upang kunin ang pinakahuling 1 at na nagbibigay sa akin 1 plus 0 ay 1. Kung patuloy ko nagre-rewind ang kuwento, na pagpunta upang bigyan ako 2 plus na ito na tumatakbo na halaga, na kung saan ay 1. Kaya na 3. At pagkatapos ay ako pagpunta sa panatilihin rewinding. Nang una kong ilagay down na ang bilang 3-- kaya 3 plus 3 ay nagbibigay sa akin 6. At ngayon, kung nag-rewound ang video hanggang sa puntong ito, ito ay ang tunay unang tanong tanong ko. Kapag nakapasa 3, kung ano ang palatandaan ng 3? Ito ay sa katunayan 6, ang kabuuan ng ang lahat ng mga piraso ng papel. Kaya kung na tumatagal ng ilang sandali upang wrap ang iyong isip sa paligid, na fine. Ngunit isaalang-alang ito ay isang little-- ito ay napaka sinadya na isinalansan ko ang mga numerong ito sa tuktok ng bawat isa. Ito ay uri ng tulad ng pagkakaroon ng na memorya ng isang talaan sa oras, tulad ng isang scrubber sa isang video, na maaari kong katunayan rewind in. At kami ay pagpunta upang bumalik sa na talinghaga sa loob lamang ng ilang sandali. Ngunit una, ito ay lumiliko out na mayroong isang pulutong ng mga geeks at nakakatawa mga tao, Hulaan ko, sa Google. Gusto isang tao na ang tunay mabuti sa Googling isip pagdating up para sa isang sandali lang at tumulong ako sa paghahanap para sa isang bagay? Very, very low key. May isang tao na hindi kailanman umabot sa harap, marahil. SIGE. Oo? Sige na. Halika sa down. Ano ang pangalan mo? Sam: Sam. David J. MALAN: Sam, dumating sa pababa. Ito ang Kapareho. Masaya akong makilala kayo. Hey. Pumunta ka rito. Kaya lahat ng kailangan ko sa iyo na gawin, kung maaari mong, Sam, narito ang Google. Maaari kang maghanap para sa kataga ng recursion? Huwag sayangin. At ngayon let's-- oo. OK I-click na iyon. Mas mahusay na i-click na iyon. Ahh, kumuha ito. Hindi? SIGE. Kaya sabihin gawin ang isang pares ng iba. Hindi masyado kaugnay academically dito, ngunit mayroon kang ba naghanap sa Google para sa anagram? Sam: Hindi. David J. MALAN: OK. Maghanap ng mga anagram halip ng recursion. Paano ang tungkol sa nakatagilid. Ikaw ba hinanap nakatagilid? Ngayon, ang isang ito ay isang maliit na mahirap tignan ngunit sana everything's-- OK. Ito ay lamang sa iyo at sa akin tinatangkilik ito. SIGE. Kaya sa wakas, ito one's-- ito ay isang maliit nakatagilid. Ngayon gawin ang isang bariles roll. Magagandang. Lahat tama. Big salamat sa Sam. Ito na. Salamat. Kaya kung ano ang nangyayari sa lahat ng mga uto mga halimbawa? Kaya talaga, sa ilalim ng hood ng Google milyon-milyong mga linya ng code wari ay ilang uto KUNG kondisyon na ito ay mahalagang paglagay ng tsek kung ang user ay may nag-type sa pariralang ito, gawin ang isang bagay na marahil kinuha isang nontrivial halaga ng oras upang ipatupad lamang upang maging nakakaaliw sa ganitong paraan. Ngunit iyon lamang ang lahat ng umaasa lang pababa sa ilalim ng hood. Ngunit, siyempre, recursion ay higit pa sa mga geekier Halimbawa kabilang sa mga espesyal na mga trick. At tiyak na may iba diyan pati na marahil kami ay may hindi kahit na Natuklasan pa lamang. Kaya tingnan, o isaalang-alang ngayon ang mga sumusunod na programa, at tiyak na kukunin sa anumang ng mga ito sa iyong paraan out. Pupunta ako sa sige at magbukas ng isang programa na pagpunta sa subukan upang magpalitan ng dalawang mga halaga. Ngunit bago kami pumunta doon, ni gawin ito ipaalam. Puwede naming makakuha ng isa pa volunteer, sa tingin ko? Gusto mo bang mag-volunteer? Hindi? Lumapit sa up. Lumapit sa up. Lahat tama. Kaya ang iyong pangalan ay kung ano? LAUREN: Lauren. David J. MALAN: Lauren. Umakyat, Lauren. Kaya Lauren ay ang pagiging hinamon dito ang mga sumusunod. Masaya akong makilala kayo. Kaya Lauren dito ay sa harap ng kanyang dalawang walang laman tasa. At kami ay may ilang mga orange juice at ilang gatas at kami ay pagpunta upang pumunta magpatuloy at gawin ang mga sumusunod. Kami ay pagpunta sa punan ito. Ilang onsa ng gatas sa paglipas dito at sabihin punan ang isang maliit na orange juice sa paglipas dito. At sa harap ng lahat ng mga miyembro ng madla, magpalitan ng dalawang mga halaga ng mga tasa. Ilagay ang orange juice sa gatas cup at ang gatas sa orange juice cup. Paano mo gawin ito kung ikaw ay sa tahanan at nagkaroon ng access sa iba pang mga supplies? LAUREN: Ilagay ito sa isa pang tasa. David J. MALAN: OK. Kaya sabihin ay may isang pansamantalang variable, kung kami ay. At magpatuloy ngayon at ipatupad ang parehong proseso ng pagpapalitan. So, mabuti. Naglaan na kami OJ sa pansamantalang variable, gatas sa OJ variable, at ngayon ang pansamantalang variable sa gatas variable. SIGE. Kaya napaka-magaling sa ngayon. Kaya ito ay lumiliko out-- hold na naisip para sa isang sandali lamang. Dito, sa geek lang ito ng kaunti, ito ay ang kaukulang C code na ipinatupad lamang namin. Nagkaroon kami ng dalawang input, isang at b, na parehong na kung saan kami lang sabihin para sa pagiging simple ay int ni. At mapansin dito, kung gusto kong i-swap ang mga halaga ng dalawang variable, ang isang at b, sa katunayan kailangan namin ng isang ahente, isang pansamantalang variable, isang pansamantalang tasa, sa kung saan ang ibuhos isa sa mga halaga kaya na kami ay may isang placeholder para sa mga ito. Ngunit pagkatapos ay ang code ay eksaktong bilang Lauren dito ipinatupad. Ngayon, upang makakuha lamang ng isang maliit crazier, lumiliko out na maaari mong gawin ito nang walang isang pansamantalang variable. Upang gawin ito nang maayos, kahit na, kami ay pagpunta sa may sa impostor na may ilang mga kimika. Mayroon kaming ilang dagdag na mga tasa dito. Kaya ang pinakamalapit na bagay na ganito ang hitsura tulad perhaps-- gatas at tubig o gatas at OJ-- ay mayroon kaming ilang mga tubig, kaya kailangan namin punan ang isang ito up may ilang ounces ng malinaw na tubig. Iyon ay marahil masyadong marami. Oo. Iyan ay tiyak na masyadong marami. I-hold sa isang segundo. At ngayon kami ay may langis, na kung saan, bilang ko pagpapabalik mula sa gitna ng klase kimika ng paaralan, inaasahan namin na ito ay hindi ihalo sa tubig. Ngunit ito uri ng uri ng ganito ang hitsura ng gatas at OJ. Kaya ngayon, nang hindi gumagamit isang pansamantalang variable, maaari mong ipagpalit ang mga dalawang mga halaga? Kaya kuwadro napupunta sa mga tasa ng tubig, tubig napupunta sa tasa ng langis. LAUREN: Walang ibang mga tasa? David J. MALAN: Walang iba pang tasa. At hindi ko na hindi talaga nasubukan na ito bago sa taong ito kaya hindi ko alam kung kalooban ito talagang gumagana chemically. Iyon ay hindi dapat na mangyari. Ay ito gumagana? Lahat tama. Kaya pagkakahiwalay? Good. Ngayon namin nakuha upang makuha ang tubig sa iba pang mga cup. Mas matalinong kimika concentrators dati malamang na gawin ito ng mas mahusay kaysa sa akin. LAUREN: Ang tubig ay sa ibaba. David J. MALAN: Ang water-- na kung ano ang key sa huling beses na ginawa namin ito. Kailangan mong gawin ito sa tamang pagkakasunod-sunod. Oo. That's-- OK. Kaya ngayon kami ay may dalawang tasa ng langis. SIGE. Iyon ang OK. Ngunit chemically kung ito ay nagtrabaho sa I-- LAUREN: Ito ay tubig. David J. MALAN: Iyan ay halos lahat ng tubig. Lahat tama. Ngunit iyon lamang ang parehong tasa tulad ng dati pa rin. Kaya ibuhos it-- subukan ito doon. SIGE. Ito ay isang mahusay na paggamit ng oras ng klase ngayon. SIGE. Kaya we-- ngayon nice. Medyo. Lahat tama. Kaya napakabuti. Salamat sa Lauren. Tunay na magaling. Kaya lang sa pumutok ang iyong isip, at ito ay marahil ang isang bagay upang i-play sa kung gusto mo sa CS50 ID, maaari mong, sa katunayan, magpalitan ng dalawang variable walang gamit ang isang pansamantalang integer. At ito ay ang kaukulang C code. At kung ikaw pagpapabalik mula sa huling Miyerkules, ipinakilala namin, kung sa madaling sabi, ng ilang mga bagong operator sa C. At ginagawa kahit sino pagpapabalik kung ano ang maliit na carrot simbolo ay, na ang maliit na tatsulok simbolo mula sa keyboard ay kumakatawan? Ano operator bitwise? Madla: EXOR. David J. MALAN: EXOR. Exclusive Or. Kaya kung nais mong, katuwaan lang sa sa bahay, upang magbigay ng isang at b dalawang arbitrary mga halaga tulad ng anumang eight-- at ako ay pumili ng isang walong bit na halaga. Kung gagawin mo ito sa 32 bits, makikita mo ang mabilis na makakuha ng nababato. Ngunit bigyan lamang ng isang walong bit halaga na kahit na ano, isa o dalawa, at bigyan b isang katulad na halaga. At pagkatapos ay ang paggamit ng mga kahulugan ng XOR mula sa huling Miyerkules, mag-apply na unti-unti, ang bawat isa sa mga walong bits sa bawat isa ng isang at b, at pagkatapos ay gawin ito nang eksakto per code na ito. At ito ay hindi tama kung ano na makikita mo dito sa screen. Ito ay sa katunayan na bumabagsak sa tatlong XOR operations at sa anumang paraan magically isang at b ay palitan ng posisyon nang hindi nawawala ang anumang impormasyon. Kaya ang langis at tubig bilis ng kamay ay ang pinakamalapit real pagkakatawang-tao ng mundo Kaya kong isipin na gayahin iyon. Ngunit ito ay tiyak na mas madaling gumamit ng isang pansamantalang variable, tulad ng sa kasong ito dito. At ito ay masyadong sabihin ng pagkakataon, masyadong, ang ganitong uri ng mga micro-optimize, bilang isang computer scientist nais sabihin, habang uri ng masaya upang magmayabang tungkol sa kung paano mo ito nang walang tulad ng pagpapalit sa isang dagdag na variable, ito ay hindi lahat na nakapanghihimok. Dahil upang i-save 32 bits, tulad ng sa kaso ng isang aktwal na int, ay hindi lahat na nag-uudyok sa isang sistema na kung saan ang maaaring gumagamit ka ng sampu-sampung megabytes o kahit na higit pa tulad memory na mga araw. At sa katunayan, kapag kami makakuha ng sa isang mas huling hanay ng problema at ipatupad mo ang spell checker at kayo hinamon na gawin ito na may ito bilang maliit na RAM at bilang maliit oras hangga't maaari sa computer-- ka pa rin may isang linggo na ipatupad it-- makikita mo have-- makikita mo hinamon upang i-minimize ang mga resources. At iyan ay talagang lamang okasyon sa semestre kung saan kayo ay hinihikayat na mag-ahit off kahit na ang pinakamasasarap na pagganap Nagkakahalaga sa kabilang banda. Kaya what-- paano natin makita ang mga ito sa aktwal na code? Hayaan akong magpatuloy ngayon at buksan up ng isang halimbawa na sadyang ay tinatawag na Walang Swap dahil ito ay hindi sa katunayan swap ang mga variable bilang iyong aktwal na maaaring asahan. Kaya sabihin tumagal ng isang pagtingin. Narito ang isang programa na ay walang CS50 library nangyayari, standard lang ako / O. Ngayon kami ay may isang tularan para magpalitan up top na lang ang ibig sabihin nito ay nakuha na tinukoy sa ibang pagkakataon. At narito ang main. Nagkataon ako itinalaga x at y, ayon sa pagkakabanggit, ang isa sa mga halaga at dalawang dahil lang sa ang mga ito ay maliit at madaling mag-isip tungkol sa. At pagkatapos ay ako ay may lamang ng grupo ng printfs kung saan mayroon akong isang katinuan check. x ay 1 at y ay 2 ay baka kung ano ang mga printfs sasabihin. Kaya walang magic kaya sa ngayon. Pagkatapos ako pagpunta upang i-claim sa i-print ang def, pagpapalit dot dot dot. Pupunta ako sa tawagan ang swap function, pagpasa sa x at y. At sabihin ipalagay para sa ngayon na ipaalam swap ay ipinatupad eksakto dahil ito ay isang sandali ang nakalipas na may isang pansamantalang variable. At kaya inaangkin ko matapang, swapped. x na ngayon ang mga ito at y ay ngayon na. Ngunit ang mga file, siyempre, ay tinatawag na No Swap. Kaya sabihin aktwal na makita kung ano ang mangyayari. Kung ako sumulat ng libro no swap at pagkatapos ay gawin ./noswap, x ay 1, y ay 2. Pagpapalitan swapped. x ay 1, y ay 2. Kaya ito aktwal na tila na flawed kahit bagaman swap-- sabihin mag-scroll pababa now-- eksakto ay ipinatupad ng bawat ang code ko iminungkahi ng ilang sandali ang nakalipas. Kaya kami ay hindi pagpunta upang makakuha ng magarbong sa XOR bagay-bagay para sa ngayon. Ito, masyadong, dapat trabaho lang tulad ng may gatas at OJ, ngunit ito ay hindi tila sa maaari gumawa. Kaya sabihin gawin ito muli. Siguro ako lamang ay hindi ito tumatakbo karapatan. Tumakbo muli Walang Swap Kaya ipaalam. Siguro I-- no. Kaya lamang ito ay hindi gumagana. Kaya sabihin gawin ang isang maliit katinuan suriin. Hayaan akong magpatuloy dito sa Swap at idagdag lamang, maghintay ng isang minuto, isang ay% i / n at sabihin plug-in sa halaga ng isang. Dahil gusto ko talagang upang makita kung ano ang nangyayari sa. At sa katunayan, ito ay isang debugging pamamaraan na maaaring gumagamit ka sa oras ng opisina o sa naka-bahay, maihahalintulad sa mga unang kalahati ng Dan Video Armendariz sa PSET3 kung saan ipinakilala namin print def bilang isang inirekumendang pamamaraan, ng hindi bababa sa para sa mga simpleng mga kaso. Hayaan akong magpatuloy at patakbuhin ang gumawa muling swap, ./noswap. Kawili-wili. Kaya kung ano ang paunawa ay tila na maging totoo. x ay 1, y ay 2, ngunit isang ay 2 kapag b ay 1. Kaya ang mga dalawang paanuman got swapped ngunit x at y ay hindi nagsisimula swapped. Kaya upang maging malinaw, kung ano ang nangyayari ay, hanggang dito ko x at y at ang mga iyon ay mga variable lokal sa saklaw ng main, ako pagpasa sa x at y magpalit. Ngayon, swap, bilang isang hiwalay na function, ay atubili na tumawag sa mga argumento nito o ang kanyang mga parameter anumang bagay na ito ay nais. Foo o bar o xoyo isa o b. Lamang upang gumawa ng malinaw na ang mga ito hindi katulad sa x at y per se, Sinabi ko na ang isang at b. Ngunit kami ay maaaring tumawag sa kanila ang anumang bagay na gusto namin. At kaya mukhang swap ay lumipas x-- AKA a-- at ito ay na dumaan y-- AKA b. Kahit paano ang mga tatlong linya ay ng pagpapalit sa mga halaga iyon eksakto bilang Lauren ang ginawa na may gatas at OJ. Ngunit kapag i-print out namin ang mga halaga, at isang b sa katunayan ay magpalitan ngunit x at y walang pagbabago sa mga ito. Alalahanin na x at y ay up dito. Kaya maaari naming makita ito sa pamamagitan ng isa pang pamamaraan pati na rin. At ito masyadong ay isang pamamaraan naka-embed sa hanay ng problema tatlo. Sabihin sige at gawin ito sa CS50 ID kung hindi mo pa nagagawa. Sa kanang bahagi namin magkaroon ng ganitong tab Debugger. At kung bubuksan mo ito up, mayroong ilang arcane impormasyon na itinapon sa una sa iyo. Ngunit sabihin mang-ulol na ito bukod real mabilis ipaalam. Kaya isa, makikita mo lokal na variable. Ino-out na bumuo sa CS50 IDE, at isang pulutong ng mga kapaligiran programming pa sa pangkalahatan, ay isang debugger. Ang isang tool na nagbibigay-daan sa iyo upang makita ang biswal kung ano ang nangyayari sa loob ng inyong programa nang hindi sa resort sa pagdagdag printfs at pag-ipon at tumatakbo at pagdaragdag ng printf at ipon at pagtakbo, kung saan ay mayroon, sa mga oras ng opisina o sa bahay, ay marahil nakakakuha ng medyo nakakapagod. Kaya dito, sa sandali lamang, hindi namin pagpunta sa makita sa real time ang mga halaga ng aming mga lokal na variable. Kami rin ay pagpunta sa ma-set ano ang tinatawag na breakpoints saan mga pagkakataon sa aking mga programa upang i-pause pagpapatupad sa isang tiyak na linya ng code na ako ng kakaiba tungkol sa. Right? Ang mga programang ito tatakbo sa isang ikalawang hati. Ito ay uri ng maganda para sa amin mas mabagal mga kawani na tao para ma-pause, maglaan ng ilang sandali, tingnan ang kung ano ang nangyayari sa paligid sa isang tiyak na linya ng code nang walang pag-aararo program sa pamamagitan ng ito at pagtatapos ng lahat. Kaya ang isang breakpoints pagpunta sa nagpapahintulot sa amin upang masira at i-pause sa tiyak na punto. Call stack ay isang magarbong paraan ng sinasabi kung ano ang function ay kasalukuyang natawag sa sandaling ito. Main ay laging unang tinatawag. Ngunit kung Main tawag sa isang function na tinatawag Swap, aktwal na kami ay pagpunta upang makita ito tower ng mga function na ay tinatawag sa reverse magkakasunod. Kaya tingnan natin iyon. Pupunta ako upang mag-zoom out. Pupunta ako sa bumalik sa aking code. At dahil gusto ko lang na pilosopo dito, Pupunta ako sa sige, at i-click ang lamang sa kaliwa ng limang linya. At iyon ay lumilikha ng isang pulang tuldok. At mapansin sa kanang bahagi ng kamay na nakakaalam ng debugger, hey, Lang ang sinabi ko ng isang breakpoint sa noswap.c line limang, partikular sa ganitong linya ng code. Kaya alam ang debugger na ako Hiniling mo na ang susunod na oras Tumakbo ang aking mga ito program pause execution doon sa halip na lamang tumatakbo ang buong bagay napakabilis na. Kaya ngayon ako pagpunta sa i-click ang Debug button sa pinakatuktok ng IDE at na ang pagpunta sa gawin ang mga sumusunod. Ito ay pagpunta upang buksan ang isang una medyo nakakatakot na naghahanap ng pangalawang terminal window-- remote debugging mula host tulad at such-- at kami ay bumalik sa kung ano ang nangangahulugan na ang lahat na bago ang haba. Ngunit kung ano ang mahalaga para sa ngayon ay na na pulang tuldok ay hit, ang debugger ay sadyang Naka-pause ang execution-- hindi sa linya na per se ngunit sa unang linya ng aktwal na code sa na function. At iyon ang dahilan kung bakit pitong linya ay ngayon naka-highlight sa dilaw. At ngayon hayaan ang isang pagtingin sa kanang bahagi. Tila, sa pamamagitan ng default, mabuti sapat, x ay may kung ano ang halaga? 0. At y may kung ano ang halaga? Zero. At iyon na inaasahan sa kamalayan na x at y-- na dilaw line-- ay Hindi pa naisakatuparan. Kaya x ay hindi dapat magkaroon ang halaga 1. Maaaring magkaroon ng anumang iba pang mga halaga, isang tinatawag na halaga ng basura. At nakuha namin sa mapalad na ito ay zero sa puntong ito, mahalagang. Kaya ngayon ay may lamang ng ilang buttons kailangan namin upang pag-aalaga tungkol sa kapag debugging sa ganitong paraan. Pansinin dito, kami ay may isang pindutan ng play. At kung i-play namin o pindutin ipagpatuloy, ito lamang pagpunta upang tumakbo sa pamamagitan ang natitirang bahagi ng programa o hanggang umabot sa ito sa isa pang breakpoint. Ngunit hindi ko na-set sa anumang iba pang breakpoints kaya lang pagpunta upang tumakbo sa pamamagitan ng dulo. Na uri ng mga pagkatalo ang layunin ng poking sa paligid. Kaya sa halip, mahalaga ko tungkol sa mga icon na ito sa kanan. At kung mag-hover ko sa ibabaw ang mga ito, tulad ng dapat mo rin, makakakita ka ng maliit na tips-- tool tips. Isa na ito ay hakbang sa ibabaw. Ngayon na ay hindi nangangahulugan na laktawan ang mga sumusunod na linya ng code. Iyon ay nangangahulugan lamang maipatupad ito at lumipat sa susunod na, lumipat sa susunod, lumipat sa susunod. Sa ibang salita, sa pamamagitan ng pindutan na, maaari ba akong maglakad sa pamamagitan ng aking code sa isang hakbang sa isang pagkakataon. Line sa pamamagitan ng linya, literal. Ngayon, sa kanan ng na iyon, may isa pa na namin makita sa sandali lamang. Ito ay ang tinatawag na Hakbang Sa icon na pagpunta sa payagan ako dive sa ibang function. Ngunit sabihin makita ito sa ilang sandali lamang. Kaya ako pagpunta sa i-click ang hakbang sa ibabaw. At ngayon paunawa, bilang nag-click ako ang pindutan na ito sa kanang-itaas, panatilihin ang iyong mga mata sa humigit-kumulang sa ilalim ng Local Variable at makita kung ano ang mangyayari sa x. x ay ngayon 1 dahil ang dilaw na linya ay naisakatuparan ngayon at nagbigay kami inilipat sa 8 linya. At sa loob lamang ng isang sandali y dapat sana ay naging 2. Ngayon, wala na ang mga kagiliw-giliw mangyayari para sa isang bit. Ang lahat ng ito ay ay printf. At mapansin, sa aking pangalawang terminal window, nakikita ko ang output ng print def. At ngayon ko bang gumawa ng isang desisyon bilang mga programmer. Maaari ko bang hakbang sa linya na ito ng code, Isinasagawa ang mga ito ngunit hindi pagkuha ng kakaiba tungkol sa kung ano ang nasa loob. O maaari ko talagang hakbang sa ito at pumunta sa loob ng Swap mismo. Kaya sabihin gawin sa huli. Hayaan akong magpatuloy at i-click ang Hindi Tumawid ngunit Hakbang Sa. Paunawa, ang lahat ng isang biglaang ang mga pagbabago window upang i-highlight ang unang linya ng code sa Swap. Iyan ay 21 linya. At ngayon, kung ano ang uri ng funky ay na, kung ikaw ay tumingin sa paglipas dito, tulad ng inaasahan, isang kuwit b ay 1 at 2, ayon sa pagkakabanggit. Bakit temp 32,767? Recalling na temp, magkano ang gusto ang walang laman na tasa ng ilang sandali ang nakalipas, ay ipinahayag dito sa 21 linya. Bakit 32,000- Ibig kong sabihin, kung bakit ito lamang ang ilang mga kakaibang halaga? Oo? Madla: Ito ay hindi nasimulan. David J. MALAN: Ito ay hindi pa nasimulan. Kaya aming mga computer na laging may pisikal na memory. Palaging Ito ay may pisikal na RAM. At may laging zero ni at isa ang doon, di ba? Dahil kami ay gumagamit ng aming mga buong araw computer, ginagamit mo ang CS50 IDE o sa mga server sa buong araw. Kaya na RAM alinman ay may ilang mga zero o ilang isa o ilang mga zero at mga. Hindi mahalaga kung o hindi ka gumagamit ng mga ito. Hindi ka na magkaroon ng blangko mga puwang kung saan mo nais bits. Ang mga ito ay alinman sa zero at mga. Kaya ito ay lumiliko out na ang temp, dahil hindi na namin pa nasimulan ito, kami ay may 32 bit mga ngunit sila ay hindi initialize sa anumang halaga na kilala. Kaya kahit na ano sila ay pinaka kamakailang ginamit for-- mga 32 bits-- lang namin nakikita ang artifacts ng ilang nakaraang paggamit ng mga partikular na mga 32 bits. Sa sandaling nag-click ako Tumawid bagaman, phew, temp ay pagpunta upang makuha ang halaga 1. At kung ito ang gagawin ko muli, ang isang ay pagpunta sa ay bibigyan ng halaga 2 at pagkatapos ay b ay pagpunta sa ay bibigyan ng halaga 1. At kaya kung ano ang magaling na ngayon sa puntong ito sa kuwento ay na ang debugger ay nagpapakita sa akin, sobrang dahan-dahan sa aking sarili mong bilis, kung ano ang estado ng Swap ay. Ngunit paunawa sa tuktok dito, notice na ang stack ng tawag talaga ay may dalawang mga layer na ito. Ngayon ang isa na naka-highlight bilang Swap, kung sa halip-click ako sa Main, paunawa kung paano baguhin ang mga lokal na mga variable dahil maaari lamang lumukso ang mga developer paligid at pumunta sa anumang ibang saklaw. Kaya kahit na ginagawa namin ang lahat ng ito trabaho at tama ng pagpapalit ng isang at b, kung pumunta ako pabalik-balik sa pagitan Swap kung saan ang isang ay 2 at b ay 1 at Main, Matagal Pangunahing naapektuhan sa lahat? Hindi. Kaya kung ano ang takeaway dito? Well, ito lumiliko na anumang oras tumawag ka ng isang function tulad Swap, at ipasa mo ito arguments, kung ano kayo ay dumadaan sa Swap function na sa kasong ito ay isang kopya ng mga argumento. Kaya kung x at y ay bawat ayon sa pagkakabanggit 32 bits, ano Swap ay nakakakuha ay dalawang bagong lokal na variable, o mga argument, tinatawag na isang at b-- ngunit ang mga ay arbitrary names-- ngunit ang pattern ng mga zero at sa buhay sa loob ng isang at b ay may linya up upang maging katulad sa x at y ngunit ang mga ito ay hindi ang parehong bagay tulad ng x at y. Ito ay parang Main ay sa kanyang piraso ng papel ang numero 1 at 2 para sa x at y, at pagkatapos ay kapag ito kamay na piraso ng papel upang magpalitan, Swap masyadong mabilis ang makakakuha kanyang sariling panulat, magsusulat down 1 at 2 sa sarili nitong sheet ng papel, kamay-back ang orihinal xy sa Main at pagkatapos ay sa kanyang sariling bagay na may isang at b. At ito ay ngayon sobrang mahalaga dahil na ito ay may nontrivial implikasyon para sa aktwal na pagsusulat tamang code dahil ito ay tila hindi namin maaaring magpalitan dalawang variable. Ako ay may nakasulat na isang tamang function Swap. Ipinatupad namin ang mga ito sa Lauren bilang isang tamang pag-andar swap sa katotohanan, ngunit tila wala sa mga iyon mga bagay na kung ikaw ay hindi na talaga permanente magpalitan ng dalawang mga halaga. Kaya kailangan namin ng isa pang paraan sa aktwal na makakuha sa ito, at kailangan namin upang ma- aktwal na malutas ang problemang ito. At ito ay lumiliko out-- at kami ay bumalik sa mga ito partikular na larawan bago long-- ito ay isang paraan na maaari kang maglabas ng memory ng iyong computer. Ito ay isang parihaba lamang. Maaari mo itong maglabas ng anumang bilang ng mga paraan ngunit ito ay maginhawa upang gumuhit ng mga ito bilang isang rektanggulo para sa mga sumusunod na dahilan. Kami ay pagpunta sa simulan ngayon at sa hinaharap pakikipag-usap tungkol sa tinatawag na stack. At ang mga stack ay isang tipak lamang ng RAM-- isang tipak ng na memorya na ang mga function ng access na kapag sila ay tinatawag na. At kaya ito ay lumiliko out na sa pinakailalim ng stack ay kung saan ang lahat ng lokal na mga variable Main ni at org C at org V at ang lahat ng mga bagay-bagay na ay pagpunta sa pumunta sa pamamagitan ng default. At kung Main tawag sa ibang mga pag-andar tulad ng Swap, well, Swap ay pagpunta upang makakuha ng isa pang layer ng memory up sa itaas nito. At kaya lang na magbigay sa iyo ng isang mabilis na mabilis larawan ng mga ito, kung pumunta ako sa ibabaw here-- at ipaalam sa akin mirror na ito sa overhead bilang well-- kung ano talaga ang mayroon ako, kung mahalaga lamang namin ang tungkol sa mga ibaba ng larawan na ito sa ngayon, ay na kapag nagpatakbo ako ng isang programa at Main makakakuha ng tinatawag na, Main ay bibigyan ng isang tipak ng RAM sa aking computer na ito ay sa ibaba ng ito sa tinatawag na stack. At ako pagpunta sa gumuhit ito kusa bilang isang parisukat. Kaya ito ay tulad ng 32 bits o apat na bytes. At kung ito pangunahing function ay may isang variable na tinatawag na x na may isang halaga ng 1 at ito ay isang variable na tinatawag na y sa mga halaga ng 2, na ang tulad ng pagkuha ito magtilad ng memorya na Pangunahing ito ay ibinigay sa pamamagitan ng mga operating system at naghahati up ito sa gayon ay dito napupunta ang unang lokal na variable, ang ikalawang isa dito napupunta, at na ang mga ito. Kapag Main tawag Swap, Swap makakakuha ng kanyang sariling slice ng memory na kami gumuhit tulad nito mula sa operating system, at ito ay pagpunta sa may nito sariling lokal na mga variable na batay sa aming mga pagpapatupad ng mas maaga sa mga lokal na mga variable ng at b na sa una makuha ang mga halaga ng 1 at 2. Ngunit pagkatapos, sa lalong madaling ang Swap code executes, at Lauren talagang swaps ang OJ at gatas, kung ano ang nangyayari? Well, ang 2 ay nagiging isang 1, ito 1 ay nagiging isang 2, at, sa pamamagitan ng ang paraan, mayroong isang temp variable na pagiging ginagamit na buong panahon na ang huli umaalis. Ngunit ito ay hindi mahalaga kung magkano ang trabaho mo sa linya na ito of-- sa puwang na ito memory, x at y ay ganap na hindi nagalaw. Kaya kailangan namin ng ilang mga paraan ng pagbibigay Pagpalitin at pag-andar tulad ng ito lihim na pag-access, kung ikaw ay, upang function like-- sa memory tulad ng x at y. Kaya sabihin kumuha ng isang pagtingin sa isang halimbawa na tumutulong sa sa amin makita kung ano mismo ang nangyaring nangyayari ito sa buong panahon. Pupunta ako sa sige at buksan up Ihambing Zero. At ako pagpunta upang isara aming debugger, pupuntahan ko upang isara ang nakakatakot na naghahanap ng mensahe ang lang sabi, maghintay ng isang minuto, ikaw ay nasa gitna ng pag-debug. Pupunta ako upang itago ang tab na ito dito lamang na bumalik sa pagiging simple. Kaya huwag mag-alala kung GDB ay pinatay. Iyon ay nangangahulugan lamang na ang programa ay tinanggal umalis, kusa sa kasong ito, gawa ko. At ngayon Ihambing Ginagawa ito sa Zero. Ako gamit ang CS50 library sa standard I / O. Mayroon akong isang pangunahing pag-andar na unang sabi, sabihin ng isang bagay, at makakakuha ng isang string. Pagkatapos ay sinasabi nito muli at makakakuha ng isa pang string. At mapansin na ito ng dalawang mga string ay tinatawag na s at t, ayon sa pagkakabanggit. At ngayon sa programang ito, Ihambing Zero, kanyang layunin sa buhay, ito ay dapat na sabihin sa akin, hindi ko type ang mga parehong bagay? At kaya ako balik sa isang linggo. Gumagamit ako ng aking pantay pantay na operator kung saan ay ang kalidad ng operator. Hindi ang assignment operator, ang pagkakapantay-pantay operator. Ako ng paghahambing lamang s at t. Kaya sabihin aktwal na magpatuloy at gawin ito. At ako pagpunta sa sige at gumawa ng Ihambing Zero. Pupunta ako sa gawin ./comparezero. At ako pagpunta upang pumunta maaga at sabihin ang isang bagay like, gagawin ni mom in lowercase ipaalam at kung paano tungkol sa ina sa uppercase. At syempre kong i-type ang iba't ibang bagay. Lahat tama. Iyan ay na inaasahan. Tumakbo itong muli. Parehong beses gawin lowercase, lowercase. Na mukhang super magkapareho sa akin. Enter. SIGE. Siguro ito ay kakaiba dahil lang hindi ito gustuhin ang aking grammar. Kaya sabihin gawin ang isang capital MOM ipaalam, capital MOM, magkapareho. Iba't-ibang mga bagay-bagay. Kaya bakit ay na? Well, kung ano ang aktwal na pagpunta sa ilalim ng hood dito? Kaya sabihin bumalik sa paglipas ng dito para sa isang sandali lamang at isaalang-alang kung ano ang GetString ay talagang ginagawa. Kapag tumawag ka GetString, na ang isang pag-andar namin Isinulat ang ating sarili at ito sa anumang paraan ay makakakuha ng isang pagkakasunod-sunod ng mga character mula sa user. At ipagpalagay na ang unang hayaan oras na tawagan ako GetString, na nagbibigay sa akin isang tipak ng memory na ganito ang hitsura. At kung nag-type ko sa lahat ng maliit m-o-M-- at kung ano ang napupunta pagkatapos na ito? Lamang ng isang mabilis na check katinuan. Backslash zero. Alam natin na ang. At isipin na kami nag-play sa paligid na may pangalan Zamila ni at isang bungkos ng iba pang mga pangalan kapag Rob ay dito naghahanap sa kung ano ang nangyayari sa loob ng memory. Kaya na kuwento ay eksaktong kapareho. Ito ay kung ano GetString ay bumabalik sa akin. Ngayon, ang aking code sa isang sandali ang nakalipas na naka-imbak ang return halaga ng GetString sa isang variable na tinatawag s. At pagkatapos ay ang pangalawang pagkakataon na tinatawag na ito, ito na naka-imbak ang mga ito sa variable na tinatawag na t a. Kaya kung pumunta ako sa paglipas dito, kailangan ko upang gumuhit ng mga ito ng lokal variable-- at ako karaniwang pagpunta sa gumuhit ng isang string bilang just-- bibigyan namin ng tumawag ito s-- bilang isang maliit na square dito. At ngayon, somehow-- paano gumagana mom pumunta sa loob ng variable s ito? Well, kailangan namin upang bumalik sa unang prinsipyo dito. Ano ang tunay na pagbabalik GetString? Kaya ito ay lumiliko out na ang M-O-M backslash zero, at ang anumang mga numero ng ng iba pang mga string sa memory tulad ng Zamila at Rob o Andy o anumang iba, mga kurso sa aming RAM o memory computer. At ang iyong RAM ay like-- mayroon kang isang gig ng RAM, dalawang gig ng RAM, o isang bilyon o dalawang bilyong bytes, o marahil kahit na higit pa na mga araw. Kaya Ipagpalagay nating, para sa mga layunin sa ngayon hayaan, na ito ay hindi mahalaga kung paano namin bilangin ang mga ito, ngunit maaari naming bilangin ang bawat sa mga bilyon o dalawang bilyong o apat na bilyong bytes. At sabihin lang mang sabihin na ito ay ang unang kagat, pangalawang kagat, third, ika-apat na. Sadyang hindi ako gamit zero para sa araw na ito ngunit kami ay bumalik sa na. Kaya sa ibang salita, kung ito ay ang unang pagkakataon ako gamit ang program, Lang ako nakakakuha ng masuwerteng at ang unang kagat ay sa isang lokasyon at pagkatapos ng dalawang pagkatapos ng tatlong sa apat. At kung ako malinis pagguhit, number box dalawang bilyon ay magiging paraan sa paglipas dito. Kaya kung ano ang tingin mo, pagkatapos, Aktwal na nagbabalik GetString? Ito ay hindi bumabalik M-O-M backslash zero per se dahil na malinaw hindi magkasya sa box na iginuhit ko. Kaya ano pa ang maaaring GetString talaga bumabalik ang lahat ng mga linggo? Ang sagot ay sa board dito sa isang lugar. Hindi ka maaaring magkasya M-O-M backslash zero, kaya kung ano ang maaaring magkaroon ng kahulugan sa halip? Kung ikaw ay nagkaroon na maging sobrang matalino, paglagay on ang tinatawag na sumbrero engineering, kung ano ang maaari mong ibalik? Ano ang hindi bababa sa halaga ng mga impormasyon maaari kang bumalik na gagawin pa rin hayaan mahanap ka M-O-M sa memory? Oo? Madla: One. David J. MALAN: One. At bakit isa? Madla: Dahil ito ay sabihin mo kung saan pupunta [hindi marinig]. David J. MALAN: Eksakto. Lamang ako pagpunta sa bumalik ang mga address ng string na aking nakuha. Ang address na ito kaso ay lokasyon isa. Kaya kung ano ang tunay na ito ay naka-imbak sa s-- at sa gayon ang bawat variable string far-- ay may lamang ang address ng na string. Samantala, kung ang tawag ko GetString sa pangalawang pagkakataon at ako type sa literal ang parehong thing-- M-O-M sa lowercase-- M-O-M at ng iba pang backslash zero, at ngayon marahil ang aking programa tumatakbo para sa ilang oras kaya marahil ito ay 10, ito ay ang lokasyon 11, ito ay 12, ito ay 13. Ang mga computer gamit ang ilan sa iba pang mga memory para sa anumang dahilan. Ano ngayon ang papunta sa aking pangalawang variable sa aking t program? 10. Mismong. At kaya kapag tinitingnan namin ang mga source code ng programang ito kung saan lang sinusubukan ko upang ihambing ang dalawang mga halaga, ay s pantay pantay sa t, kung ano ang ang malinaw na sagot ng tao? Basta walang dahil 1 ay hindi katumbas ng 10. At kaya narito ang isang pagkakataon para sa amin talagang pumunta lamang pabalik sa, muli, una prinsipyo at isipin ang tungkol sa, well, ano ang nangyayari sa ilalim ng hood? Nai-uusapan natin ang tungkol mga bit at byte at memorya, ngunit ito ay talagang kapaki-pakinabang upang maunawaan dahil kapag tumawag ka GetString, kahit na sa tingin namin ng ito ay bumabalik M-O-M o string mom o Andy o Zamila o ang gusto, technically lamang ito ay bumabalik address ng na tipak ng memory. Ngunit iyon lamang ang OK. Dahil paano ko malalaman kung saan nagtatapos ang string? Kung ako bibigyan lamang ng una? Well, ang backslash zero, di ba? Just in sa haba ng panahon maaari ko i-print out na may print def M-O-M. At sa lalong madaling nakikita ko backslash zero, Wala akong pakialam kung saan ako nagsimula, Na alam ko nang kataon lamang kung saan kailangan ko upang tapusin. At kaya ngayon ay minamarkahan ang beginning-- at hayaan mo akong gawin ito kapansin-pansing dahil tayo nagpunta sa pamamagitan ng isang pulutong ng mga problema sa makakuha ng mga dito pagsasanay wheels-- kaya ngayon simulan ang mga gulong ng pagsasanay sa darating off at ihayag namin sa least-- [Palakpakan] Iyon ay nagkakahalaga ng mabuti ang trip sa Target na ito umaga, yes? Kaya now-- mayroong, ito ay lumiliko out, walang bagay na tulad string. String ay hindi umiiral. Ito ay isang kasingkahulugan na mayroon kaming sa loob ng CS50 library. Simula ngayon, kami ay pagpunta upang simulan ang pagtawag s at t hindi string ngunit char bituin. At ang mga char star bibigyan namin ng mang-ulol hiwalay bago ang haba. Ngunit ito ay upang sabihin, na kahit na patuloy naming gamit GetString para sa ngayon, technically dapat kong maging sinasabi char star at char star. At ito ay lumiliko out kung ano na ang star ay pagpunta sa magpakilala ay isang bagay na tinatawag na isang pointer o address. At sa katunayan, isang teaser para sa kung ano ang namamalagi maaga ay ito 20 ikalawang clip mula sa aming kaibigan Nick Parlante sa Stanford sino, lubos ng ilang oras ang nakalipas, gastusin isang katotohanan na halaga ng oras, bilang pinakamahusay na maaari kong sabihin sa kanyang kusina o sa kanyang basement, paggawa claymation pagpapasok sa mundo isang character na may pangalang Binky kung kanino kami ay ipinakilala sa susunod na pagkakataon sa mga payo. Kaya dito ay isang preview ng kung ano ang darating. [Playback ng video] -Hey, Binky. Gising na. Ito ay oras para sa masaya pointer. -Ano yan? Alamin ang tungkol sa mga payo? Oh, mabait. [END playback] David J. MALAN: At sa na tala, kami ay nakikita mo sa Miyerkules. Lahat tama. Sinong dancing? Sige na. Sinong dancing? Gusto mo sa akin upang makakuha ng ito nagsimula? Kukunin ko ang mga ito na nagsimula. Woooo! LAUREN: Sweet fancy Moses.