[Musika nagpe-play] David J. MALAN: Lahat ng karapatan. Ito ay CS50, at ito ay ang simula ng linggo dalawang. Kaya ipaalam sa amin magsimula ngayon na may isang bug. Ang isang bug, siyempre, ay isang pagkakamali sa isang programa, at makakakuha ka ng napaka pamilyar sa konseptong ito kung hindi mo pa-program bago. pset0 at ngayon pset1. Ngunit Isaalang-alang natin ang isang bagay hayaan medyo simple sa unang. Ang program na ito dito na ako threw-sama nang maaga, at i-claim ko na ito ay dapat na mag-print 10 bituin sa screen gamit printf, ngunit tila ito ay mayroong bug sa ilang mga paraan. Given pagtutukoy na iyon dapat itong i-print ang 10 bituin, ngunit ito ay hindi tila, kung ano Gusto mo i-claim ang bug? Oo? Kaya ito ay isang off sa pamamagitan ng isang error, at kung ano ang ibig mong sabihin sa pamamagitan ng na? OK. Mahusay. Kaya tinukoy mo kami ng isang simulan ang halaga ng zero para i, at tinukoy namin ang isang n halaga ng 10, ngunit ginamit namin mas mababa sa o patas sa. At ang dahilan na ito ay dalawang mga character at hindi lamang isa na simbolo, tulad ng sa isang aklat matematika, ay hindi mo na kailangang isang paraan ng pagpapahayag ng mga isa katumbas ng character. Kaya ibig sabihin nito ay mas mababa, ngunit kung nagsimula ka ng pagbibilang sa zero, ngunit bilangin mo ang lahat ng paraan up sa pamamagitan at pantay-pantay sa 10, ikaw ay siyempre pagpunta sa ang bilang ng 11 mga bagay sa kabuuan. At kaya ka ng pagpunta sa i-print ang 11 bituin. Kaya kung ano ang maaaring maging isang remedyo para sa ito? Oo? Kaya lamang ayusin ang mga mas mababa sa o katumbas ng mas mababa kaysa sa lamang, at mayroong, inaangkin ko, marahil isa pang solusyon, masyadong. Ano ang maaari mong gawin pa? Oo? Kaya simulan ang katumbas nito sa 1, at iwan ang mas mababa sa o patas sa. At tapat Gusto ko i-claim na, para sa isang karaniwang tao, ito ay marahil higit pa prangka. Simulan ang pagbibilang sa 1 at bilangin up sa pamamagitan ng 10. Mahalaga gawin kung ano ang iyong ibig sabihin. Ngunit ang katotohanang ay sa programming, bilang nasaksihan namin, computer na siyentipiko at mga programmer Sa pangkalahatan ay magsisimulang pagbibilang sa zero. At kaya na fine-sabay ikaw masanay ito. Ang iyong kondisyon ay sa pangkalahatan maging isang bagay tulad ng mas mababa sa. Kaya lang ang isang makatuwirang error na maaari naming ngayon ayusin at sa huli mag-recompile ito at kumuha ng 10 minuto. Well kung paano tungkol sa bug dito? Dito, muli, inaangkin ko na mayroon akong ang isang layunin ng pag-print ng 10 stars-- isa sa bawat linya oras na ito, ngunit ito ay hindi. Bago namin ipanukala kung ano ang pag-aayos ay, kung ano ang ginagawa ito i-print ang biswal na kung ako ay upang ipunin at patakbuhin ang program na ito ang iyong palagay? Oo? Bituin. Kaya ang lahat ng mga bituin sa parehong linya ay kung ano ang aking narinig, at pagkatapos ay ang bagong linya ng character. Kaya sabihin subukan iyon. Kaya gumawa mayroong bug-1, ipasok, at nakikita ko ang command clang na usapan natin ang tungkol sa huling panahon. ./buggy-1, at sa katunayan ko makita ang lahat ng 10 mga bituin sa parehong linya kahit na inaangkin ko sa aking mga pagtutukoy ng komento lamang sa ibabaw ang code na nilayon kong gawin ang isa sa bawat linya. Ngunit ito ay mukhang tama. Ngayon 15 linya mukhang ako pag-print ng isang bituin, at pagkatapos linya 16 ito kamukha ako sa pag-print ng isang bagong linya ng character, at ang mga ito ay parehong mga naka-indent sa gayon Ako sa loob ng loop malinaw. Kaya dapat hindi ko ginagawa bituin, ang mga bagong linya, bituin, ang mga bagong linya, bituin, bagong line? Oo? Oo, hindi tulad ng isang wika tulad ng Python, kung pamilyar ka, indentation hindi mahalaga sa mga computer. Mahalaga lamang ito sa tao. Kaya samantalang dito na imbento ko linya 15 at 16-- na mukhang maganda, ngunit hindi na mahalaga ang computer. Ang computer na pinahahalagahan ng tungkol sa aktwal na pagkakaroon ng kulot braces sa paligid ng mga linya ng code. Kaya na ito ay clear-- tulad ng sa Scratch-- na ang dalawang linya ng code dapat na pinaandar. Tulad ng isa sa mga kulay-dilaw na palaisipan scratch piraso at muli at muli muli. Kaya ngayon kung ako muling patakbuhin ito program-- ./buggy-2-- Hm. Mayroon akong isang error sa ngayon. Ano nakalimutan kong gawin? Oo, kaya hindi ako nag-compile ito. Kaya gumawa mayroong bug-2. Walang ganitong file dahil ginawa ko hindi talaga compile ang ikalawang bersyon. Kaya kawili-wiling ngayon undeclared variable-- hindi 2. Kami ay kasalukuyang 1. Gawing mayroong bug-1-- ./buggy-1-- at ngayon bawat isa sa kanila ay nasa parehong linya. Ngayon ay mayroong ay isang pagbubukod sa ito dapat na claim ng minahan na kailangan mo ng mga kulot braces. Kapag ito ay talagang OK-- kung hindi mo Napansin sa seksyon o textbooks-- upang alisin ang kulot braces? Oo? Mismong. Kapag mayroon lamang isang linya ng code na iyong nais na maiuugnay sa loop bilang sa aming unang halimbawa. Ito ay perpektong lehitimong upang alisin ang kulot braces tulad ng isang uri ng isang kaginhawahan mula sa Compiler sa iyo. Oo? Magandang katanungan. Gusto ito ituturing na isang error style? Gusto naming promote-- bilang sa CS50 gabay ng estilo, ang URL kung saan ay nasa pset1-- na palaging gamitin ang kulot braces. Tiyak kung bago ka sa programming iyo. Ang katotohanan ay hindi kami pagpunta sa pagbawalan ka ng mula sa paggawa ng mga kaginhawahan. Ngunit kung lamang nakakakuha ka ng sa ugoy ng mga bagay, walang pasubali lamang laging gamitin ang kulot braces hanggang sa makuha mo ang Hang nito. Magandang katanungan. Lahat ng karapatan. Kaya na pagkatapos ay isang bug. Hindi bababa sa medyo simple ng isang bagay. At gayon pa man ay maaaring sa tingin mo ito Medyo rudimentary, tama? Ito ay uri ng mga unang linggo sa pagtingin sa wika tulad ng, tingnan ang iyong mga bug sa ganyang bagay. Subalit ang katotohanan ng mga ito ay talaga kinatawan ng ilang mga magandang nakakatakot problema na maaaring lumabas dahil sa tunay na mundo. Kaya maaaring isipin ang ilan sa inyo kung susundin mo ang tech na balita, o maaari ring maging nahuli hangin ng ito noong Pebrero ng nakaraang taon na nagkaroon ng Apple ginawa ng isang bit ng isang pagkakamali sa parehong iOS, sa operating system sa ang kanilang mga telepono, at din Mac OS, ang operating system sa kanilang mga desktop at laptop. At nakita mo gaya ng mga ulo ng bilang na ito. At pagkatapos noon, Apple ipinangako upang ayusin ang bug na ito, at masyadong mabilis ginawang ayusin ito sa iOS, ngunit pagkatapos ay sa huli naayos na ito sa Mac OS pati na rin. Ngayon wala sa mga ito ng mga ulo ng mag-isa talaga magbunyag kung ano ang kalakip na problema ay, ngunit ang bug ay sa huli ay nabawasan hanggang isang bug sa SSL, secure socket layer. At mahaba kuwento maikli, ito ang software na ang aming mga browser at iba pang mga software na ginamit upang gawin kung ano? Kung sinabi ko na SSL ay kasangkot, sa tuwing nag bisitahin ang isang URL na nagsisimula sa HTTPS, ano pagkatapos ay maaari SSL may kaugnayan sa? Pag-encrypt. Kaya makikita namin makipag-usap tungkol sa ito sa darating na mga araw. Pag-encrypt, ang sining ng scrambling impormasyon. Ngunit mahaba kuwento maikli, Apple ang ilang sandali ang nakalipas ay nagkamali sa kanilang pagpapatupad ng SSL, ang software na ganap na ipinapatupad ng URL tulad ng HTTPS o max koneksyon doon masyadong. Ang resulta ng kung saan ay ang iyong koneksyon ng dati potensyal na ay naharang. At ang iyong mga koneksyon ay hindi palaging naka-encrypt kung nagkaroon ka ng ilang masamang tao sa pagitan ng ikaw at ang patutunguhang website na nag- Alam kung paano samantalahin ito. Ngayon Apple sa huli na nai-post isang ayusin para sa wakas, at ang paglalarawan ng kanilang mga pag-aayos ay na ito. Nabigo ang pag-secure na transportasyon upang patunayan ang pagiging tunay ng ang koneksyon. Ang usapin ay natugunan sa pamamagitan ng pagpapanumbalik ng mga nawawalang mga hakbang sa pagpapatunay. Kaya ito ay isang napaka-kamay kulot na paliwanag para sinasabi lang na screwed namin up. May literal isa linya ng code na noon ay mayroong bug sa kanilang pagpapatupad ng SSL, at kung kang pumunta sa online at maghanap ng mga ito Maaari mong aktwal na mahanap ang orihinal na source code. Halimbawa, ito ay isang screen shot ng lamang sa isang bahagi ng isang medyo malaking file, ngunit ito ay isang function na tinatawag na tila SSL-verify ng pag-sign server exchange key. At ito ay tumatagal ng isang bungkos ng argumento at input. At hindi namin pagpunta sa tumutok labis sa minutia doon, ngunit kung tutukan mo ang code sa loob ng ng pinakamataas na function-- sabihin mag-zoom in sa na iyon. Maaari mo na pinaghihinalaan kung ano ang error maaari maging kahit na wala kang mga ideya sa huli ano ang iyong hinahanap sa. Mayroong uri ng isang pagkakaiba dito, na kung saan ay kung ano? Oo, ako ay hindi talaga gusto ang hitsura ng dalawang goto nabigo. Tapat, hindi ko talaga alam kung ano ang goto mabigo paraan, ngunit nagkakaroon ng dalawa sa kanila pabalik sa likod. Iyon lang ang uri ng rubs sa akin intellectually sa maling paraan, at sa katunayan kung mag-zoom in kami sa lamang ang mga linya, ito ay C. Kaya ng maraming code ng Apple ay mismo nakasulat sa C, at ito tila ay talagang equivalent-- huwag na medyo indentation bersyon, ngunit kung makilala ka sa katotohanang na walang kulot braces, kung ano Talaga ay nagsulat Apple ay code na mukhang tulad nito. Kaya nagbigay ako naka-zoom out at ko lang naayos na ang indentation sa kamalayan na kung walang kulot braces, na mabigo pangalawang goto na nasa dilaw Pupunta upang maisagawa kahit na ano. Hindi ito nauugnay sa ang kondisyon kung nasa itaas nito. Kaya kahit muli, kung wala ka pa masyadong maunawaan kung ano ang magagawa posibleng maging paggawa, alam na ang bawat isa sa mga conditions-- bawat isa sa mga linya ay isang napaka-mahalagang hakbang nasa proseso ng pagsusuri kung ang iyong data ay sa katunayan naka-encrypt. Kaya laktaw isa sa mga hakbang na ito, hindi ang pinakamahusay na ideya. Ngunit dahil mayroon kaming ito pangalawang goto mabigo sa kulay dilaw, at dahil sa sandaling namin uri ng aesthetically ilipat ito sa kaliwa kung saan ito lohikal ay sa sandaling ito, kung ano ang ang ibig sabihin nito para sa line ng code sa ibaba na pangalawang goto mabigo nais iyong palagay? Palagi itong nangyayari na lalaktawan. Kaya gotos ay karaniwang frowned sa para sa mga kadahilanang hindi namin pumunta sa talagang, at sa katunayan sa CS50 namin ay may posibilidad hindi turuan ang pahayag na ito goto, ngunit maaari mong isipin ang goto mabigo bilang kahulugan go jump sa ilang iba pang bahagi ng code. Sa ibang salita tumalon sa ibabaw ito huling linya nang sama-sama, at sa gayon ang mga resulta ng hangal simpleng pagkakamali na lang resulta ng marahil isang tao pagkopya at pag-paste ng masyadong isa maraming beses ay na ang buong seguridad ng iOS at Mac OS ay mahina laban sa interception sa pamamagitan ng masamang guys para sa medyo ilang oras. Hanggang sa Apple sa wakas ay naayos na ito. Ngayon kung ilan sa inyo ay talagang tumatakbo ang lumang bersyon ng iOS o Mac OS, maaari kang pumunta sa gotofail.com na ay isang website na-set up ng isang tao upang lubos na matukoy programming kung ang iyong computer ay mahina pa rin. At tapat, kung ito ay, marahil ito ay isang magandang ideya upang i-update ang iyong telepono o ang iyong Mac sa puntong ito. Ngunit doon, Tipan lamang sa makatarungan paano isang pagpapahalaga ng mga mas mababang antas mga detalye at walang kinikilingan Maaari ba talagang simple ideya isalin sa mga pagpapasya at mga problema na affected-- sa case-- milyun-milyong tao. Ngayon isang salita sa pangangasiwa. Seksyon ay magsisimula na ito darating na Linggo. Makakatanggap ka ng isang email sa pamamagitan ng katapusan ng linggo tungkol sa seksyon, kung saang punto ang proseso ng resectioning Magsisimula kung hindi mo natanto mayroon kang ngayon ilang bagong mga salungatan. Kaya nangyari ito taon-taon, at kami ay tumanggap sa araw na darating. Opisina gawin hours-- panatilihin ang isang mata sa iskedyul dito. Binabago Medyo sa linggong ito, lalo na ang oras ng simula at ang lokasyon, kaya huwag kumonsulta na bago heading sa oras ng opisina anuman sa mga susunod na apat na gabi. At ngayon ang isang salita sa pagtasa, lalo na bilang sumisid ka sa problema Nagtatakda ng isa at higit pa. Kaya ayon sa mga pagtutukoy, ang mga ito ay sa pangkalahatan ang axes kasama na sinusuri namin ang iyong trabaho. Saklaw ay tumutukoy sa kung ano ang lawak iyong code ipinapatupad ng Kinakailangan ang mga tampok sa pamamagitan ng aming mga pagtutukoy. Sa ibang salita, kung gaano kalaki isang piraso hanay ng ginawa mo kumagat off. Gawin mo ba ang isang third ng mga ito, isang kalahati ng ito, ang 100% ng ito. Kahit na ito ay hindi tama, kung magkano ang mong tangkaing? Kaya na kumukuha ang mga antas ng pagsusumikap at ang halaga na kung saan bit off ang mga problema sa hanay ng problema. Correctness-- ang isang ito, upang kung ano ang lawak, ay ang iyong code pare-pareho sa aming mga mga pagtutukoy at libreng ng mga bug. Kaya ito gumagana nang tama? Kung bigyan namin ito ng ilang mga input, ginagawa nito bigyan kami ng mga output na namin inaasahan? Design-- ngayon ito ang unang ng lalo na ang mga mapaghambing, o sana ang mga na nangangailangan ng paghatol ng tao. At sa katunayan, ito ang dahilan kung bakit mayroon kaming mga tauhan ng napakaraming mga Fellows pagtuturo at kurso katulong. Upang kung ano ang lawak ay ang iyong code nakasulat na rin? At muli ito ay isang napaka mapaghambing pagtatasa na gagana sa iyo sa Bi-directionally sa linggo darating. Kaya na kapag kumuha ka ng hindi lamang numeric score, kundi pati na rin isang nakasulat na mga marka, o nag-type ng feedback, o nakasulat na feedback sa mga salitang Ingles. Iyon ay kung ano ang gagamitin namin upang humimok mo patungo sa aktwal na pagsusulat ng mas mahusay na code. At sa lecture at seksyon, susubukan naming upang ituro out-- nang madalas hangga't can-- namin kung bakit ang isang programa hindi lamang tama at sa pagtakbo mabuti, ngunit din mahusay na dinisenyo. Ang pinaka-mahusay na maaaring ito ay, o kahit na ang pinaka magandang maaari itong maging. Na hahantong sa amin upang estilo. Estilo sa huli ay isang Aesthetic paghatol. Ang ibig pinili mo magandang mga pangalan para sa iyong mga variable? Nakarating na naka-indent mo ang iyong code nang maayos? Ito ay tumingin mabuti, at samakatuwid, ay madali para sa isa pang tao na basahin ang iyong mga kani-kanyang ng kawastuhan nito. Ngayon pangkalahatan ay alinsunod sa mga syllabus, puntos namin mga bagay na ito sa sukat na limang puntos. At ipaalam sa akin martilyo ng tahanan ng punto na ang isang tatlong ay talagang mahusay. Masyadong mabilis gawin kakailanganin ng mga tao simulan ang paggawa aritmetika. Kapag kumuha sila ng isang tatlong out sa limang sa kawastuhan para sa ilang pset at sa tingin nila damn, ako pagpunta sa 60% na kung saan ay mahalagang isang D o isang E. Iyon ay hindi ang paraan ng aming Sa tingin ng mga numerong ito. Isang tatlong ay talagang mahusay, at kung ano ang namin Sa pangkalahatan ay inaasahan sa umpisa sa panahon ng panunungkulan ay kung nakakakuha ka ng ng grupo ng mga three's-- siguro ng ilang ng fairs, isang pares ng mga fours-- o ng ilang twos, isang pares ng mga fours-- na isang magandang lugar upang magsimula. At kaya hangga't makita kami ng isang paitaas trajectory sa paglipas ng panahon, ikaw ay nasa isang partikular na magandang lugar. Ang formula na ginagamit namin upang timbang ng mga bagay ay mahalagang ito alinsunod sa mga syllabus, na nangangahulugan lamang na namin makapagbigay ng higit pang timbang sa kawastuhan. Dahil masyado nang madalas kawastuhan na tumatagal ang pinaka-oras. Pagkatiwalaan sa akin ngayon. Ikaw find-- ng hindi bababa sa sa isa pset-- na gumastos ng 90% ng iyong oras nagtatrabaho sa 10% ng mga problema. At ang lahat ng uri ng mga gumagana maliban sa isa o dalawang mga bug, at ang mga ito ay ang mga bug na panatilihin kang up late sa gabi. Iyon ang mga bago na uri ng makatakas sa iyo. Ngunit pagkatapos sleeping dito, o nag-aaral sa oras ng opisina o pagtatanong sa online, ay kapag nakarating ka na sa na 100% ng layunin, at iyon ang dahilan kung bakit namin timbang kawastuhan ng pinaka. Idisenyo ang isang maliit na mas kaunti, at Estilo ng kaunti mas mababa na. Ngunit isa estilo mind-- ay marahil ang pinakamadaling ng mga ito upang kumagat off bilang bawat ang gabay sa estilo. At ngayon, isang mas seryosong tandaan sa akademikong katapatan. CS50 ay may unfortunate pagkakaiba ng pagiging ang pinakamalaking tagagawa ng Lupon ng Ad kaso halos bawat taon sa kasaysayan. Hindi ito dahil cheat mga mag-aaral sa CS50 anumang higit pang mga kaya kaysa sa iba pang klase, ngunit dahil sa pamamagitan ng likas na katangian ng trabaho, ang katotohanan na ito ay electronic, ang katotohanan na masaya naming para dito, at ang katotohanan ay namin siyentipiko computer, Maaari ko bang sabihin hindi namin sa kasamaang-palad napakabuti sa pag-detect ito. Kaya kung ano ang ibig sabihin nito sa tunay na mga termino? Kaya ito, alinsunod sa mga syllabus, pilosopiya ng kurso ng talaga ang pigsa down upang maging makatuwirang. May linyang ito sa pagitan ng paggawa ng isa sa trabaho sa iyong sariling at ang pagkakaroon ng isang maliit na bit ng makatwirang tulong mula sa isang kaibigan, at tahasan paggawa na trabaho para sa iyong kaibigan, o pagpapadala sa kanya ang iyong code kaya na siya ay maaari lamang kumuha o humiram ito kanan. At na lumalabis na namin iguguhit na ang klase. Tingnan, ang syllabus sa huli para sa mga linya na gumuhit kami bilang makatuwirang at hindi makatwiran na pag-uugali, pero tunay na ginagawa nito pigsa down sa kakanyahan ng iyong trabaho nangangailangang maging ang iyong sariling sa dulo. Ngayon na may na sinabi, mayroong isang heuristic. Dahil bilang maaari mong imagine-- mula sa oras ng opisina at ang visual at ang mga video na hindi namin ipinapakita kaya far-- CS50 ay sa katunayan nilalayong maging collaborative at bilang kooperatiba at bilang panlipunan hangga't maaari. Tulad ng collaborative na bilang ito ay mahigpit. Ngunit may sinabi na ito, ang heuristic, bilang makikita mo sa syllabus, ay na kapag nagkakaroon ka ng ilang mga problema. Mayroon kang ilang mga bug sa iyong code na iyong Hindi maaaring malutas, ito ay makatwirang para sa iyo upang ipakita ang iyong code sa ibang tao. Isang kaibigan kahit sa klase, sa isang kaibigan na nakaupo sa tabi ng sa iyo sa oras ng opisina, o isang miyembro ng kawani. Ngunit hindi sila maaaring ipakita ang kanilang mga code sa iyo. Sa madaling salita, isang sagutin sa iyong question-- Kailangan ko help-- ay hindi oh, narito ang aking code. Tingnan ito at deduce mula dito kung ano ang gagawin sa iyo. Ngayon, siyempre, mayroong isang paraan upang malinaw na laro sa system na ito kung saan kukunin ko na maipakita sa iyo ang aking code bago ang pagkakaroon ng isang katanungan. Ipakita ninyo sa akin ang aking iyong code bago pagkakaroon ng isang katanungan. Ngunit makita muli ang syllabus para sa mas pinong mga detalye ng kung saan ang linyang ito ay. Lang sa ngayon pintahan ang larawan at ibahagi ang bilang halatang hangga't maaari kung saan hindi namin sa sa mga nakaraang taon, ito ay ang bilang ng mga kaso ng Lupon ng Ad na CS50 ay nagkaroon sa ibabaw nakalipas na pitong taon. Sa 14 na mga kaso na ito pinakabagong pagkahulog. Sa mga tuntunin ng mga mag-aaral na kasangkot, ito ay 20 ilang mga kakaibang mga mag-aaral ito nakalipas na tag-lagas. Nagkaroon ng peak ng 33 mag-aaral ng ilang taon na ang nakakaraan. Marami sa kanino ay sa kasamaang-palad hindi na dito sa campus. Mga mag-aaral na kasangkot bilang isang porsyento ng klase ay kasaysayan ranged mula 0% sa 5.3%, na kung saan ay lamang na sabihin ito ay taun-taon isang hamon. At patungo sa layuning iyon, kung ano gusto naming gawin ay ihatid isa na dd-- namin FYI-- ihambing lamang sa isang patas na pagturing sa mga mag-aaral na ang sumusunod na mga linya nang naaayon. Ginagawa namin ihambing ang lahat ng kasalukuyang mga pagsusumite laban sa lahat ng nakaraang mga misyon mula sa nakalipas na ang maraming taon. Alam namin na masyado kung paano Google sa buong at maghanap ng mga repositoryo ng code sa online, mga forum ng talakayan online, ang mga site ng online na trabaho. Kung maaari itong mahanap ang isang mag-aaral, maaari naming tiyak hanapin ito hangga't regretfully namin gawin. Kaya ano ang makikita mo sa syllabus bagaman ito ay ikinalulungkot sugnay. Maaari ko tiyak Pinapahalagahan, at namin ang lahat ay may staff pagkakaroon ng tapos ng kurso tulad ng na ito, o ang isang ito ang sarili nito sa paglipas ng panahon, ay tiyak na malaman kung ano ito ay tulad ng kapag nakakakuha ng buhay sa mga paraan kapag mayroon kang ilang late night deadline-- hindi lamang sa isang klase na ito, ngunit another-- kapag ikaw ay ganap na naubos, stressed out, magkaroon ng isang inordinate numero ng iba pang mga bagay na maaaring gawin. Ikaw ay gumawa ng sa isang punto sa buhay ay tiyak na isang masamang, marahil late desisyon gabi. Kaya bawat ang syllabus, may sugnay na ito, tulad na kung loob ng 72 oras ng paggawa ilang hindi magandang desisyon, pag-aari mo hanggang sa ito at makipag-ugnay sa akin at isa sa ulo ang kurso ni at magkakaroon kami ng isang pag-uusap. Susubukan naming panghahawakan ang mga bagay panloob sa pag-asa nito na magiging higit pa sa isang pagtuturo sandali o aralin buhay, at hindi isang bagay na may lalo na marahas ramifications bilang maaari mong makita sa mga chart dito. Kaya na ang isang napaka-seryoso tono. Ipaalam sa amin i-pause para sa lamang ng ilang segundo upang basagin ang pagkabahala. [Musika nagpe-play] David J. MALAN: Lahat ng karapatan, kaya kung paano ay na para sa isang segue? Upang pangunahing paksa ngayong araw. Ang unang ng kung saan ay abstraction. Ang isa pang kung saan ay magiging ang representasyon ng data, na tapat ay isang talagang dry paraan ng pagsabi kung paano namin pumunta tungkol sa paglutas ng mga problema at pag-iisip tungkol sa paglutas ng mga problema? Kaya na iyong nakita sa simula, at hindi mo Nakita marahil nasa pset1 sa C na ikaw ay maaaring hindi lamang gamitin mga pag-andar, tulad ng printf, na ang ibang mga tao sa taon nakalipas ay sumulat para sa iyo. Maaari mo ring isulat ang iyong sariling mga pag-andar. At kahit na hindi ka maaaring mayroon tapos na ito sa C, at tapat sa pset1 hindi mo talaga kailangan upang isulat ang iyong sariling pag-andar dahil ang problem-- habang marahil daunting sa glance-- unang makikita mo ang Maaari ganap na malutas sa may hindi lahat na maraming mga linya ng code. Ngunit may sinabi na, sa mga tuntunin ng pagsusulat ng iyong sariling mga pag-andar, Napag-alaman na ang C ay magbibigay sa sa iyo ng kakayahan na ito. Pupunta ako sa pumunta sa source code ngayong araw, na kung saan ay magagamit na online, at pupuntahan ko sige at bukas up ng isang programa na tinatawag na pag-andar 0.C, at sa pag-andar zero Makikita natin ang ilang mga bagay. Sa unang linya 18 sa pamamagitan ng 23 ang aking pangunahing pag-andar. At ngayon na kami ay nagsisimula upang basahin code na hindi kami ay sumusulat sa mabilisang, ngunit sa halip na naisulat ko nang maaga o na sa iyo sa isang problema itakda na maaaring matanggap ng pagkakaroon napawalang nang maaga. Ang isang mahusay na paraan upang simulan ang pagbabasa ng code ng ibang tao ay hanapin ang pangunahing pag-andar. Alamin kung saan entry na point sa pagpapatakbo ng programa, at pagkatapos ay sundin ito ng lohikal na mula doon. Kaya tila mga kopya sa programang ito ang iyong pangalan sinundan ng tutuldok. Pagkatapos ay gamitin namin GetString mula sa CS50 library upang makakuha ng isang string, o isang salita o parirala mula sa user sa keyboard. At pagkatapos ay mayroong ito bagay here-- PrintName. Ngayon PrintName ay hindi isang function na ay may C. Hindi ito sa karaniwang io.h. Hindi ito sa CS50.h. Ito ay sa halip sa parehong file. Pansinin kung mag-scroll ko pababa isang bit-- linya 25 hanggang 27-- ito lamang ay isang magandang paraan ng pagkomento ang iyong code gamit ang mga bituin at slashes. Ito ay isang multi-line magkomento, at ito ay isa lamang aking paglalarawan sa asul ng ano ang ginagawa ito function. Dahil sa linya 28 sa pamamagitan ng 31, Ako ng nakasulat na isang napakabilis simpleng pag-andar pangalan na kung saan ang ay PrintName. Ito ay tumatagal ng kung gaano karaming mga argument na gusto mong sabihin? Kaya isa argument-- dahil mayroong isa na nakalista sa loob ng panaklong argumento. Ang uri ng na String. Alin ang sasabihin PrintName ay tulad ng ito itim na kahon o function na tumatagal bilang input ng string. At ang pangalan ng na String Maginhawang ay magiging Name. Hindi S, hindi H, ngunit Name. Kaya kung ano ang ibig PrintName gawin? Ito ay maganda simple. Tulad ng isang linya ng code para sa ang printf, ngunit tila ito mga print out "Kumusta," sa gayon at sa gayon. Saan ang gayon at sa gayon ay mula sa argumento. Ngayon ito ay hindi isang malaking makabagong ideya dito. Talagang, kinuha ko ang isang programa na maaari Nai-nakasulat na may isang linya ng code sa pamamagitan ng paglagay up dito, at nabago ito sa isang bagay na kinasasangkutan ng ilang mga anim o pitong o kaya linya ng code sa lahat ng mga paraan pababa dito. Ngunit ito ay ang pagsasanay ng isang na kilala bilang abstraction prinsipyo. Uri ng encapsulating sa loob ng isang bagong function na ay may pangalan, at mas mahusay na pa na pangalan nang literal Sinasabi kung ano ang ginagawa nito. Ibig kong sabihin printf-- hindi iyon lalo na mapaglarawang. Kung gusto kong lumikha ng piraso puzzle, o kung ako nais na lumikha ng isang function Pini-print na pangalan ng isang tao, ang kagandahan ng paggawa nito ay ang maaari kong talagang bigyan ng pangalan ng function na na naglalarawan kung ano ang ginagawa nito. Ngayon ito ay tumatagal sa isang input na Nagkataon ko na tinatawag na pangalan, ngunit na masyadong ay wonderfully mapaglarawang sa halip ng pagiging isang kaunti pa generic na tulad S. At walang silbi, para sa ngayon, ang ibig sabihin lamang na ito function na ay hindi ipasa ako pabalik ng kahit ano. Hindi ito nais na GetString Literal na mga kamay ako pabalik ng isang string tulad ng ginawa namin na may mga piraso ng papel kasama ang iyong mga kaklase noong nakaraang linggo, ngunit sa halip ito lamang ay may side effect. Ito mga Kopya ng isang bagay sa screen. Kaya sa katapusan ng araw, kung ako huwag gumawa ng mga pag-andar-0, ./function-0, ipapakita namin makita na ito ay humihingi para sa aking pangalan. Nagta-type ako David, at ito uri out ang aking pangalan. Kung ito gagawin ko muli sa Rob, itong ibang mapupuntahan magsabi ng "Kamusta, Rob." Kaya isang simpleng ideya, ngunit marahil extrapolate mula sa itak na bilang makakuha ng iyong mga programa ng kaunti pa sa kumplikado, at nais mong magsulat ng isang chunk ng code at tawag na code-- pahintulutang magpatakbo ng na code-- sa pamamagitan ng ilang mapaglarawang pangalanan tulad ng PrintName, C ang kayang bayaran sa amin ng kakayahan na ito. Narito ang isa pang simpleng halimbawa. Halimbawa, kung buksan ko up ng isang mag-file mula ngayon na tinatawag na return.c, mapansin kung ano ang nagawa mo na ko dito. Ang karamihan sa mga ito pangunahing function ay printf. Ako unang nagkataon initialize ng variable na tinatawag na x sa bilang 2. Pagkatapos ay i-print ko out "x ngayon % I "ang pagpasa sa ang halaga ng x. Kaya ako lang ang sinasabi ko kung ano ito ay. Ngayon ako matapang lamang nagke-claim na may printf. Ako ay cubing na halaga x, at ako paggawa nito sa pamamagitan ng pagtawag ng isang function tinatawag paglipas kubo sa x bilang argument, at pagkatapos ay sine-save ang output sa variable mismo, x. Kaya ako clobbering ang halaga ng x. Ako override ang halaga ng x sa anumang ang resulta ng pagtawag ito kubo function ay. At pagkatapos ay i-print ko lang ang ilang mga malambot na bagay-bagay dito na nagsasabi kung ano ang aking ginawa. Kaya kung ano pagkatapos ay kubo? Pansinin kung ano ang fundamentally iba't ibang dito. Ibinigay ko ang pag-andar ng isang pangalan tulad ng dati. Tinukoy na ako ng isang pangalan para sa isang argumento. Ito oras na tinatawag n sa halip ng pangalan, ngunit maaari kong tumawag ito anumang nais ko. Ngunit ito ay naiiba. Ito bagay sa kaliwa. Dati ito ay kung ano ang keyword? Lalaki. Ngayon ay malinaw naman int. Kaya kung ano ang marahil ang tumagal ang layo? Sapagkat walang bisa Sumisimbolo uri ng nothingness, at iyon ay ang kaso. PrintName ibinalik wala. May ginawang isang bagay na ito, subalit hindi ito ipasa ako pabalik isang bagay na maaari kong ilagay sa kaliwang bahagi ng isang pantay na pag-sign tulad ko na nagawa dito sa 22 linya. Kaya kung sinasabi ko sa sa 30 linya, kung ano ang malamang na nagpapahiwatig tungkol sa kung ano ang ginagawa kubo para sa akin? Oo? Ibinabalik nito ang isang integer. Kaya kamay ito sa akin pabalik, para sa Halimbawa, ang isang piraso ng papel kung saan ito ay nakasulat ang sagot. 2 cubed, o 3 cubed, o 4 cubed-- kahit anong ko ang pumasa sa, at kung paano mo ako ipatupad ito? Well, lamang n beses n beses n ay kung paano maaaring Cube ako ng isang halaga. Kaya muli, sobrang simple ideya, ngunit demonstrative ngayon kung paano namin isulat ang mga function na aktwal na nagkaroon sa amin pabalik mga halaga na maaaring maging ng interes. Tingnan natin ang isang huling halimbawa dito na tinatawag na pag-andar ng isa. Sa halimbawang ito, magsimula ito upang makakuha ng mas nakakahimok. Kaya sa pag-andar ng isa, ito program-- abiso sa huli tawag ng isang function na tinatawag na GetPositiveInt. GetPositiveInt ay hindi isang pagpapaandar sa CS50 library, ngunit kami nagpasya kaming gusto ko itong na umiiral. Kaya kung mag-scroll pababa namin sa ibang pagkakataon sa mga file, pansinin kung paano pinuntahan ko tungkol sa pagpapatupad makakuha ng positibong int, at ako sabihin ito ay mas nakakahimok dahil ito ay isang disenteng bilang ng mga linya ng code. Ito ay hindi lamang isang Silly maliit na programa laruan. Talaga ito ay nakuha ang ilang mga error checking at paggawa ng isang bagay mas kapaki-pakinabang. Kaya kung hindi mo nakita ang walkthrough mga video na namin ang naka-embed sa pset1, malaman na ito ay isang uri ng loop sa C, katulad sa espiritu upang ang mga uri ng bagay sa simula ay maaaring gawin. At gawin ang sinasabi gawin ito. I-print ito out. Pagkatapos sige at makakuha ng n-- makakuha ng isang int at mag-store ito sa n, at panatilihin ang paggawa muli at muli at ito muli hangga't n ay mas mababa sa isa. Kaya n ay magiging mas mababa kaysa sa isa lamang kung ang tao ay hindi cooperating. Kung siya ay nagta-type sa 0 o -1 o -50, ito loop ay pagpunta sa panatilihin e-execute nang muli at muli. At sa huli mapansin, ako bumalik lang ang halaga. Kaya ngayon ay mayroon kaming isang function na naging maganda kung CS50 ay ipapatupad sa CS50.h at CS50.c para sa iyo, ngunit dito kaya namin ngayon ipatupad ang ating mga sarili. Ngunit dalawang mga komento sa ilang mga pangunahing mga detalye. One-- bakit Ipinahahayag ko int n, Sa tingin mo, sa 29 na linya sa halip ng paggawa lamang ito dito, na siyang mas pare-pareho sa kung ano ang ginawa namin noong nakaraang linggo? Oo? Ang isang mahusay na pag-iisip. Kaya kung kami ay upang ilagay ito dito, ito ay waring namin panatilihin pagdeklara itong muli at muli. Na in at ng mismo ay hindi problema, bawat se, dahil kailangan namin lamang ang halaga nang isang beses at pagkatapos ay kami ay pagpunta pa rin upang makakuha ng isang bago. Ngunit isang mahusay na pag-iisip. Oo? Isara. Kaya dahil na-ipinahayag ko n sa 29 linya sa labas ng loop, ito ay naa-access sa buong ang buong pag-andar. Hindi ang iba pang mga pag-andar dahil n pa rin sa loob ng mga kulot braces dito. So-- sigurado. Mismong. Kaya ito ay kahit na higit pa sa punto. Kung sa halip namin ipinahayag n dito mismo sa 32 na linya, ito ay may problemang dahil hula kung saan pa ang kailangan ko upang i-access ito? Sa 34 linya, at ang simpleng panuntunan ay na maaari ka lamang gumamit ng isang variable sa loob ng pinakabagong mga kulot braces kung saan ipinahayag mo ito. Sa kasamaang palad, linya 34 ay isang linya pa huli, dahil sarado na ako ang kulot Brace sa 33 na linya na tumutugon sa kulot Brace sa 30 linya. At kaya ito ay isang paraan ng pagsabi na int variable na ito ay scoped, kaya upang makipag-usap, sa loob lamang ng mga kulot braces. Ito lamang ay hindi umiiral sa labas ng mga ito. Kaya sa katunayan, kung gagawin ko ito mali, hayaan mo akong i-save ang code bilang hindi tama ito is-- nakasulat. Hayaan akong sige at huwag gumawa function na-1, at notice-- error. Paggamit ng undeclared tagatukoy n sa 35 linya, na dito mismo. At kung mag-scroll namin up karagdagang, isa pa. Paggamit ng undeclared tagatukoy n sa 34 linya. Kaya ang Compiler, Clang, ay na makapansin na ito lamang Hindi umiiral ang kahit na malinaw na ito ay may biswal. Kaya isang simpleng pag-aayos ay pagdeklara ito doon. Ngayon hayaan mo akong mag-scroll sa sa tuktok ng file. Ano jumps out sa iyo bilang pagiging isang maliit na iba't ibang mula sa mga bagay na itinuturing namin ang nakaraang linggo? Mayroon akong pangalan hindi lamang, huwag lamang Mayroon akong ilang mga matalim Kabilang sa tuktok up, Mayroon akong isang bagay na ako pagtawag ng prototype. Ngayon na mukhang awfully katulad ng kung ano Nakita namin lamang ng ilang sandali ang nakalipas sa 27 linya. Kaya sabihin infer mula sa ibang mensahe ng error kung bakit ginawa ko na ito. Hayaan akong sige at tanggalin ang mga linya doon. At upang malaman namin wala tungkol sa prototype. Remake ang file na ito. Gumawa ng pag-andar ng isa. At ngayon, damn, apat na mga error. Ng mag-scroll hanggang sa ang unang isa Hayaang. Implicit deklarasyon ng function ng makakuha ng positibong int ay hindi wasto sa C99. C99 lamang ay nangangahulugang ang 1999 bersyon ng wika C, na kung ano talaga ang aming ginagamit. Kaya kung ano ang ibig sabihin nito? Well C-- at higit na partikular C compilers-- ay medyo pipi programa. Sila lamang malaman kung ano na iyong sinabi sa kanila, at iyon ang talaga thematic mula noong nakaraang linggo. Ang problema ay kung pumunta ako tungkol sa pagpapatupad ng pangalan dito, at tumawag ako ng isang function na tinatawag na GetPositiveInt dito sa 20 linya, na function na technically hindi umiiral hanggang nakikita ng Compiler 27 linya. Sa kasamaang palad, ang Compiler ay paggawa ng mga bagay tuktok, pababa, pakaliwa, pakanan, kaya dahil hindi ito ay nakakita ng pagpapatupad ng GetPositiveInt, ngunit nakakakita nito Sinusubukan mo gamitin ito up dito, lamang ito ng pagpunta sa bail-- sumigaw sa sa iyo ng isang error message-- marahil cryptic, at hindi talaga makatipon ang file. Kaya isang tinatawag na prototype up dito ay admittedly kalabisan. Literal, nagpunta ako down na dito at ko makokopya at ilagay ito, at ko bang ilagay ito dito. Walang silbi ay magiging mas tamang, kaya na aming Literal na kopyahin at i-paste ito oras na ito. Literal na ako kopyahin at ilagay ito. Talagang tulad ng tulad ng isang tinapay mumo. Ang isang maliit na clue sa Compiler. Hindi ko alam kung ano ang ginagawa pa, ngunit ako promising sa iyo na ito ay umiiral sa kalaunan. At iyon ang dahilan kung bakit ito line-- sa linya 16-- nagtatapos na may semicolon. Ito ay kalabisan sa pamamagitan ng disenyo. Oo? Kung hindi mo i-link ang iyong library upang the-- naku, ang mahusay na pinag-uusapan. Biglang Kasama inclusions header na file. Kailangang mag-be-- dapat halos palaging sa tuktok napaka ng file para sa isang similar-- para sa eksaktong kapareho dahilan, oo. Dahil sa karaniwang io.h ay literal isang linya tulad nito, ngunit may salitang printf, at kasama ang mga argumento at uri nito return. At kaya sa pamamagitan ng paggawa matalim magsama ng hanggang dito, ano ang iyong ginagawa nang literal ay kopyahin at i-paste ang mga nilalaman ng ibang tao ay sumulat up tuktok. At sa gayon ay cluing ang iyong code sa sa katotohanan na ang mga pag-andar ko umiiral. Oo? Hinding. Kaya isang napaka-matalino at tama solusyon ay magiging, alam mo kung ano? Hindi ko alam kung ano ang isang prototype ay, ngunit alam ko kung Nauunawaan ko na C lamang pipi at rethinks tuktok hanggang ibaba. Magbigay ng ito kung ano ang nais ni ito rin ipaalam. Cut na code Hayaan, i-paste up ito tuktok, at ngayon itulak pangunahing pababa sa ibaba. Ito ay masyadong paglutas ng problema. Ngunit maaari mong napaka madaling makabuo ng mga isang sitwasyon kung saan ang isang kailangang tawagan B, at marahil B tawag pabalik sa A. na ito ay isang bagay na tinatawag na recursion, at kami ay bumalik sa iyon. At ito ay maaari o hindi maaari maging isang magandang bagay, ngunit maaari kang tiyak masira ang solusyong ito. At saka, nais ko tubusin ang stylistically, lalo na kapag ang iyong mga programa maging ito mahaba at ito ang haba, ito lamang ay sobrang maginhawa upang ilagay ang pangunahing sa tuktok dahil ito ay ang pinaka-bagay programmer ay pagpunta sa nagmamalasakit sa. At kaya ito ay isang maliit na cleaner, arguably, upang magawa nito ang mga paraan Ako na orihinal na ginawa ito may prototype kahit na bagaman hitsura nito ng kaunti kalabisan sa unang tingin. Oo? Paumanhin, maaari mo itong sasabihin louder? Kung lumipat ka sa mga lokasyon ng mga pagpapatupad at ang prototype? Nang sa gayon ay isang mahusay na tanong. Kung muli mong idedeklara ito pababa dito, sabihin makita kung ano ang mangyayari. Kaya kung ko bang ilagay ito pababa dito, hindi ka na nagsasabi. Oh, paumanhin. Louder? Kahit louder. Oh, mahusay na pinag-uusapan. Gusto ito magpawalang-bisa ang pag-andar? Alam mo yun, pagkatapos ang lahat ng mga taon, ako May hindi kailanman maglagay ng prototype pagkatapos. Kaya sabihin gawin gumawa ng function-1 pagkatapos ng paggawa na. [MUTTERING] David J. MALAN: Oh, maghintay. Pa rin Mayroon kaming upang ilagay ang lahat ng bagay up tuktok. Kaya sabihin gawin ito dito, kung ako pag-unawa sa iyong tanong nang tama. Ako paglalagay ng lahat ng bagay, kabilang ang ang prototype sa itaas pangunahing, ngunit ako ng paglalagay ng prototype sa ibaba ang pagpapatupad. Kaya kapag gumawa ako ng isa, ako ako nakakakuha pabalik isang error-- hindi nagamit na variable n. Oh, doon. Salamat sa iyo. Ni makita Hayaan, natin mapupuksa ang ito. Iyon ay isang iba't ibang mga bug, kaya ni huwag pansinin na ipaalam. Ng tunay na mabilis na remake ito Hayaan. OK, kaya ang data argumento hindi ginagamit ng mga format ng String n-- oh, na dahil Binago ako sa mga dito. Ang lahat ng mga karapatan, alam namin kung ano ang sagot Pupunta to-- lahat ng karapatan, dito pumunta namin. Ah, salamat para sa mga positibo. Ang lahat ng mga karapatan, ako ay ayusin ang code na ito after-- huwag pansinin ang partikular na bug dahil ito was-- ito gumagana ay ang sagot. Kaya ito ay hindi patungan kung ano ang nai-lamang nagawa mo. Pinaghihinalaan ko ang Compiler ay nakasulat sa paraang na ito ay hindi papansin ang iyong mga prototype dahil ang katawan, kaya upang makipag-usap, ng pag-andar ay may naka- naipatupad mas mataas up. Gusto ko mayroon upang aktwal na kumonsulta ang manu-manong ng Compiler upang maunawaan kung mayroong anumang iba pang implikasyon, ngunit sa unang tingin lamang sa pamamagitan ng pagsubok at pag-eksperimento, mukhang walang epekto. Magandang katanungan. Kaya sabihin pekein maaga ngayon, gumagalaw layo mula sa mga side effect na mga function na gawin ang isang bagay tulad ng biswal sa screen na may printf, ngunit hindi nagbabalik ng halaga. At pag-andar na may return mga halaga tulad namin lamang nakita ang ilan sa. Nakapagpadala na kami nakakita ito paniwala ng saklaw, at kami makita ito muli at muli. Ngunit sa ngayon, muli, gamitin ang mga panuntunan ng hinlalaki na ang isang variable na maaari lamang magamit sa loob ng mga pinaka-kamakailang nabuksang at closed kulot braces bilang namin Nakita sa partikular na halimbawa. At habang kayo ay itinuturo out, mayroong isang ability-- maaari mong malutas ang ilan sa mga problemang ito pamamagitan ng paglagay ng variable sa buong mundo sa pinakatuktok ng isang file. Ngunit sa halos lahat ng mga kaso Gusto naming pagsimangot sa iyon, at sa katunayan hindi kahit pumunta sa na solusyon para sa ngayon. Kaya para sa ngayon, ang takeaway ay na variable ay may ito paniwala ng saklaw. Ngunit tingnan natin ang isa pang ngayon hayaan dry paraan ng talagang aktwal na tumitingin sa ilang mga kaakit-akit na mga kawili-wiling Mga detalye ng pagpapatupad. Paano maaari naming kumatawan sa impormasyon. At kami na tumingin sa ito sa unang linggo ng klase. Sa pagtingin sa binaries, at nagpapaalala sa ating sarili ng decimal. Ngunit isipin ang mula sa nakaraang linggo na C ay iba't ibang mga uri ng data at bunches higit pa, ngunit ang mga pinaka-kapaki-pakinabang na mga bago para sa ngayon ay maaaring maging ang mga ito. Ang char, o ng character, na mangyayari upang maging isang byte, o kabuuang walong bits. At iyon ang sasabihin na ang sukat ng isang char ay isa lamang byte. Ang isang byte ay walong bits, kaya ibig sabihin nito ay maaari naming kumatawan sa kung gaano karaming mga character. Gaano karaming mga titik o simbolo sa keyboard kung kami ay may isang byte o walong bits. Isipin pabalik sa linggo zero. Kung mayroon kang walong bits, kung gaano karaming mga kabuuang halaga maaari mong kumatawan sa pattern ng mga zero at mga bago? One-- higit sa na. Kaya 256 kabuuang kung simulan ang pagbibilang mula sa zero. Kaya kung mayroon kang walong bits-- kaya kung namin Nagkaroon aming mga binary na mga bombilya up dito muli, sa maaari naming i-on ang mga ilaw na mga bombilya at off sa anuman sa 256 natatanging mga pattern. Ngayon ito ay isang bit may problemang. Hindi kaya magkano para sa Ingles at pagmamahalan mga wika, ngunit tiyak kapag ipakilala, para sa Halimbawa, Asian na mga wika, na Mayroon malayo sa higit pang mga simbolo tulad ng sa 26 titik ng alpabeto. Aktwal na maaaring kailangan namin higit sa isang byte. At thankfully sa mga nakalipas na taon ay may lipunan nagpatibay ng iba pang mga pamantayan na gumagamit higit sa isang byte bawat bayad. Ngunit sa ngayon sa C, ang default ay isa lamang byte o walong bits. Isang integer, samantala, ay apat na bytes, kung hindi man ay kilala bilang 32 bits. Na nangangahulugan kung ano ang pinakamalaking posibleng bilang maaari naming kumakatawan sa isang int tila? Sa isang bilyon. Kaya 4000000000 bigyan o tumagal. 2 sa 32th kapangyarihan, kung namin ipinapalagay walang negatibong numero at gamitin na lamang ang lahat ng positibo mga numero, ito ay 4000000000 magbigay o magsagawa ng mga posibilidad. Ang isang float, samantala, ay isang iba't ibang mga uri ng uri ng data sa C. Ito ay pa rin ng isang numero, ngunit ito ay isang tunay na numero. Isang bagay na may decimal point. At ito ay lumiliko out na C Gumagamit din ang apat na bytes kinakatawan ang mga lumulutang na mga halaga ng point. Sa kasamaang palad kung gaano karaming mga lumulutang mga halaga ng point ang naroon sa mundo? Gaano karaming mga tunay na mga numero ay doon? Mayroong isang walang-katapusang numero, at para sa usaping iyon mayroong isang walang-katapusang bilang ng mga integer. Kaya hindi namin na uri ng paghuhukay ating sarili isang hole dito. Kung saan tila sa computers-- sa hindi bababa sa mga programa na nakasulat sa C sa them-- Maaari lamang mabibilang na mataas na bilang 4000000000 bigyan o tumagal, at lumulutang halaga punto maaari lamang tila kumuha ng tiyak na halaga ng katumpakan. Tanging kaya maraming mga digit pagkatapos ng ang kanilang mga decimal point. Dahil, siyempre, kung mayroon ka lamang 32 bits, Hindi ko alam kung paano namin pagpunta sa pumunta tungkol sa kumakatawan sa mga real numbers-- marahil may iba't ibang mga uri ng mga pattern. Ngunit mayroong tiyak isang may hangganan bilang ng mga naturang mga pattern, kaya dito, masyadong, ito ay may problemang. Ngayon ay maaari naming maiwasan ang problema bahagyang. Kung hindi ka gumagamit ng isang float, maaari mong gamitin ang isang double sa C, na nagbibigay sa iyo ng walong bytes, na ay paraan ng higit pang mga posibleng mga pattern ng mga zero at bago. Ngunit pa rin ito may hangganan, na kung saan ay pagpunta upang maging may problemang kung sumulat ka ng software para sa mga graphic o para sa magarbong mathematical na mga formula. Kaya maaaring talagang gusto upang mabilang up mas malaki kaysa iyon. Ang isang mahabang long-- stupidly named-- ding walong bytes, o 64 bits, at ito ay dalawang beses hangga't isang int, at ito ay para sa isang mahabang halaga ng integer. Kasayahan fact-- kung ang isang int ay apat na bytes, kung gaano katagal ay isang mahaba sa C karaniwang? Gayundin apat na bytes, ngunit isang mahabang mahaba ay walong bytes, at ito ay para sa makasaysayang dahilan. Subalit ang takeaway ngayon lamang ang data na iyon ay upang katawanin sa isang computer-- na isang pisikal na aparato na may kuryente, Sa pangkalahatan ito ay pagmamaneho mga zero at ones-- sa may hangganan halaga ng katumpakan. Kaya kung ano ang problema pagkatapos? Doon na rin problema ng integer overflow. Hindi lamang sa C, ngunit sa mga computer sa pangkalahatan. Halimbawa, kung ito ay nagkakahalaga ng isang byte ng bit-- kaya kung ito ay walong bit-- lahat ng kung saan ay ang bilang isa. Ano ang bilang na ito ay ito na kumakatawan sa kung ipinapalagay namin lahat ng ito ay mga positibong halaga sa binary? 255, at ito ay hindi 256, dahil zero ay ang pinakamababang numero. Kaya 255 ay ang pinakamataas na isa, ngunit ang problema ay ipagpalagay na nais kong dinagdagan ito variable na ay gumagamit ng kabuuan na walong bits kung gusto ko upang dagdagan ito. Well sa sandaling idagdag ko ang isang isa sa lahat ng mga bago, maaari mong marahil isipin visually-- lamang tulad ng pagsasakatuparan ng isa gamit ang decimals-- isang bagay pupuntahan dumaloy sa kaliwa. At sa katunayan, kung idagdag ko ang mga numero isa sa ito, ano ang mangyayari sa binary ay tumutulong ito sa overflows pabalik sa zero. Kaya't kung ikaw use-- lamang hindi isang int, ngunit isang solong byte upang mabilang integer sa isang programa, sa pamamagitan ng default-- sa lalong madaling ka ba sa 250, 251, 252, 253, 254, 255-- 0 nauuna matapos 255, na kung saan ay marahil hindi kung ano ang isang user ay pagpunta sa inaasahan. Ngayon samantala sa mga lumulutang na tuldok mundo, mayroon ka ring mga katulad na problema. Hindi kaya magkano ang may pinakamalaking number-- bagaman na isang isyu pa rin. Ngunit sa ang halaga ng katumpakan na maaari mong kumatawan. Kaya ipaalam sa tumagal ng isang pagtingin sa halimbawang ito dito din mula sa mapagkukunan ng code-- ngayong araw lumulutang-0.c. At napansin ito ay isang napakabilis simpleng programa na Dapat tila-print out kung ano ang halaga? Ano sa wager ito ay pagpunta sa i-print kahit na mayroong isang bit ng mga bagong syntax dito? Kaya sana ay 0.1. Kaya ang katumbas ng isang-ikasampu dahil ako paggawa 1 hinati sa 10. Ako sa pag-iimbak ang sagot sa isang variable na tinatawag na f. Variable na iyon ng uri ng float, na ay isang keyword lamang ipinanukalang ko umiral. Hindi namin nasaksihan ito bago, ngunit ito ay uri ng kapong baka isang paraan sa printf upang tukuyin kung gaano karaming mga digit sa iyo nais na makita pagkatapos ng decimal point. Kaya pagtatanda na ito ay nangangahulugan lamang na narito ang isang placeholder. Ito ay para sa isang lumulutang na tuldok halaga, at naku, sa pamamagitan ng ang paraan, ipakita ito sa mga decimal point na may o isang numero pagkatapos ng decimal point. Kaya iyon ang numero ng makabuluhang mga digit, kaya upang makipag-usap, na maaaring gusto. Kaya ipaalam sa akin sige at gawin gumawa ng float-0, ./float-0, at tila 1 hinati sa 10 ay 0.0. Ngayon kung bakit ito? Well muli, ang computer ay inaabot Literal na sa akin, at ako ay nakasulat 1 at ako nakasulat 10, at kumuha ng isang hula kung ano ay ang ipinapalagay uri ng data para sa mga dalawang mga halaga? Isang int, ito ay technically isang bagay na medyo naiiba. Ito ay karaniwang isang mahaba, subalit ito ay sa huli isang mahalagang halaga. Hindi isang lumulutang na halaga point. Aling ay upang sabihin na kung ito ay isang int at ito ay isang int, ang problema ay na ang computer walang kakayahan upang mag-imbak ng kahit na decimal point. Kaya kapag gumawa ka ng 1 hinati sa pamamagitan ng paggamit ng 10 integer para sa parehong numerator at ang denominator, ang sagot ay dapat na 0.1. Subalit ang computer-- dahil mga mga integers-- Hindi alam kung anong gagawin sa mga 0.1. Kaya kung ano ay malinaw na ito ginagawa? Lamang Ito ay masusuka ito ang layo, at kung ano ko na nakikita ang sa huli ay 0.0 dahil lamang insisted ko na printf ipakita sa akin ang isang decimal point. Ngunit ang problema ay na kung iyong hatiin ang isang integer sa pamamagitan ng isang integer, ikaw get-- sa pamamagitan ng kahulugan C-- ng isang integer. At hindi ito ng pagpunta sa gawin isang bagay na maganda at maginhawang tulad ng pag-ikot hanggang sa ito pinakamalapit na isa pataas o pababa. Ito ay pagpunta sa truncate lahat pagkatapos ng decimal. Kaya intuitively lamang, kung ano ang marahil ng isang remedyo? Ano ang pinakasimpleng fix dito? Oo? Mismong. Bakit hindi ituturing lamang namin ang mga bilang lumulutang na halaga ng point epektibong pagpalit nito sa kamay o doubles. At ngayon kung gagawin ko gumawa sa kamay-0, o kung makatipon ko sa kamay-1, na kung saan ay kapareho ng kung ano ang ipinanukalang lamang. At ngayon gagawin ko sa kamay-0 na, ngayon, nakukuha ko ang aking 0.1. Ngayon ito ay kamangha-manghang. Ngunit ngayon ako pagpunta sa gawin isang bagay na medyo naiiba. Ako malaman upang makita kung ano talaga nangyayari sa ilalim ng hood, at pupuntahan ko upang i-print ito out sa 28 decimal place. Gusto kong makita talaga 0.1000-- isang infinite-- [INAUDIBLE] 27 mga zero pagkatapos na 0.1. Ni makita kung na rin ipaalam kung ano talaga ang nakukuha ko. Gumawa ng kamay-0 parehong file. ./floats-0. Ni-zoom in sa mga dramatic na sagot Hayaan. Ang lahat ng mga oras na ito, mo pa-iisip 1 hinati sa 10 ay 10%, o 0.1. Hindi ito. Hindi bababa sa ngayon bilang computer aalala. Ngayon why-- OK, na kumpleto kasinungalingan 1 hinati sa 10 ay 0.1. Ngunit why-- na hindi ang takeaway ngayon. Kaya bakit ang computer na sa tingin, hindi katulad sa ating lahat sa room, 1 na hinati sa 10 ay aktwal na mabaliw halaga? Ano ang computer na paggawa tila? Ano iyan? Hindi ito mapuno, per se. Overflow ay karaniwang kapag balutin mo sa paligid ng isang halaga. Ito ay ang isyu na ito ng imprecision sa isang lumulutang na halaga punto kung saan mayroon kang 32 lamang o maaari ring maging 64 bit. Ngunit kung mayroong isang walang-katapusang bilang ng mga real numbers-- mga numero sa decimal point at numero thereafter-- tiyak hindi mo maaaring kumatawan sa lahat ng mga ito. Kaya ay nagbigay ng computer na amin ang pinakamalapit na tugma sa halagang maaari itong kumatawan sa paggamit na maraming mga bits sa aktwal na halaga ko gusto, na kung saan ay 0.1. Sa kasamaang palad, kung ikaw simulan ang paggawa sa matematika, o mo simulan na kinasasangkutan ng mga ganitong uri ng lumulutang mga halaga ng point sa mahalagang programs-- pinansiyal na software, militar software-- anumang bagay kung saan pagdama ay marahil medyo mahalaga. At nagsimula ka ng pagdaragdag mga numero tulad nito, at pagsisimula tumakbo ang software na may talagang malaking input o para sa maraming mga oras o maraming ng araw o ng maraming taon, mga maliliit na maliit na mga pagkakamali tiyak maaaring magdagdag ng hanggang sa paglipas ng panahon. Ngayon bilang isang bukod, kung hindi mo kailanman Nakita Superman 3 o Office Space at maaari mong isipin paano mga guys nakaagaw ng maraming pera mula sa kanilang computer sa pamamagitan ng paggamit lumulutang na mga halaga ng point at pagdaragdag ng hanggang sa maliit na remainders, sana na pelikula ngayon ay gumagawa ng higit pang kahulugan. Ito ay kung ano sila ay alluding sa sa na pelikula. Ang katotohanan na ang karamihan kompanya ng hindi magiging ganito ang pagkatapos ng isang tiyak na bilang ng decimal place, ngunit ang mga ito ay mga fraction ng sentimo. Kaya magsisimulang mo pagdaragdag up ang mga ito, simulan mo upang gumawa ng maraming pera sa iyong bank account. Kaya na ipinaliwanag Office Space. Ngayon sa kasamaang-palad lampas Office Space, mayroong ang ilang mga lehitimong mag-troubling at makabuluhang epekto ng mga ganitong uri ng nakapailalim na mga pasya sa disenyo, at sa katunayan isa sa mga dahilan ginagamit namin C sa kurso ay kaya na talagang mayroon ka na ng lupa up pag-unawa sa kung paano gumagana ang mga computer, kung paano gumagana ang software, at huwag tumagal ng anumang bagay para sa ipinagkaloob. At sa katunayan sa kasamaang-palad, kahit na may na pangunahing pag-unawa, namin tao gumawa ng mga pagkakamali. At kung ano naisip ko na nais kong ibahagi ay dito kinuha ito walong minutong video mula sa isang Modern Marvels episode, na isang palabas na pang-edukasyon sa kung paano gumagana ang mga bagay na paints dalawang mga larawan ng kapag ang isang hindi tamang paggamit at pag-unawa ng lumulutang na halaga ng point na humantong sa ilang mga makabuluhang unfortunate resulta. Tingnan natin ang isang hitsura. [VIDEO pag-playback] -We Ngayon bumalik sa "Engineering Sakuna "sa Modern Marvels. Mga Computer. Lahat na dumating namin upang tanggapin ang madalas na nakakabigo problema na Nakakuha may them-- mga bug, mga virus, at software glitches-- para sa maliliit na mga presyo magbayad para sa kaginhawahan. Ngunit sa mataas na tech at high speed militar at espasyo application programa, ang pinakamaliit na problema maaari ay Pinalaking sa kalamidad. Sa Hunyo 4, 1996, naghanda ng mga siyentipiko na maglunsad ng isang unmanned Ariane 5 rocket. Ito ay pagsasakatuparan ng pang-agham satellite dinisenyo upang magtatag tiyak kung paano ang Magnetic field na nakikipag-ugnayan Earth may solar wind. Rocket ay ginawa para sa European Space Agency, at itinaas-off mula sa pasilidad nito sa baybayin ng French Guiana. -At Tungkol sa 37 segundo sa sa flight, sila muna Napansin ng isang bagay ay pagpunta mali. Na ang nozzles ay swiveling sa paraang sila talaga dapat hindi. Sa paligid ng 40 segundo sa paglipad, malinaw na ang sasakyan ay may problema, at iyon ang kapag ginawa nila ang desisyon upang wasakin ito. Ang hanay kaligtasan opisyal, may napakalaking tapang, napindot ang pindutan ng at blew up ang rocket bago ng dati maging isang panganib sa kaligtasan ng publiko. -This Ay ang pagkadalaga paglalayag ng Ariane 5, at kinuha pagkasira nito ilagay dahil sa flaw naka-embed sa software ng rocket ni. -Ang Problema sa Ariane ay na mayroong ay isang numero na kinakailangan 64 bits upang ipahayag, at ninais nilang i-convert ito sa isang 16-bit na numero. Sila ay ipinapalagay na ang numero ay hindi kailanman pagpunta sa maging napaka-malaki. Na karamihan sa mga digit sa ang 64-bit na numero ay zero. Sila ay mali. -Ang Kawalan ng kakayahan ng isa software program upang tanggapin ang uri ng numero na nabuo sa pamamagitan ng isa pa ay sa root ng kabiguan. Sa pagbuo ng software ay naging isang napaka magastos na bahagi ng bagong teknolohiya. Ang Ariane 4 rocket ay nagkaroon ng naging napaka matagumpay. Kaya magkano ng software na nilikha para sa ito ay ginagamit din sa Ariane 5. -Ang Pangunahing problema ay na ang Ariane 5. Ay faster-- mas mabilis pinabilis, at ang software ay hindi accounted para doon. -Ang Pagkawasak ng rocket ay isang malaking sa pananalapi kalamidad. Ang lahat ng mga sanhi ng error sa minutong software. Ngunit hindi ito ay ang unang oras ng mga problema sa conversion data ay plagued modernong teknolohiya rocket. -In 1991 sa pagsisimula ng unang Gulf War, ang Patriot misayl ay nakaranas ng isang katulad na uri sa isang problema bilang conversion. At bilang resulta, 28 people-- 28 Amerikano soldiers-- ay pinatay, at tungkol sa isang daang iba nasugatan. Kapag ang Patriot, na dapat upang maprotektahan laban sa mga papasok na Scuds, ang nabigong mag-sunog isang misayl. -When Iraq invaded Kuwait, at Amerika Inilunsad Disyerto ng Bagyo sa unang bahagi ng 1991, Bayani misayl baterya ay deploy upang protektahan ang Saudi Arabia at Israel mula sa pag-atake ng Iraqi Scud misayl. Ang Patriot ay isang US medium-range na ibabaw-to-air sistema manufactured sa pamamagitan ng kumpanya Raytheon. -Ang Laki ng Patriot interceptor itself-- ito ay tungkol sa halos 20 talampakan ang haba, at ito weighs tungkol sa £ 2000. At ito ay nagdadala ng isang warhead ng tungkol sa, Sa tingin ko ito ay halos £ 150. At ang warhead mismo ay ang isang mataas na paputok, na May mga fragment sa paligid sa kanya. Kaya ang casing ng warhead ay dinisenyo upang kumilos tulad ng isang buckshot. -Ang Missiles ay dinala apat bawat lalagyan, at transported sa pamamagitan ng isang semi trailer. -Ang Patriot anti-misayl sistema napupunta pabalik ng hindi bababa sa 20 taon na ngayon. Ito ay orihinal na idinisenyo bilang isang air pagtatanggol misayl upang shoot down na kaaway eroplano. Sa unang Gulf War kapag digmaan na nagmula sa, ang Army nais gamitin ito upang shoot down na Scuds, hindi eroplano. Ang Iraqi Air Force noon ay hindi kaya magkano ng isang problema, ngunit ang Army ay nag-aalala tungkol sa Scuds. At kaya sinubukan nilang i-upgrade ang Patriot. -Intercepting Isang kaaway misayl na naglalakbay sa Mach 5 ay pagpunta sa ay sapat Hinahamon. Ngunit kapag ang Patriot ay rushed sa serbisyo, ang Army ay hindi magkaroon ng kamalayan ng isang Iraqi pagbabago na ginawa ang kanilang scuds halos imposibleng ito. -What Nangyari ay ang Scuds na ay darating sa mga hindi matatag. Sila ay wobbly. Ang dahilan sa ito ay ang Iraqis-- sa pagkakasunud-sunod upang makakuha ng 600 kilometro out ng isang 300-kilometro hanay ng missile-- kinuha timbang sa labas ng front warhead, at ginawang mas magaan ang warhead. Kaya ngayon ang Patriot ng sinusubukan na dumating sa Scud, at karamihan sa mga time-- napakatinding karamihan ng mga time-- ito ay lumipad sa pamamagitan lamang ng mga Scud. -Once Ang sistema ng mga operator Patriot natanto na hindi inaabot ang Patriot target nito, sila mina warhead ang Patriot ni upang maiwasan ang mga posibleng casualties kung ito ay pinapayagang mahulog sa lupa. -That Ay kung ano ang nakita karamihan ng mga tao bilang malaking fireballs sa kalangitan, at gusot bilang intercepts ng Scud warheads. -Although Sa gabi na kalangitan, Patriots nagpakita sa matagumpay na pagsira Scuds, sa Dhahran, maaaring walang pagkakamali tungkol sa pagganap nito. May radar sistema ang Patriot ni nawala ang pagsubaybay ng isang papasok na Scud at hindi kailanman Inilunsad dahil sa isang software flaw. Ito ay ang Israelis na unang natuklasan na kung mas matagal ang system ay noong, ang mas malaki ang naging pagkakaiba sa oras. Dahil sa isang orasan na naka-embed sa computer ng system. -About Dalawang linggo bago ang trahedya sa Dhahran, ang Israelis iniulat sa ang Defense Department na ang system ay nawawalan ng oras. Matapos ang tungkol sa walong oras ng pagtakbo, napansin nila na ang system na magiging kapansin-pansing hindi gaanong tumpak. Ang Defense Department tumugon sa pamamagitan ng na nagsasabi sa lahat ng mga baterya Patriot upang hindi iwan ang mga sistema ng sa para sa isang mahabang panahon. Hindi kailanman sila ay sinabi kung ano ng mahabang panahon ay. 8 oras, 10 oras, isang libong oras. Alam Walang sinuman. -Ang Baterya Patriot stationed sa kuwartel sa Dhahran at ang mga flawed panloob orasan ay hindi naging sa para sa higit sa 100 oras sa gabi ng Pebrero 25. -It Sinusubaybayan oras sa isang katumpakan ng tungkol sa 1/10 ng isang segundo. Ngayon 1/10 ng isang segundo ay isang kawili-wiling mga numero dahil hindi ito maaaring ipinahayag sa binary eksakto, na nangangahulugan hindi ito maaaring ipinahayag nang eksakto sa anumang modernong digital computer. Ito ay mahirap na paniwalaan, ngunit gamitin ito bilang isang halimbawa. Tingnan natin ang bilang isang-katlo. Isang-katlo ay hindi maaaring maging ipinahayag nang eksakto sa decimal. Isang-katlo ay .333 pagpunta sa para sa infinity. Walang paraan upang gawin na may ganap na kawastuhan sa isang decimal. Iyon ang eksaktong ng uri ng problema na nangyari sa Patriot. Pinatatakbo ng mas mahabang system, ang mas masahol pa ay naging ang error oras. -After 100 oras ng pagpapatakbo, ang error sa panahon noon ay lamang tungkol sa isang-katlo ng isang segundo. Ngunit sa mga tuntunin ng pag-target sa isang misayl na naglalakbay sa Mach 5, ito nagresulta sa pagsubaybay error ng higit sa 600 metro. Ito ay maging isang malalang error para sa mga sundalo sa Dhahran. Nangyari -What ay isang paglunsad Scud noon ay nakita ng maagang babala satellite, at alam nila ang isang Scud ay darating sa kanilang pangkalahatang direksyon. Hindi nila alam kung saan ito ay darating. Ito ay ngayon hanggang sa radar component ng Patriot sistema pagtatanggol Dhahran upang mahanap at mapanatili ang subaybayan ang mga papasok na misayl kaaway. -Ang Radar noon ay napaka-smart. Gusto talaga ito subaybayan ang posisyon ng Scud at pagkatapos ay hulaan kung saan marahil ito ay magiging sa susunod na oras ang Ipinadala ang radar ng pulso out. Iyon ay tinawag ang hanay ng gate. -Then Sa sandaling ang Patriot Nagpasya ng sapat na panahon ay pumasang upang bumalik at suriin ang susunod na lokasyon para sa Nakita bagay ito napupunta pabalik. Kaya kapag ito nagpunta pabalik sa maling lugar, makakakita nito pagkatapos ay walang mga bagay. At ito ay nagpasiya na walang bagay. Na nagkaroon ng isang maling pag-detect at ito ay bumaba ang track. -Ang Papasok na Scud naglaho mula sa screen ng radar, at segundo sa ibang pagkakataon, ito slammed sa kuwartel. Ang Scud pinatay 28. Ito ay ang huli fired sa loob ng unang Digmaang Gulf. Tragically, ang na-update ng software Dumating ito sa bukang-liwayway sa susunod na araw. Ang software flaw nagkaroon naging nakapirming, pansarang tag na isa kabanata sa Problema kasaysayan ng Patriot misayl. [END VIDEO pag-playback] David J. MALAN: Iyon lang para sa CS50. Makikita natin sa iyo sa Miyerkules. [Musika nagpe-play]