[Powered by Google Translate] [Java 2, vazhdoi] [David J. Malan, Universiteti i Harvardit] [Kjo është CS50. - CS50.TV] Dakord. Kjo është CS50, dhe kjo është fundi i javës së 2. Nëse ju presin që të jenë të uritur rreth kësaj kohe nesër, e di se ne do të mblidhet nesër si një grup i vogël, e enjte, 13:15. Nuk është kjo URL këtu nëse ju dëshironi të RSVP. Hapësira është e kufizuar, kështu që ju lutemi falë nëse formulari është plotësuar nga koha që ju të plotësoni këtë. Një tjetër URL, edhe pse, që mund të jetë me interes është kjo. Në vetëm rreth një muaj, kursi do të vihen në dispozicion gjithë më gjerësisht nëpërmjet EDX, nëpërmjet të cilës folks në internet do të jetë në gjendje të ndjekin së bashku, angazhohen në kursin mjaft aktive, në fakt. Ata do të jenë duke përdorur aplikim CS50 dhe CS50 Diskutoni dhe shumica e mjeteve software të ndryshme që ne tashmë kanë përdorur këtë semestër. Dhe një nga nismat që ne do të donim për të marrë si një eksperiment këtë vit është për të parë se sa ne mund të përkthejnë përmbajtjen në gjuhë të tjera të folura dhe të shkruara. Pra, nëse ju mund të ketë një interes në pjesëmarrjen në këtë projekt ku ne do të sigurojë transkriptin anglisht dhe titra per leksione kursin e dhe pantallona të shkurtra dhe seminaret dhe seksionet dhe si, në qoftë se ju flisni rrjedhshëm ose shkruani rrjedhshëm gjuhën ndonjë tjetër, ne do duam te angazhohen ju në këtë projekt ku ju marrë në një ose më shumë prej videos, përkthimin e tyre në gjuhën që ju e dini mjaft mirë. Për të ju jap një ndjenjë të ndërfaqes, nuk është kjo web-based user interface se ne do të jetë duke përdorur që do të krijojë një thelb UI si kjo. Kjo është më mësim disa Halloween më parë, dhe në anën e djathtë atje në të zezë e ardhshëm të këtyre vulave kohore, ju do të shihni gjëra të ndryshme që erdhi nga goja ime atë ditë, dhe pastaj më poshtë atë që ju do të jetë në gjendje për të përkthyer në disa gjuhë të tjera pikërisht ajo që është në mes të hartës, në këtë rast, anglisht dhe, të themi, spanjisht. Pra, kjo është në fakt një shumë përdorues-miqësor mjet. Ju mund të Rewind dhe të shpejtë përpara shumë lehtë me shkurtesat e tastierës. Pra, nëse ju do të donte për të marrë pjesë në këtë eksperiment dhe kanë fjalët e tua shihet dhe të lexoni nga potencialisht mijëra njerëz atje, ju lutem mos ngurroni për të marrë pjesë. Një fjalë në lidhje me kotele nga e hëna. Mos kemi dërguar një mesazh tepër të frikshme, nuk e kuptojnë se, si orë sugjerojnë zyra dhe si seksione sugjerojnë, dizajni i kursit është shumë që kanë studentët bashkëpunuar dhe duke folur për të punuar me grupe të problemeve dhe problemet së bashku, dhe me të vërtetë të vijë vetëm vjen poshtë për të, përsëri, puna që në fund të fundit duhet të jenë të paraqesë tuaj. Dhe kështu mjaft ndershmëri, në orët e zyrës kjo është krejtësisht normale, ajo tërësisht do të pritet edhe, për të biseduar me disa mik tjetër për ju. Nëse ai ose ajo po lufton me një farë teme dhe ju jeni si, "Oh, mirë, më lejoni t'ju jap një paraqitje e shkurtër e disa linjë të kodit që kam shkruar," kjo është në rregull, që ndodh, dhe kjo është shumë e favorshme, unë mendoj se, me procesin e të mësuarit. Ku linja merr kaluan është kur koka është lloj i tilted mbi këtu për sekonda më shumë shumë ose minuta për këtë të vërtetë të ketë qenë vetëm një mundësi për zhbllokimin mikut tuaj, dhe sigurisht kur gjërat merrni shkëmbehet nëpërmjet postës elektronike dhe Dropbox dhe si, atje është linjë. Pra, me të gjitha mjetet të ndjehen rehat dhe të ndjehen të inkurajuar për të biseduar me miqtë dhe shokët e klasës për psets dhe më shumë dhe vetëm të kuptojë se ajo që ju në fund të fundit të paraqesë duhet të vërtetë të jetë produkt i krijimit tuaj dhe jo dikush tjetër. Dhe kështu një nga domain-specifike probleme për pset2, e cila do të dalë natën vonë nesër, është që të zhyten në botën e kriptografisë, e cila është arti i encrypting ose përpiqen informacion, dhe kjo në fund të fundit ka të bëjë me botën e sigurisë. Tani, sigurie për më nga ne vjen në formën e mekanizmave mjaft mondane. Të gjithë ne kemi përdoruesve dhe fjalëkalimet, dhe të gjithë prej nesh kanë shumë të këqija përdoruesve dhe fjalëkalimet, ka shumë të ngjarë. Nëse fjalëkalimi juaj është i njëjtë në faqet e internetit të shumta, që ndoshta nuk është ide e mirë, si ne do të diskutuar drejt përfundimit Semestri-së. Nëse fjalëkalimi juaj është i shkruar në një shënim ngjitet - nuk është shaka - në monitorimin tuaj, se shumë nuk është domosdoshmërisht dizajn të mirë, por një fenomen mjaft të zakonshme. Dhe në qoftë se ju nuk jeni duke përdorur për të encrypt passwords kriptografinë tuaja, ata janë veçanërisht të pambrojtur. Pra, nëse ju mendoni se ju jeni duke u super i zgjuar nga të paturit e një dokument Word fshehur diku në hard drive tuaj që i ka të gjitha fjalëkalimet tuaja por kjo është në një dosje që askush nuk do të shikoni në, se edhe nuk është një mekanizëm shumë të sigurt. Dhe kështu ajo do të prezantojë pset2 është ky art i cryptography dhe përpiqen informacion në mënyrë që gjëra të tilla si fjalëkalimet janë të gjitha më i sigurt. Konteksti këtu është se me të dhëna të pasigurta vjen një mundësi për të encrypt atë dhe të përpiqen atë. Dhe kështu kjo, për shembull, është një shembull i një mesazhi të koduar. Ky fakt thotë diçka në gjuhën angleze, por kjo nuk është tërësisht e qartë të dukshme. Dhe ne do të vijnë rreth të plotë sot për të ngas përveç asaj që ky mesazh sekret këtu është. Por në botën e vërtetë të kompjuterëve, gjërat nuk duken edhe si ata mund të jenë fraza anglisht. Për shembull, kjo është ajo që ju mund të gjeni në një Linux ose Mac standarde ose UNIX kompjuter në një skedar që ishte njëherë e një kohë i quajtur file fjalëkalimi. Sot ajo është lëvizur në vende të tjera. Por në qoftë se ju shikoni në vendin e duhur në një sistem, ju do të shihni jo vetëm emrin tënd ose se njerëz të tjerë në sistem, por ju do të shihni një version të koduar fjalëkalim të tyre. Në të vërtetë, fjala Crypt there sugjeron se stuff vijim është koduar, dhe kjo seri e në dukje të rastit shkronja dhe karaktere dhe numrat dhe kështu me radhë mund të decrypted vetëm nga zakonisht ditur disa sekrete - një fjalë të fshehtë, një numër i fshehtë - dhe kështu në të vërtetë, arti i kriptografisë përfundimisht boils poshtë për të besimit e disa lloj dhe duke ditur diçka që dikush tjetër nuk e bën. Pra, ne do të shqyrtojë këtë në hollësi pak më sot dhe në pset që do të vijnë. Dhe tani një fjalë të kalojë / dështojnë. Sidomos si disa prej jush kanë fetar në pset1, aplikim, dhe një botë shumë i ri për veten, të kuptojnë se frustrimet dhe hutia dhe vetëm vështirësitë teknike janë mjaft të pritet, sidomos me pset parë, ku ka vetëm aq shumë e re, vetëm duke u njohur me ls dhe CD dhe të gjitha këto komanda misterioze dhe një mjedis të ri, dhe kjo është ndarë nga materiali faktik dhe programimin e vetë. Pra, të kuptojnë gjithashtu se nuk janë me siguri orarit të punës që ekzistojnë si një strukturë mbështetëse. Seksione të fillojnë këtë të dielë vjen. Por më e rëndësishmja, në qoftë se ju jeni ndjeheni vetëm se kjo nuk është bota për ju, kuptojë se ai me të vërtetë ka vetëm të marrë kohë. Dhe po të mos ishte për këtë mundësi vjet më parë për mua që të marrë një abone të klasit / dështojnë, sinqerisht, unë kurrë nuk do të kishte vendosur edhe këmbë në klasë. Dhe ju mund ta ndryshoni këtë deri në, të themi, të hënën e pestë e natyrisht, kështu që nëse ju jeni në buzë tani, të kuptojë se në vend se kreu në disa ujëra të tjera krejt, sigurisht nuk e konsiderojnë vetëm ndryshimin për të kaluar / dështojnë. Përsëri, nuk është e vërtetë kjo kulturë këtu në Harvard që të marrë gjëra të kalojë / dështojnë Që të gjithë me të vërtetë dëshiron të arrijë apo të overachieve, por sinqerisht, kjo është një mënyrë e mrekullueshme e duke u përpjekur diçka jashtë që nuk mund të jenë të njohura për ju, dhe ju do të përfundojë duke bërë, në shumicën e rasteve, mjaft mirë, ndoshta më shumë për habinë tuaj. Dhe në terma më konkrete, atë që unë mendoj se të kalojë / dështojnë në përgjithësi e bën, sidomos si ju mund të keni përjetuar me pset0, në qoftë se ju vendosni në 10 orë, 15 orë, 25 orë në disa pset dhe ju jeni vetëm banging kokën tuaj kundër murit dhe ajo është duke u super natën vonë por ju keni marrë pset 90% të rrugës dhe ju thjesht nuk mund ta kuptoj një gjë, kalojë / dështojnë me të vërtetë merr off buzë e një klase si kjo, ku ju mund të lloj të lumtur të them: "Mirë, unë e di se nuk është e përsosur, por kam punuar jashtë ass tim për këtë, unë jam goxha i kënaqur me të, ku ai përfundoi, " dhe se do të përmbushë pritjet për kalojë / dështojnë. Pra, do të mbani në mend. Dakord. Pra, ata prej jush që kanë luftuar për të përdorur në Universitetin e Harvardit Wi-Fi, e di se ka një SSID CS50, një Wi-Fi lidhje të, lundrues rreth që ju mund të keni fat më të mirë për të. Kjo është një ironic pak se fjalëkalimi për këtë, në qoftë se ju do të donte të provoni lidh me këtë për shpejtësi më të mirë - dhe le të na tregoni, nëse ajo nuk është e mirë - është 12345, të gjithë rrugën deri në 8 sepse 8 është më e sigurtë se 5. Pra, nëse keni nevojë për fjalëkalim të Wi-Fi, të lidheni me valë CS50 këtu, 12345678, dhe post on CS50 Diskutoni në qoftë se ju ende keni çështje të përhershme të lidhjes, dhe ne do të le pushtetin që të dinë për këtë hapësirë. Dakord. Pra, një ngacmues të shpejtë, sidomos për ato prej jush që janë djem ose vajza tifoz të gjitha gjërat Apple. Ajo që unë nxorën nga disa vite mbrapa ishte këtë fotografi këtu, iUnlock.c, vetëm për llojin e bërë më konkrete dhe më kompleks disa prej programeve më themelore C ne kemi qenë të shkruar. Kështu që unë u hap këtë skedar, iUnlock.c. Është në dispozicion në faqen e leksioneve për sot. Në anën e majtë ju shihni një listë të gjatë të funksioneve. Pra shokët që shkroi këtë shkroi një shumë të funksioneve, më shumë se vetëm kryesor. Ai përdori një bandë e tërë e bibliotekave këtu, dhe nëse ne fillojmë me anë Scroll, çka ky fakt është është shumë i parë, unë besoj, plas për iPhone origjinal. Kur ju të kërkuar për të jailbreak iPhone origjinal, që do të thotë untether atë nga AT & T dhe në fakt instaluar programi të veçantë mbi të dhe të bëjë gjëra që Apple nuk duan njerëzit për të bërë, dikush mori kohë të kuptoj se saktësisht se si ata mund të shfrytëzojnë difekte software, gabime, bugs në software, Apple, dhe kështu lindi iUnlock.c-- se në qoftë se ju të hartuar atë në kompjuterin tuaj dhe instaluar atë në një iPhone që ishte i lidhur me kompjuterin tuaj nëpërmjet, të themi, një kabëll USB, kjo do t'ju japë privilegje administrative ose rrënjë në iPhone tuaj dhe le të ju bëjë shumë e shumë çdo gjë që ju dëshironi. Dhe kështu ka qenë kjo mace interesante dhe lojë miun mes Apple dhe pjesës tjetër të botës, në veçanti, si ata, si shumë kompani, të përpiqet të bllokoj stuff e tyre poshtë në mënyrë që ju mund ta bëni vetëm me atë që ata duan. Por në sajë të njerëzve si kjo dhe të kuptuarit e nivelit të ulët detaje - dhe në këtë rast C programimit - dhe një shumë e ndërton njohur që ne kemi filluar të luajë me të, ju jeni në gjendje me të vërtetë të levave hardware në një mënyrë që ju të shihni të arsyeshme dhe jo domosdoshmërisht një entitet të korporatave. Kështu për shembull, unë nuk kam asnjë ide se çfarë e gjithë kjo është bërë, por GetVersion tingëllon mjaft i hapur, dhe kjo duket si kjo është një funksion që ky person ka shkruajtur. Ajo merr disa lloj numër të plotë, si një argument, nuk ka kthim asgjë, por duket se lak me një për lak këtu dhe një kusht, nëse, nëse pushim kusht, dhe disi lidhet me numrat version nëse lëvizni poshtë, edhe pse shumë nga këto fjalë kyçe do të jetë e re. Dhe ka një tërësi shumë të funksioneve në këtu ne kurrë nuk kam parë dhe nuk mund të shihni ndonjëherë mbi rrjedhës së semestrit. Në fund të ditës, ajo ndjek të njëjtat rregulla dhe logjikën që ne kemi qenë duke luajtur me deri tani. Pra, kjo është shumë e vjetër për të goditur 3s tuaj iPhone 4S ose ose së shpejti 5s këto ditë, por e di se kjo është e gjitha shumë që rrjedhin nga kjo botë që ne kemi fetar në. Le të marrin një vështrim në një shembull pak më thjeshtë: kjo, vetëm për të marrë ngrohur me disa sintaksë dhe gjithashtu disa të dhëna të tjera lloji se ne kemi biseduar rreth, por nuk e kam parë të vërtetë në C. Kjo është një file i quajtur positive1.c, dhe sipas komenteve në krye, kjo vetëm kërkon që një përdorues të sigurojë një numër pozitiv. Pra, kjo është një shembull i një lak për ta bërë, ndërsa, e cila është e bukur për programet përdorues interaktive ku keni nevojë për të të treguar e përdoruesit për të bërë diçka, dhe në qoftë se ata nuk bashkëpunojnë me ta ju bërtas apo refuzojnë kontributin e tyre. Rasti në pikën: Unë jam duke shkuar për të bërë linjat e 19 nëpërmjet 24 për aq kohë sa përdoruesi nuk ka dhënë mua një numër pozitiv. Ky detaj këtu on line 18, pse nuk kam deklaruar n mbi këtë looping tërë ndërtimin në krahasim me të drejtë tjetër të linjës 22, ku unë në fakt e kujdesit për të marrë n? Po. [Student] fushës. Po >>, kështu që kjo çështje të fushës. Dhe në kushtet e laik, çfarë do qëllimi i referohen? Po. >> [Përgjigja e padëgjueshme Studenti] >> A mund të flisni pak louder? [Student] Ku ju mund të hyni në atë ndryshore. Perfect >>. Ku ju mund të hyni në një variabël të veçantë. Dhe në përgjithësi, sundimi i gishtit deri tani ka qenë se qëllimi i disa ndryshore është përcaktuar nga formatimin e teksteve kaçurrel më të fundit që e keni parë. Dhe kështu në këtë rast, në qoftë se kam bërë gabim të deklarimit n on line 22, që linja do të punojë. Unë do të merrni një int, dhe unë do të vënë atë në atë n ndryshueshme në linjë 22, por të cilat linjë e kodit tani do të ketë asnjë ide se çfarë unë jam duke folur për? >> [Student] 25. [Malan] 25, dhe ajo rezulton 24 si edhe për shkak se në këtë rast ajo bie jashtë formatimin e teksteve kaçurrel. Pra, vetëm pak një njeri i bezdisur, por zgjidhen shumë lehtë nga thjesht deklaruar variabël jashtë funksionit vetë. Ne do të shohim më vonë sot ju mund të shkoni një hap më tej dhe ju mund të merrni edhe pak dembel. Dhe kjo nuk është për të rekomanduar në përgjithësi, por ju mund të merrni edhe dembel dhe të vënë një ndryshore globale, kështu që të flasin, jo brenda një funksion, jo brenda një lak, por në dosjen e vetë, jashtë të gjitha funksionet që ju keni shkruar, siç kam bërë këtu në linjë 15. Kjo është në përgjithësi frowned, por të kuptojë kjo është një zgjidhje ndonjëherë për probleme të tjera, si ne do të shohim përfundimisht. Pra, tani për tani ne do të lënë atë si kjo, por le të shohim nëse ne mund të ndryshonin këtë vetëm për të filloni të shprehur veten pak ndryshe. Ky program, vetëm të jetë i qartë, është positive1. Më lejoni të shkojnë përpara këtu dhe në dritaren time terminalit të bëjë positive1, Enter. Harton rregull. Unë jam duke shkuar për të drejtuar positive1, hit Enter. Unë të kërkojë që ju të jepni një numër i plotë pozitiv. Unë do të them -1. Që nuk punojnë. 0, 99. Kjo duket për të punuar. Ndoshta jo testi më rigoroze, por të paktën kjo është një kontroll mendje e shëndoshë e bukur se ne jemi në rrugën e duhur. Kështu që tani më lejoni të shkoj përpara dhe të hapur versionin 2 të kësaj, dhe çfarë është e ndryshme tashmë? Ajo zbaton të njëjtën gjë, por ajo është hedhur jashtë si kohë të ndryshme në mënyrë të qartë këtë? Kjo bool në të gjelbër. Kjo është theksuar në jeshile, ky fjalen njohur si bool, e cila është një lloj të dhënave. Ajo nuk vijnë të ndërtuar në të gjitha versionet e C. Ju duhet të përfshijnë një bibliotekë të veçantë. Në rastin tonë, unë përfshirë bibliotekën CS50 në mënyrë që ne të kenë qasje në bool. Por në linjë 18, ne duket të ketë një vlerë Boolean këtu quhet mirënjohës. Unë mund të ketë e quajti këtë gjë, por unë e quajti atë mirënjohës vetëm për disa lloj të përcjellë kuptimin semantik. Pra, fillimisht on line 18, unë nuk jam mirënjohës duket sepse vlera Boolean mirënjohës është initialized të rreme në linjë 18. Dhe pastaj ajo duket ajo që unë kam bërë këtu në linjat e 21 nëpërmjet 23 po unë kam vetëm lloji i rishkruar logjikën time. Pra nuk ka funksionalisht të ndryshme, por në përputhje 22 tani unë kontrolloni nëse int përdorues ka dhënë është më e madhe se 0, atëhere unë thjesht të ndryshojë vlerën e mirënjohës për të vërteta. Dhe pse ta bëj këtë? Sepse në linjë 25, me sa duket unë jam duke shkuar për të kontrolluar një kusht. Bëni këtë lak, ndërsa mirënjohës është e rreme. Kështu që unë propozuar këtë si një alternativë ndaj Version 1 sepse kjo është të paktën një pak më shumë intuitiv ndoshta, kjo është pak më shumë bazuar në gjuhën angleze. Pra, nuk e mëposhtme, ndërsa ju nuk jeni mirënjohës ose mirënjohës, ndërsa është e rreme. Dhe këtë herë edhe unë me sa duket nuk e kujdesit për të kujtuar se çfarë përdoruesit shtypur në sepse nuk ka asnjë njoftim n ndryshueshme, kështu që në fakt, një gënjeshtër e vogël të bardhë atje. Funksionalisht, programi është pak më ndryshe sapo të marrë në fund të saj sepse unë nuk jam duke kujtuar se çfarë është n. Por unë të kërkuar për të demonstruar edhe këtu se edhe pse ne kemi parë GetInt dhe getString duke u përdorur në anën e djathtë të një është e barabartë me shenjë deri tani kështu që ne kujtojmë vlerën, teknikisht, që nuk është e domosdoshme. Nëse për çfarëdo arsye ju thjesht nuk bëni kujdes për të ruajtur vlerën, ju vetëm doni të kontrolloni vlerën, vini re se ne thjesht mund të shkruaj këtë si GetInt, hapur prindërve, prindërve afër. Se funksioni do të kthehen një vlerë, si ne kemi qenë të thënë. Kjo do të ju jap përsëri një int. Dhe kështu që nëse ju mendoni mentalisht për të ndodhur kjo, kur unë lloji në 99, GetInt kthen numrin 99, dhe kështu konceptualisht, është sikur kodi im ishte në fakt këtë. 99 Pra, nëse është me të vërtetë e madhe se 0, atëherë bëhet e vërtetë mirënjohës, atëherë Shkarko 25 realizon ooh, ne jemi duke bërë, sepse unë jam tani mirënjohës, dhe në përputhje 26, ne thjesht themi, "Faleminderit për numër i plotë pozitiv!" çfarëdo qoftë ajo që ndodhi të jetë. Tani le të bëjmë sheqer lehtë sintaktik këtu, në mënyrë që të flasin. Le të shohim nëse ne mund të pastër deri këtë linjë 25 me këtë variant të tretë dhe të fundit në positive3. Njoftim I vetmi ndryshim tani është ajo linjë e kodit? >> [Student] 25. >> [Malan] Yeah, 25. Dhe ne nuk e kemi parë këtë mashtrim të vërtetë vetëm ende, por ne nuk shohim pikë thirrje të hënën, i cili tregon se çfarë? >> [Student] Jo. Apo jo >> mohimi. Pra, të marrë një vlerë Boolean dhe rrokullisje vlerën e saj. Vërtetë bëhet rreme, i rremë bëhet e vërtetë. Pra, kjo, unë do të propozojë, është edhe një pak më shumë intuitiv një mënyrë e të shkruarit kodin sepse unë ende nisja mirënjohës për të rreme, unë ende nuk e mëposhtme, I vendosur për të vërtetë mirënjohës kur të vjen koha, por tani ju mund të vërtetë vetëm përkthejnë këtë kod lënë me gojë në të djathtë, ndërsa (mirënjohës!), sepse zhurmë apo thirrje pika nënkupton nocionin e jo kështu ndërsa nuk mirënjohës. Pra, përsëri, ne nuk kemi futur ndonjë koncepteve të reja në vetvete. Ne biseduam rreth Booleans mbrapa, kur ne kemi luajtur me Scratch, por kupton tani ne vetëm mund të filloni të shkruani kodin tonë në shumë mënyra të ndryshme. Pra, veçanërisht në qoftë se ju jeni pset1 lloj luftuar për të kuptoj rrugën për të shkruar një program, Shanset janë që ju jeni me fat, sepse nuk mund të jetë çdo numër të zgjidhjeve që ju të mund të ndodhë pas. Për shembull, kjo është vetëm 3 për edhe më të thjeshtë e programeve. Dakord. Dhe tani kujtojnë të hënën kemi lënë në këtë shënim me vlerat e kthimit. Pra, për herë të parë kemi shkruar një program që nuk ka vetëm kryesor; ajo gjithashtu ka vet funksionin e saj porosi që kam shkruar këtu. Pra, në përputhje me 31 34 Unë e kam zbatuar një funksion kubike. Kjo nuk është komplekse. Kjo është vetëm një * a * a në këtë rast. Por ajo është rëndësishme rreth saj është se jam marrë input në formën e një dhe jam kthyer dalje në formën e një * një * një. Kështu që tani unë kam mundësinë, ashtu si kam përdorur për të me të vetëm prinf, për të thirrur këtë funksion duke thirrur funksionin kubike. Dhe funksioni kubike merr disa të dhëna, dhe funksioni kubike kthen disa dalje. Nga ana tjetër, printf vetëm e bëri diçka. Ajo nuk u kthye asgjë që kujdesej për ne, edhe pse si një mënjanë ajo nuk kthehet një vlerë; ju vetëm në përgjithësi të injorojë atë. Printf vetëm e bëri diçka. Ajo kishte një efekt anësor i shtypjes në ekran. Nga kontrast këtu, ne kemi funksionin kubike, e cila në fakt kthen diçka. Kështu që për ata që të njohur me këtë, kjo është një ide e në mënyrë të drejtë i drejtpërdrejtë. Por për ata më pak të njohur me këtë idenë e kalimit në inputet dhe marrjen e mbrapa rezultatet, le të përpiqemi vetëm e thjeshtë diçka super. Është dikush të rehatshme vijnë në skenë shkurtimisht? Ju duhet të jetë të rehatshme me një aparat fotografik mbi ju si mirë. Po? Rregull. Çfarë është emri juaj? >> [Studenti] Ken. >> Ken. Dakord. Ken, vijnë më up. Ken është duke duke shkuar për të të jetë një funksion në terezi këtu. Le të të shkojnë përpara dhe të bëjë këtë. Le të marrë një dashuroj pak. Gëzohem që u njohëm. Mirë se vini në fazën e qendër. Dakord. Le goditi këtë buton këtu. Dakord. Kështu që këtu ju keni një dërrasë e zezë moderne, dhe atë që unë jam është Funksioni kryesor, për shembull, dhe unë nuk kanë një iPad në dorën time. Unë vërtetë nuk mbani mend se si për të - E pra, unë nuk mund të them se. Unë nuk të vërtetë kanë dorëshkrimit të të mirë, dhe kështu që për këtë arsye që unë dua që ju të shtypura diçka në ekran për mua. Unë jam i të qënit Programi kryesor, dhe unë jam duke shkuar që të ketë që ju them këtë duke shkruar atë në të zeroja tim pule dhe pastaj kalimin e ju një kontributin e tyre. Kështu që silly though ky ushtrim është, nocioni i funksioneve dhe duke bërë thirrje një funksion dhe kthimin e një funksion me të vërtetë boils poshtë për të këtë. Unë jam kryesor i, unë kam shkruar vetëm printf, diçka japin kuotën e-mbyll thonjëzat në ekran, Unë jam running këtë program, dhe të sa më shpejt që printf merr quajtur, ajo merr një argumentin e apo një parametër nganjëherë në mes të kuotat e dyfishtë. Këtu është se argument. Unë jam duke kaluar atë për Ken. Ai është një kuti e zezë shkruar ca numrin e viteve më parë që me sa duket vetëm e di se si për të shtypur gjëra të në ekran. Kështu ekzekutuar. Kjo nuk është e keqe. Shumë të e mirë. Deri tani Ken është bërë ekzekutimin. A ai duhet të japë asgjë prapa? Jo se ne kemi parë kështu tani. Përsëri, printf ka të vërtetë të kthejë një numër të, por ne jemi duke duke shkuar për të injorojnë se për tani sepse ne kurrë nuk kam përdorur atë. Pra, kjo është ajo për Ken. Dhe kështu që tani kryesor i merr përsipër kontrollin e programit të përsëri për shkak që linjë e kodit, printf, është bërë ekzekutuese. Dhe ne do të shkojmë në lidhje me rrugën tonë, ekzekutimin e çfarëdo që linjat e tjera janë atje. Pra, tani le të provojmë një shembull paksa të ndryshme. Këtë herë këtu le të së pari të qartë në ekran, dhe këtë herë ne do të bëjmë funksionin cubing, por këtë herë, unë pres një vlerë të prodhimit. Pra, le të shkojnë përpara dhe të bëjë këtë. Tani unë kanë një linjë e kodit që thotë se x merr cube of x. Linja e kodit, risjell, duket si ky: x = cube (x); Pra, si është kjo do të punojë? Le të të shkojnë përpara dhe do t'ju japë një ekran të të bardhë përsëri. Unë jam duke shkuar për të shkruar poshtë tani vlerën e X, e cila në këtë moment në kohë ndodh të jetë, le të themi, 2 për ta mbajtur atë të thjeshtë. Unë kam shkruar poshtë në një copë letër vlera e të 2, e cila është x im vlera. Unë dore atë për Ken. >> Dhe unë të shkruani vetëm përgjigje? >> Yeah, le të të shkruani vetëm përgjigjen. Rregull. Dhe tani ai ka për të kthyer mua diçka. Përsosur. Bukur Segue. Kështu që tani ai dorëzon mua mbrapa vlerën e 8 në këtë rast, dhe çfarë të bëj me të? Në fakt - le të shohim, të merrni këtë të drejtë. Çfarë jam unë do të bëj me të? Tani unë jam duke shkuar për të marrë këtë vlerë dhe në fakt ruajtur atë në ato bit të njëjta në kujtesës. Por njoftim unë jam i lloj i duke luftuar këtu. Unë jam një pak i hutuar, sepse ku mund unë në fakt shkruaj vlerën e X, për shkak se ajo që unë kam bërë vetëm është Ken fizikisht dora një copë letër që kishte vlerën 2, e cila ishte i x, dhe në të vërtetë, kjo është pikërisht ajo që ka ndodhur. Pra, ajo rezulton jashtë se kur ju të telefononi funksionin dhe ju të kalojë në një argument ashtu si hello, bota ose ju të kalojë në një argument si 2, në përgjithësi, ju jeni duke kaluar në një kopje të të atij argument. Dhe kështu që vetëm si unë shkroi poshtë numrin 2 këtu dhe të i dorëzoi atë për të Ken, që duhet të të thotë se unë ende kanë një kopje të vlerës së 2 diku për shkak se të vërtetë, tani që unë kam gotten mbrapa vlerën 8, kam nevojë për për të shkuar mbrapa në RAM dhe në fakt shkruani poshtë 8 ku kam dikur kishte numrin 2. Pra vizualisht, mbani mend këtë nocion të kalimit në, fjalë për fjalë, një kopje të vlerës. Ken bën gjë e i tij, duart mua mbrapa diçka - në këtë rast një vlerë të si 8 - dhe pastaj unë kam të bëjë diçka me atë vlerë në qoftë se unë doni të mbani atë rreth. Kështu që të gjithë kjo do të të vijnë kthehet për të jetë mbi të gjitha shumë të njohur përpara se të kohë të gjatë. Thank you so much për këtë demo këtu, Ken. [Duartrokitje] Bërë shumë mirë. Le të të shohim se si që përfundimisht lidhet me disa prej funksionit duke bërë thirrje që ne kemi qenë duke bërë këtu. Më lejoni të të shkojnë përpara dhe për të sjellë na përsëri në shembull cubing këtu. Vini re se në qoftë se ne duam që në fakt ka fillojë të marrë këtë më tej, ne jemi duke shkuar të kemi të jenë të ndërgjegjshëm i faktit se x numri që është duke u kaloi në këtu është i ndryshëm nga se çfarë po në fakt duke u kaluar në të funksion. Pra, përsëri, kjo të kalojë nga një kopje do të bëhet mjaft germane në vetëm një moment. Le të marrin një vështrim në diçka që nuk ka fare të drejtë të punojnë ende. Unë jam duke shkuar për të shkuar përpara dhe të hapur një shembull të tretë buggy, e cila është me të meta nga natyra, dhe ajo është quajtur buggy3 dhe zbaton një funksion shkëmbejnë. Këtu kemi një funksion kryesor që ka x dhe y initialized arbitrare të 1 dhe 2, përkatësisht. Ne mund të përdorim GetInt, por ne vetëm duhet një ushtrim të thjeshtë, kështu që është e vështirë-koduar si 1 dhe 2. Në linjat 21 dhe 22, ne duket të shtypura nga X dhe Y, 1 në linjë. Pastaj on line 23, unë jam pretendojnë shkëmbejnë këto vlera, dot, dot, dot. I duket të thirrur një funksion në përputhje 24 swap quajtur që merr 2 argumente. Është krejtësisht legit për funksionet për të marrë 2 argumente. Ne kemi parë printf bëjmë atë tashmë. Pra, me sa duket swap merr X dhe Y, dhe si emrin e saj sugjeron se, Unë do të shpresoj se ajo do të bie në ujdi këto 2 vlera. Pra, atëherë unë pretendojnë on line 25 "Swapped!" dhe unë ribotim x dhe y nën supozimin se ata kanë qenë me të vërtetë swapped. Por në qoftë se unë në fakt të drejtuar këtë program - më lejoni të hapur një dritare terminali, më lejoni të bëjë buggy3 - si emri sugjeron, kjo nuk do të përfundojë mirë sepse kur kam hit Enter, vini re se x është 1, y është 2, dhe ende në fund të programit, ata janë ende, në fakt, të njëjtën gjë. Pra, bazuar në demonstratën vetëm tani me Ken, çfarë po ndodh në të vërtetë? Le pikiatë në këtë funksion swap. Kjo është super të shkurtër. Është vetëm disa rreshta të kodit të gjatë. Por ajo që është problemi themelor i bazuar në histori e thjeshtë tha deri këtu me Ken? Pse është swap thyer? [Student] Ju jeni ruajtjen në një kopje, jo ndryshueshme. Saktësisht. Ne jemi ruajtjen në një kopje, jo variable vetë. Me fjalë të tjera, duket se merr swap 2 argumente, një int, dhe ajo e quajtur arbitrarisht a dhe b, dhe deri këtu unë kam kaluar në x dhe y, të cilat janë respektivisht 1 dhe 2, por unë nuk jam vërtetë kalon në X, unë nuk jam vërtetë kalon në y, Unë jam duke kaluar një kopje e X dhe një kopje të y. Është pothuajse sikur ju kopjohet dhe të ngjit në swap vlerat që ju dëshironi që ajo të vërtetë të manipuluar. Pra, në qoftë se është rasti, kur unë të fillojë programi ekzekutimin e linjës 35 pastaj 36, kur të shkoj në linjë 37, në këtë pikë, në histori, ajo që është vlera e një? Në këtë moment në histori, line 37, çfarë është vlera e një në këtë pikë? >> [Student] 1. [Malan] Ajo duhet të jetë vetëm 1, të drejtë, sepse x kaloi si argumenti i parë, dhe ky funksion vetëm në mënyrë arbitrare është duke bërë thirrje argumentin e saj të parë një. Ngjashëm është y Argumenti i dytë, dhe kjo është vetëm në mënyrë arbitrare duke e quajtur b dytë argument. Kjo dikotomi është në të vërtetë mjaft të shpjegohet thjesht. Mendoni se ajo. Asnjë prej nesh kanë takuar personin i cili shkroi printf, kështu që me siguri, ai ose ajo nuk ka asnjë ide se çfarë variablat tona 30 vjet më vonë do të quhet. Pra, nuk duhet të jetë një dallim në mes të asaj që ju e quani variablave në funksionet që ju jeni me shkrim dhe atë që ju e quani variablave në funksionet që ju jeni duke bërë thirrje ose duke përdorur. Pra, me fjalë të tjera, unë kam shkruar variablave mia si X dhe Y, por në qoftë se dikush tjetër kishte shkruar funksionin swap, ai ose ajo sigurisht nuk do të dinë çfarë variablat e mia do të quhet, në mënyrë të kuptojë se kjo është arsyeja pse ju keni këtë dualitet e emrave. Teknikisht, unë mund ta bëjë këtë duke rastësi, por ata ende do të kalojë në aq kopje. Ajo do të jetë vetëm një rastësi e pastër estetikisht në qoftë se personi i cili shkroi swap kishte përdorur emrat e njëjta. Pra, në këtë pikë në histori, line 37, një është 1, b është 2, dhe tani unë të vazhdojë të bie në ujdi tyre. Para së gjithash, më lejoni të vërtetë ta bëjë këtë shumë më thjesht. Unë nuk e di se çfarë ato 3 rreshta të kodit janë bërë. Më lejoni vetëm të bëjë këtë: b = a; a = b; bërë. Pse është kjo thyera, logjikisht? Kjo është lloj i gjë e intuitive, e drejtë? Pra, një b dhe b bëhet bëhet një, por problemi është se sa më shpejt të linjës 37 ekzekuton, çfarë është vlera e A dhe B? E njëjtë, 1, sepse ju keni clobbered, në mënyrë që të flasin, ju keni ndryshuar b të barabartë a. Pra, një herë Shkarko 37 ka ekzekutuar, që është e madhe, ju tani keni 2 kopje të numrit 1 brenda këtij funksioni, kështu që atëherë kur ju thoni në linjë 38 a = b, ju jeni lloj i dehur, sepse ju jeni vetëm caktimin 1-1. Ju keni lloj i humbur vlerën që kujdesej për. Pra në versionin origjinal të kësaj, njoftim se çfarë kam bërë. Unë në vend që kishte një linjë të tretë të kodit që dukej si kjo. Unë deklaroj një ndryshore të përkohshme. Tmp është një emër shumë i zakonshëm për një ndryshore të përkohshme, dhe kjo është një int sepse ai ka për të përputhen me atë që unë dua të bëjë një kopje të. I ruajtur kopje të një brendësi të tmp, kështu që sapo ka ekzekutuar 37 linja, vlera e një është - kontroll i shpejtë gjendje normale - 1, vlera e b është 2, dhe vlera e tmp është gjithashtu 1. Deri tani unë kryej linjë 38. Pasi Shkarko 38 ekzekuton, një merr mbi vlerën e b. Dhe b ishte 2, kështu një është tani 2. Kështu në këtë pikë në tregimit, një është 2, b është 2, dhe tmp është 1, kështu që tani logjikisht, ne mund vetëm vlera tmp pllum-së në b dhe ne jemi duke bërë. Pra, ne kemi zgjidhur atë problem. Për fat të keq, kur kam drejtuar këtë program në këtë formë, ai nuk ka të vërtetë të bie në ujdi asnjë vlera. Por të jetë i qartë, pse? I fiksuar problemin logjik nga vetëm një moment më parë, por përsëri, në qoftë se unë të drejtuar këtë program, x dhe y të mbeten të pandryshuara deri në fund të ekzekutimit të programit. [Komenti padëgjueshme Studenti] >> Ne nuk kemi kthyer asgjë, kështu që kjo është e vërtetë. Por kjo rezulton se ka pak e një problemi këtu, sepse deri më tani, vetmja gjë që ne kemi qenë në gjendje për t'u kthyer është një gjë, dhe ky është një kufizim i C. Ju mund vetëm kthehen vërtetë një vlerë, në të cilin rast Jam lloj i mbërthyer këtu sepse unë mund të kthehen vlerën e re e X ose unë mund të kthehen vlerën e re të y, por unë dua të dy mbrapa. Pra, nuk është kthyer zgjidhje e thjeshtë këtu. Por problemi në thelb është arsyeja pse? Çfarë kemi swapped të vërtetë? [Studenti] a dhe b. >> A dhe b. Por a dhe b janë kopje e X dhe Y, që do të thotë që ne vetëm e bëri të gjithë këtë punë, ne vetëm 3 minuta shpenzuar duke folur në lidhje me funksionin e swap dhe të gjitha 3 e këtyre variablave, dhe kjo është e madhe, të përkryer i saktë në izolim, por dhe fushëveprimi B është vetëm në këto rreshta këtu. Pra, vetëm si një për lak, në qoftë se ju të deklarojë një numër të plotë i brenda për lak, Në mënyrë të ngjashme, në qoftë se ju jeni duke deklaruar brenda a dhe b të një funksion që ju keni shkruar, ata janë të vlefshme vetëm brenda funksionit të asaj, që do të thotë sa më shpejt që swap është bërë ekzekutimin dhe ne të shkojnë nga 24 deri linjë linjës 25, x dhe y nuk kanë ndryshuar fare. Ju vetëm humbur një të tërë shumë kohë shkëmbejnë kopje të variablave. Pra, del se zgjidhja për këtë është në fakt jo të dukshme. Kjo nuk është mjaft e mjaftueshme për të kthyer vlerat sepse ne mund të kthehen vetëm 1 vlerë, dhe unë vërtet nuk dua të bie në ujdi dy x dhe y në të njëjtën kohë, kështu që ne do të kemi për të ardhur përsëri në këtë. Por për tani, realizuar se çështja rrjedh thelbësisht nga fakti se a dhe b janë kopje dhe ata janë në fushëveprimin e tyre. Le të përpiqen për të zgjidhur këtë në një farë mënyre. Më lejoni të vërtetë lëviz prapa dhe e hapur deri këtu, le të themi, një variant i katërt i kësaj, buggy4. Po në lidhje me këtë? Ky është një problem i ngjashëm, por më e thjeshtë për të parë para se të marrë një goditje me thikë në zgjidhjen e saj. Ky program quhet rritje, dhe kjo duket initializes një numër të plotë x me 1 në linjë 18. Unë pastaj pretendojnë x është 1, atëherë unë pretendojnë "bën rritjen ..." Unë pastaj e quajnë rritje të, por pastaj në linjat 22 dhe 23, unë pretendojnë kjo është incremented, Unë pretendojnë x tani është çfarëdo qoftë ajo është - 2, me sa duket - por ky program është buggy. Çfarë është problemi? Po. >> [Përgjigja e padëgjueshme Student] >> Pikërisht. Pra, x është shpallur, natyrisht, on line 18. Kjo është brenda formatimin e teksteve kaçurrel KRYESORE së. Pra, përgjigja e thjeshtë këtu është se ndërsa x ekziston këtu, ajo nuk ekziston në linjë 32, kështu që ky program të vërtetë nuk do të përpilojnë. Përpiluesit kur mundohem hartimin këtë kod do të bërtas në mua për disa identifikues padeklaruar ose diçka për këtë qëllim. Në fakt, le të përpiqemi. Kjo është bërë buggy4. Nuk është. Përdorimi i 'X' identifikues padeklaruar në linjë 32. Dhe në fakt, le të jenë më të qartë këtu sot në mënyrë që kjo është e dobishme në orarit të punës dhe në shtëpi. Vini re se kjo është pak shkruar cryptically. Por fakti se ka tingëllimë yelled në ne, duke thënë buggy4.c: 32:5, është në të vërtetë të dobishme. Kjo do të thotë se gabimi është në linjë 32 në pozicionin e karakterit 5. Pra 1, 2, 3, 4, 5. Kjo është, në fakt, ku është problemi. Dhe gjithashtu, shumë, mbani në mend në orarit të punës dhe në shtëpi, unë jam me fat këtu. Unë kam një gabim. Ajo do të jetë relativisht e lehtë për të rregulluar. Por në qoftë se ju merrni një ekran të plotë të tërë mesazhet e gabimit e madhe, përsëri e kuptojnë se ai më i fundit mund të jetë vetëm një tregues i larti. Pra, gjithmonë ndjekje poshtë mete tuaja nga lartë poshtë sepse nuk mund të jetë vetëm një efekt zinxhir daisy që është sugjeruar keni probleme mënyrë më shumë se ju në të vërtetë të bëjë. Pra, si mund ta rregullojmë këtë, ne në qoftë se qëllimi im është që rritja x? >> [Student] Bëni x globale. Mirë, kështu që ne mund të bëjë x globale. Le të marrin shkurtore që kam paralajmëruar për më herët, por dreq, ne vetëm duhet një doze, kështu që le të them vetëm int x deri këtu. Kjo e bën x globale. Deri tani kryesor ka qasje në të dhe shtim ka qasje në të, dhe kështu më lejoni të shkoj përpara dhe të përpilojnë këtë tani. Bëni buggy4, Enter. Duket për të hartuar tani. Le të drejtuar buggy4. Dhe kjo duket të vërtetë punojnë. Kjo është një nga këto gjëra që po bëni si them unë, jo si bëj unë, siç e kam bërë vetëm këtu, sepse në përgjithësi, programet tona do të merrni shumë më interesante dhe shumë më tepër se kjo, dhe nëse zgjidhja juaj për problemet e jetës është vetëm vënë të gjitha variablat në krye të dosjes suaj, shumë shpejt do të merrni programe tmerrësisht e vështirë për të menaxhuar. Ajo merr vështirë për të menduar deri emra të rinj ndryshueshme, ajo merr vështirë për të kuptuar se çfarë është duke bërë atë variabël, dhe kështu në përgjithësi, kjo nuk është një zgjidhje e mirë. Pra, le ta bëjmë këtë më mirë. Ne nuk duam që të përdorni një ndryshore globale këtu. Unë dua të ardhura x, kështu që unë mund të duket - në fund të ditës, kjo është lloj i një histori pa kuptim, sepse ne vetëm të bëjë këtë - por në qoftë se unë nuk e di për atë operatori ose unë nuk u lejua për të ndryshuar atë në kryesore në vetvete, si tjetër mund ta zbatojë Ken gjatë këtu këtë herë jo për të kubike, por të ardhura? Si mund ta ndryshoj këtë gjë këtu? Po. [Student] Pass në x dhe pastaj kthehen [padëgjueshme] >> Mirë, mirë. Kështu që pse nuk e kam të kalojë në x dhe pastaj në vend se ta kthejë atë, pse nuk e kam thjesht kthehen x + 1. Një çift shumë gjëra duhet të ndryshojë këtu. Unë jam në rrugën e duhur. Çfarë tjetër nuk kam nevojë të shkulje? Dikush tjetër. Po. [Përgjigja e padëgjueshme Student] Unë kam nevojë për të ndryshuar llojin e kthimit të ardhura për shkak se ajo nuk është e pavlefshme. Mjetet e pavlefshme asgjë nuk është duke u kthyer, por tani ajo është e qartë, kështu që kjo duhet të ndryshojë për të - >> [Student] int. int të jenë në përputhje me çdo gjë që unë jam në të vërtetë kthehen. Tani diçka tjetër është ende buggy këtu. Po. [Përgjigja e padëgjueshme Studenti] >> [Malan] Kështu që kam nevojë për të ardhura x? [Përgjigja e padëgjueshme Studenti] >> [Malan] Ah, kështu që kam nevojë për të kaluar x. Kështu që kam nevojë për të bërë këtë këtu. >> [Komenti padëgjueshme Student] [Malan] Pra prototip, unë kam për të ndryshuar këtë deri këtu. Pra, kjo duhet të bëhet një int, kjo ka për të bërë - hmm, unë në fakt kanë një bug këtu poshtë. Le të zgjidhur këtë një të parë. Çfarë duhet të vërtetë të jetë kjo? Ajo e mori të jetë një diçka int. Kjo mund të jetë x, por sinqerisht, në qoftë se ju filloni duke bërë thirrje të gjitha variablave x tuaj, ajo do të marrë më pak dhe më pak të qartë se cili është cili. Pra, le të vetëm në mënyrë arbitrare të zgjidhni një konventë të ndryshme emërtimin për funksionet e mia ndihmëse, funksionet që unë jam shkrim. Ne do të thërrasë atë një, ose ne mund ta quajmë atë - Le të thërrasë atë numër të jetë edhe më i qartë. Pra, atëherë unë duhet të kthehen çfarëdo numri është plus 1, dhe tani unë duhet të ndryshojë 1 gjë tjetër deri këtu dhe një gjë tjetër deri këtu. Çfarë duhet të ndryshojë në përputhje parë 21? >> [Përgjigja e padëgjueshme Student] [Malan] Unë duhet të caktojë atë në x. Unë nuk mund të telefononi rritje të (x). Unë kam nevojë për të kujtuar përgjigjen duke ndryshuar vlerën e x në anën e majtë. Dhe, edhe pse x është tani në të majtë dhe të djathtë, që është krejtësisht gjobë sepse djathtë anën e merr ekzekutuar parë pastaj merr gjë plopped në të majtë - x në këtë rast. Dhe pastaj në fund, kjo është një fix lehtë tani. Kjo duhet vetëm të përputhen me atë që është poshtë, numri int. Kështu që një bandë e tërë e ndryshimeve për një funksion të vërtetë budallaqe por përfaqësuesi i gjërave që ne do të duan të bëjnë gjithnjë. Pra, ti buggy4. Unë kam dehur diku. Oh, Zoti im. Pesë gabime në një program 6-line. Pra, çfarë është e gabuar on line 18, karakteri 5? Kështu që unë duhet të deklarojnë këtë, int. Le të shohim. Ka një bandë e tërë e gabimeve të tjera. Oh, Zoti im - 19, 18, 21 - por përsëri, le të vetëm të pastruar në ekran, L Kontrollit këtu, dhe përsëritje tingëllimë. Pra 5 probleme në fakt është vetëm që 1. Pra, tani le të kandidojë buggy4, Enter. Uf, x është incremented saktë. Dakord. Ndonjë pyetje si të ardhura numrat? Po. [Pyetja padëgjueshme Studenti] >> Pyetje e mirë. Si është e mundur që unë mund vetëm të ndryshojë x me numrin dhe programi do të dinë menjëherë? Përsëri, të mendojnë për atë si ky abstraksion. Pra, nëse unë jam kryesor dhe Ken është rritje, sinqerisht, unë nuk bëj kujdes atë që e quan iPad Ken tij. Unë nuk bëj kujdes atë që ai e quan çdo gjë që ka të bëjë me zbatimin e tij këtë funksionalitet. Ky është një detaj zbatimi që unë, kryesore, nuk kanë për t'u kujdesur për të. Dhe kështu thjesht duke ndryshuar atë vazhdimisht në brendësi të funksionit - Numri këtu dhe numri këtu - është e gjitha ajo merr kaq kohë që unë recompile. Kjo është lloj i si në qoftë se ju mendoni se për shumë prej nesh, ata prej jush me patentën e shoferit të cilët kanë nxitur apo në qoftë se ju keni shtyrë edhe në një makinë, shumica prej nesh kanë asnjë ide se si punon një makinë nën kapuç. Dhe me të vërtetë, në qoftë se keni hapur deri individualitet, shumica prej nesh - përfshirë veten time - nuk do të me të vërtetë e di se çfarë ne jemi duke kërkuar në, lloj si ju mund të ndjeheni me sende si këtë të drejtë tani. Por ne nuk mund të vërtetë duhet të kujdesen se si punon makina, ne nuk kemi për t'u kujdesur atë që të gjithë e shufra dhe Pistons dhe kabllot brenda e makinave në të vërtetë janë duke bërë. Pra, diçka si ajo që ju e quani pistoni nuk ka rëndësi këtu, në këtë rast. Njëjtën ide. Po. >> [Pyetja padëgjueshme Student] Nëse ka përdor shumë të ndryshueshme momentin xa më parë, ju, programues, do të duhet të ndryshojë ato kudo. Ose ju mund të vërtetë të bëjë, File menu, dhe pastaj a, Replace - diçka si kjo - por ju do të keni për të bërë këto ndryshime veten. Ju duhet të jenë në përputhje. >> [Student] Nëse ka shumë variabla të shumta [padëgjueshme] Një mënyrë të veçantë si këtu, në qoftë se kjo ishte një tjetër int numrin? >> [Student] Correct. [Malan] Yeah. Mënyrë rëndësi kur ju jeni duke e quajtur funksion. Pra, nëse unë u quajtur rritje të këtu me presje diçka diçka, ka një hartë të drejtpërdrejtë. Variabli i parë, çfarëdo qoftë ajo është quajtur, është bërë një kopje të argumentit të parë gjatë këtu. Më vjen keq. Kjo nuk duhet të jetë një parantezë. Linjat e dytë argumenti deri me një të dytë. Kështu që, po, ka rëndësi. Dakord. Më vjen keq. Mora rrugë të gjatë për të arritur atje. Pyetje të tjera? Dakord. Pra, le të shohim nëse ne nuk mund të pikturoj një tablo të asaj që është në të vërtetë ndodh këtu nën kapuç, në mënyrë që të flasin. Kjo është një drejtkëndësh që mund përfaqësojë kujtesën e kompjuterit tuaj. Edhe në qoftë se ju nuk keni ide se sa memorie punon apo si punon RAM, të paktën të supozojmë se ju keni bunches e saj këto ditë. Ju keni marrë megabajt të saj, ju keni marrë gigabajt të saj, dhe ne e dimë që nga java 0 bajt se një është vetëm ajo? >> [Student] 8 bit. 8 bit, e drejtë? Pra 8 zero dhe 1. Pra, në qoftë se kompjuteri juaj ka një koncert të RAM, 2 Gigs RAM këto ditë, ju keni një miliardë apo 2 miliard byte memorje ose afërsisht 8 miliardë, ose 16 miliardë BITS brenda e kompjuterit tuaj. Ndryshe nga shembull pak wooly Willy, kjo nuk është grimca magnetike zakonisht më. Gjithnjë e më shumë - në laptopë të paktën - është disqet të forta shtetërore, SSD, që vetëm nuk kanë lëvizur pjesë. Kjo është e gjitha elektronike. Kjo është e gjitha elektrike-bazë. Pra, mendoni për këtë drejtkëndësh si vetëm përfaqësojnë 1 ose 2 gigabajt të memories që ju keni. Pra, kjo është një copë e kujtesës. Bota e shkencës kompjuterike është lloj i ndarë off chunks e kujtesës për të bërë gjëra të ndryshme. Për shembull, në qoftë se kjo është RAM kompjuterit tuaj, siç sugjerohet nga drejtkëndësh atje, rezulton se nga Konventa, në krye të RAM tuaj, kështu që të flasin, në përgjithësi është ajo që quhet një segment tekst. Ata janë 0s dhe 1s që ju keni hartuar. Pra, kur ne kemi shikuar nën kapuç në atë a.out është, të gjitha këto 0s dhe 1s, kur ju drejtuar një program, ata 0s dhe 1s janë të ngarkuar nga hard drive tuaj në diçka që quhet RAM, dhe në RAM ata janë vënë në krye. Ndërkohë, ju keni gjëra të tjera: nisja dhënave, uninitialize dhënave. Ato 2 Zona të tëra të memories referohen variablave globale, të cilat ju nuk keni shpesh përdorin por ndonjëherë nëse ju bëni, ata përfundojnë deri atje si. Pastaj ka disa sende të tjera: mjedis të ndryshueshëm, të cilat ne nuk do të kalojnë shumë kohë në, por pastaj 2 gjëra të rëndësishme që do të kthehet në të gjithë semestrit, rafte dhe tog. Pra, shumica e kujtesë të kompjuterit tuaj është e rezervuar kur drejtimin e një programi për diçka të quajtur rafte dhe diçka të quajtur tog. Ne nuk do të flasim rreth një grumbulli gurësh sot, por ne do të flasim për rafte. Rafte është menduar të sjell në mendje deri vizuale e tabaka sallë ngrënie vakt në Shtëpinë Mather ose kudo që ju ndodh që të jetë, ku salla ngrënie stafi pastrimin e tyre çdo ditë, ata rafte e tyre deri nga dyshemeja në deri, dhe të ngjashme, në kujtesë, nuk është kjo ide të vënë diçka në një pirg, vënë diçka në një pirg, duke vënë diçka në një pirg. Dhe çfarë ne do të thotë me këtë? Le të zoom në në gjysmën e vetëm më të ulët të këtij foto, RAM kompjuterit tuaj, të propozojë në vijim. Ajo rezulton se kur ju drejtuar një program si a.out apo Hello - çfarëdo programi është që ju keni shkruar - përsëri, ata 0s dhe 1s janë të ngarkuar nga hard drive tuaj, e cila është afat-gjatë magazinimit, qëndron aty edhe kur ju tërhiqni spinën, ngarkuar në RAM. RAM është më e shpejtë se hard drives - kjo është më e vogël se hard drives - por kjo është ajo ku programet jetojnë ndërsa ju jeni drejtimin e tyre. Pra, ju klikoni dy herë një program në një Mac apo PC, është ngarkuar nga hard drive në RAM. Sa më shpejt që është e ngarkuar në RAM, të shkojnë 0s dhe 1s në krye mënyrë, e ashtuquajtura segment tekst, por pastaj sa më shpejt që programi juaj në fakt fillon running, funksioni kryesor është quajtur, dhe kryesore, siç kemi parë, shpesh ka variabla lokale, dhe ajo ka ints dhe vargjet dhe karaktere dhe si. Pra, nëse programi juaj që keni shkruar ose program që ju keni klikuar dyfishtë përdorur disa variabla brenda e kryesor, ata të përfundojnë deri në fund të rafte tuaj të kujtesës, kështu që të flasin. Më konkretisht, çfarë e bën këtë të vërtetë do të thotë? Kjo thjesht do të thotë se në qoftë se ne kemi qenë duke shkuar për numrin e bytes RAM në kompjuterin tuaj, njoftim se kjo mund të jetë numër bajt 0, kjo mund të jetë numër bajt 1, 2, 3, 4, 5, 6, të gjithë rrugën deri në 2 miliardë do të jetë mbi të gjitha rrugën deri atje në krye. Pra, me fjalë të tjera, kur ne flasim për memorie RAM ose në drejtim të bytes, ai thjesht do të thotë se dikush ka vendosur se çfarë duhet të numërojmë secili prej këtyre chunks të kujtesës. Pra, kur ju keni nevojë për një 32 bit int ose keni nevojë për 8 bit për një char, ku ata të përfundojnë në kujtesë? Konceptuale, ata vetëm të përfundojë deri në fund të këtij gjë të quajtur rafte. Por ajo që është interesante tani është, kur një funksion kryesor i quan - mendoj një funksion të quajtur foo, vetëm një emër arbitrare - ajo që ndodh është kryesor është në fund të këtij rafte e kujtesës; foo tani është vënë në krye të kryesore në kujtesë. Kështu që çdo ndryshore lokale që foo ka përfundojnë lloj konceptualisht mbi ato në kryesore. Nëse foo quan një funksion të quajtur bar, ato variabla të përfundojnë këtu. Nëse bar e quan diçka tjetër, këtu, këtu, këtu. Pra, çfarë është interesante në lidhje me drejtimin e një programi është se si ju e quani funksionet dhe si ato funksione telefononi funksionet dhe si ato funksione telefononi funksionet, keni ndërtuar këtë turrë e funksioneve në memorje. Dhe vetëm një herë në kthimin e funksionit ju filloni të keni atë kujtesës prapa. Pra, një nga mënyrat më të lehta për të dalë jashtë kujtesës në një program kompjuterik është që të shkruani funksionet që kurrë nuk kthehen. Kështu për shembull, le të tregojë sa më shumë me një program me qëllim buggy. Më lejoni të shkojnë përpara dhe nuk përfshijnë # , int main (void), dhe unë jam duke shkuar për të bërë, ndërsa (2> 1), i cili ndoshta kurrë nuk do të ndryshojë mbi ne, dhe më lejoni të shkoj përpara dhe të bëjë tani printf. Në fakt, kjo do të jetë më pak vizualisht interesante. Le ta bëjmë këtë. Për int i = 0; i> 0 - le të bëjnë këtë gabim - i + +. Dhe le të mos printf këtu. Le të praktikuar atë që unë u predikonte. Le të ketë një metodë këtu, kor pavlefshme, dhe ne do të themi int i, dhe atëherë unë jam duke shkuar për të thonë printf - nuk ka, le të bëjnë këtë më interesante. Le të mos të vërtetë të shtypura asgjë në të gjitha. Le të vetëm të bëjë këtë: kor (i). Dakord. Pra, kjo është buggy, sepse pse? Unë jam duke e bërë këtë deri sa të shkoj, sepse programi nuk ka të vërtetë të bëjë asgjë me interes. Por kjo nuk është qëllimi. Qëllimi është për të shkruar një program funksioni kryesor i të cilit e bën atë, me sa duket? Telefononi veten. Dhe në fakt, ne nuk kemi nevojë lak. Le të lehtësuar edhe kjo vetëm jo aq sa për të humbur shikim të vërtetë të bug themelore. Thirrjet kryesore kor për të kënduar disa kor, pastaj kam bërë diçka budalla dhe kam pasur thirrje kor kor sepse unë mori dikush tjetër ishte duke shkuar për të zbatuar atë ndoshta, dhe tani kjo nuk do të përpilojë ende. Unë kam nevojë për të bërë çfarë? Unë kam nevojë për prototip, mos harroni. Kështu që unë duhet të ketë deri këtu kor void (int i); Kështu që tani, nëse unë shkoj këtu poshtë - në fakt, le të përdorim dritaren e madhe. Le të shkojnë përpara dhe të bëjë kor. Le të shkojnë përpara dhe të bëjë kor. Përdorimi i padeklaruar identifikues i. Oh, se ishte budalla. Ne nuk kemi nevojë për argument. Le të vetëm të bëjë këtë. Unë uroj që ne e kishte filluar në këtë mënyrë. Ajo do të kishte qenë një program shumë më të lehtë për të shkruar. Atje. Tani le të shkojë mbi në dritaren time terminal, përsëritje tingëllimë, dhe këtu ne do të shkojmë. Kjo ishte me të vërtetë të shpejtë. Çfarë në të vërtetë ndodhi ashtu, pse? E pra, tani unë do të shtoni linjë shkruar kështu që ne mund të shohim. Më lejoni të them printf ("Unë jam këtu") - nuk variablave. Ne do të lënë atë si kjo. Më lejoni të bëjë përsëritje. Më lejoni përsëritje kor. Dhe ... eja. Do të mbajë. Si një mënjanë, pse nuk e ka ai u rrëzua ende? Faji segmentimit ndodhi super të shpejtë përpara. [Përgjigja e padëgjueshme Student] >> Pikërisht. Pra, kjo merr kohë për të shkruar, apo jo? Ajo merr vetëm më shumë punë nga ana e kompjuterit. Dhe nuk është: faji Segmentimi. Pra, vini re se sa programet e shpejtë të kandidojë. Nëse ju nuk jeni shtypjen asgjë, e super të shpejtë. Por ne ende mori këtë faji segmentimit sepse ajo që po ndodhte? Nëse ju mendoni se si memorie kompjuteri juaj është hedhur jashtë, kjo ndodh të jetë kryesor, por këtu le të vetëm quajmë këtë kor, dhe le të quajmë këtë kor. Dhe tani, nëse unë bëj estetikë e mia të drejtë, kjo është vetëm do të thotë, kor kor, kor, kor, kor, kor, kor, nauseum ad, dhe përfundimisht, çfarë do të ndodhë? Nëse foto e madhe, fjalë për fjalë, është kjo, ajo që ndodh vetëm konceptualisht? The overruns rafte këtij togu. Ose, edhe më keq, ju muar vetëm çdo gjë, duke përfshirë edhe segmentin e tekstit, e cila është 0s dhe 1s që përfaqësojnë programin tuaj. Me pak fjalë, kjo është vetëm super, super e keqe. Programi juaj ka dalë jashtë kontrollit. Ju jeni duke përdorur memorie mënyrë më shumë se ju qëllim të gjitha për shkak të një gabimi budallaqe në këtë rast, ose në këtë rast një funksion shumë qëllimisht bërë thirrje vetë. Tani, kjo nuk është e gjitha e keqe. Funksionet e quajtur veten e tyre të vërtetë ka fuqi të madhe kur ju përdorni atë saktë. Unë nuk e kanë përdorur atë saktë këtu. Pra, kjo nuk është e gjitha e keqe, por fakti që unë kurrë nuk të vërtetë të ndaluar duke e quajtur veten është një dobësi themelore këtu e këtij programi. Pra, ku jemi duke shkuar me të gjithë këtë? Çfarë po ndodh realisht? Kur kam thirrur funksionin rritje si ne ishim duke bërë në këto shembuj, Unë kam një vlerë si 1 që unë të kalojë in Unë të kalojë në një kopje të numrit 1, kështu që në vijim ndodh. Le të shkojë në shembull rritjeje, ky djalë të drejtë mbi këtu. Ja se çfarë është në të vërtetë ndodh. Kur unë të kërkoj rritje të dhe unë të kalojë në x, pictorially, çfarë po ndodh këtu është kjo. Nëse kam vlerën e 1 ruhen këtu dhe unë në fakt e quajnë rritje të, i cili tani quhet kor - iPad është hedhur me off këtu. Le të quajmë këtë rritje të, dhe ne nuk e dimë se çfarë ky funksion tjetër do të jetë. Pra, çfarë po ndodh në të vërtetë është këtu diku në kryesore kam një copë e kujtesës që është ruajtjen numrin 1. Kur unë të kërkoj rritje të, unë jam duke përdorur një copë e kujtesës, por tani unë kam kopjen e 1. Kur unë rritje atë vlerë, kjo bëhet 2, por pastaj çfarë ndodh sa më shpejt që kthimet ardhura? Kjo memorie vetëm merr dorëzuar përsëri në sistemin operativ, që do të thotë të gjithë ju keni bërë asgjë të dobishme. 1 që u përmbahet fillimisht në kryesor është ende në të vërtetë atje. Pra, ku jemi duke shkuar me këtë? Ajo rezulton se në kujtesën ju e keni këtë sekuencë back-to-back e bytes që ju mund të vënë në sende, dhe kjo rezulton se ne kemi parë tashmë diçka që përfshin vënien gjëra për të kthyer prapa për të kthyer prapa. Çfarë është një varg i bazuar në javën e 1 dhe 2 javë tani? Kjo është vetëm një koleksion i karaktereve. Pra, ajo rezulton ashtu si ju mund të vënë numrat në kujtesë, në mënyrë të ngjashme ju mund të vënë personazhet në kujtesë. Dhe sapo kemi filluar karaktere vënë në kujtim të kthehet prapa për të mbështetur për të mbështetur, rezulton se duke përdorur të thjeshtë të gjërave si një për lak ose një lak, ndërsa, ne mund iterate nga e majta në të djathtë mbi personazhet në një varg dhe të fillojnë të fërkoni ato në karaktere të ndryshme krejt - a mund të bëhet b, b mund të bëhet c - kështu që në fund të fundit, ne mund të marrë një dënim anglisht që në fakt e bën kuptim dhe të konvertohet secili prej këtyre shkronjave në një kohë duke ecur nëpër kujtesë të kompjuterit tonë majta në të djathtë të vërtetë encrypt. Pra, le të marrin pesë-minutësh pushim tonë këtu, dhe kur kemi ardhur përsëri, ne do të fillojnë këtë proces të përpiqen informacion. Dakord. Para se të zhyten në disa kripto dhe këto gjëra quhet vargjeve, më lejoni të bëj një pauzë për çdo pyetje, sepse unë të ndjehen si unë me të vërtetë lloji i muddled disa nga këto tema. Pra, le të rregulluar tani në qoftë se ne mund. Ne vetëm biseduam rreth vlerave të kthimit, kemi biseduar rreth argumenteve, dhe kemi biseduar në lidhje me këtë nocion, të cilat ne do të kthehen në javët që do të vijnë, të shikojnë kujtesës si një bandë e tërë e këtyre tabaka bërë pirg, kështu që të flasin, nga poshtë lart, në të tillë që çdo tabaka që merr vënë në rafte përfaqëson një funksion që është aktualisht duke u quajtur. Çdo pyetje? Më lejoni të bëj një pyetje këtu. Më lejoni të lehtësuar këtë përsëri në atë që ishte para disa Q & A. tonë të parë Fakti se ka rritje kllapa e hapur, numri int, mbyllet kllapa - çfarë numri int përfaqësojnë? [Student] Një argument. Një argument >>. Rregull. Por çfarë është një argument? [Përgjigja e padëgjueshme Studenti] >> Çfarë është ajo? >> [Student] Diçka që ju të kalojë in Mirë, kështu që diçka që ju kaloni in Dhe më në përgjithësi, kjo është vetëm input. Nëse keni qenë duke shkruar një funksion dhe qëllimin që funksionojnë në jetën është që të bëjë diçka pak të ndryshme çdo herë që e përdorin atë, atëherë mënyra e vetme që kjo të ndodhë me të vërtetë do të duket të jetë për të siguruar atë me të dhëna kështu që ajo mund të bëjë diçka të ndryshme me atë input çdo kohë. Kështu që ju duhet të specifikoni dy gjëra kur një funksion i merr të dhëna. Ju duhet të specifikoni emrin që ju dëshironi për të dhënë për këtë input thjesht për lehtësinë tuaj në mënyrë që ju mund të referoheni për atë në funksion që ju vetë shkruani, siç kam bërë këtu në linjë 32. Por ju gjithashtu duhet të specifikojë llojin e vet, sepse C është një gjuhë programimi që vetëm kërkon që në qoftë se ju doni një ndryshore, ju duhet të tregoni se çfarë të dhënat e kompjuterit lloji është, në pjesën më të madhe në mënyrë që ajo e di se sa bit të ndajë për këtë variabël për shkak se ajo mund të jetë 6 - keq, ajo nuk do të jetë 6. Ajo mund të jetë 16, ajo mund të jetë 8, ajo mund të jetë 32, edhe 64, por kompjuteri duhet të dini. Tani, int në anën e majtë përfaqëson çfarë, nga ana tjetër? [Përgjigja e padëgjueshme Studenti] >> Çfarë është ajo? >> [Student] Lloji i funksionit. Lloji i funksionit dhe, më konkretisht, lloji i prodhimit të saj. Drejtë. Pra, ndërsa gjë në kllapa përfaqëson input e saj, nëse ka ndonjë, gjë në të majtë paraqet prodhimin e saj. Dhe në këtë rast, duket Rritja kthen një int, dhe kështu int është lloj kthimi i këtij funksioni. Çfarë do të thotë të kthehen? Fjalë për fjalë, ju përdorni kthimin fjalen dhe pastaj nëse ajo që ju janë duke u kthyer te drejte te kyce është një numër i plotë, atëherë kjo është me të vërtetë në përputhje me atë që kemi premtuar. Ju nuk mund të bëni diçka si kjo - Hello, World - sepse kjo është një varg. Natyrisht, ajo nuk është një numër i plotë. Pra me pak fjalë, barra është me të vërtetë për ne, programues, të jetë specifike si për atë që ne jemi kthyer dhe për të pastaj të shkoni në fakt në lidhje me kthimin e tij. Konteksti këtu tani është se kujtesa e kompjuterit tuaj është një Gigabyte, 2 gigabajt - çfarëdo - ndoshta kjo është më shumë, ndoshta më pak, por kompjuteri sheh atë si ka seksione të ndryshme. Diçka shkon poshtë atje, diçka tjetër shkon deri atje, sende të ndryshme shkon në mes, dhe sot ne fillojmë thënë vetëm historinë, por ne do të vijnë përsëri në këtë kohë mbi. Tani për tani, pjesa e vetme e kujtesës me të vërtetë intereson është segmenti teksti për shkak se vetëm përfaqëson 0s dhe 1s tingëllimë që ka outputted. Kështu që kur ju drejtuar një komandë në tastierë si a.out ose ju klikoni dy herë një ikonë për Mac OS ose Windows, programi juaj është i ngarkuar nga hard drive tuaj në RAM dhe kjo është plopped në krye të RAM kompjuterit tuaj, në mënyrë që të flasin. Ndërkohë, si programi juaj fillon drejtimin dhe merr quajti kryesore në programin e keni shkruar apo Microsoft programi ose Apple shkroi, ndonjë prej variablave të saj lokale të përfundojë deri atje poshtë në pjesën e poshtme kujtesën e kompjuterit tuaj. Por në qoftë se thirrjet kryesore një tjetër funksion që vetë ka variabla apo argumente, ata përfundojnë mbi të. Dhe në qoftë se funksioni i quan diçka, ata përfundojnë mbi të, mbi të, mbi atë. Dhe vetëm një herë një funksion është bërë ekzekutimin i rafte e tabaka, në mënyrë që të flasin, të fillojë të marrë më të ulët dhe më të ulët. Dhe kjo është ajo që pastaj, në një fjalë, shpjegon pse kur ju telefononi kubike ose ju telefononi rritje të, ju jeni duke kaluar në një kopje të vlerës. Dhe se çfarë do të thotë pictorially është se ju jeni fjalë për fjalë me shkrim numrin 1 në një pjesë tjetër të kujtesës, duke ndryshuar qe 1-2 në rastin e ardhura ose për një 8 në rastin e kubike dhe pastaj duke hedhur atë larg kujtesës sa më shpejt të ardhura ose kthimet funksion kubike. Pyetje. [Student] Ku janë variabla globale ruajtur? Variablat globale janë të ruajtura në atë që quhet aktualisht dhënat initialized ose të dhëna uninitialized, diferenca është, nëse ju keni një ndryshore globale dhe ju të caktojë atë menjëherë një vlerë barabartë me shenjë, ajo përfundon deri në krye atje, dhe në qoftë se ju vetëm thoni x int; pa vlerë, ai përfundon paksa më e ulët në RAM thjesht nga Konventa. Pyetje të tjera? Dakord. Pra, kjo foto do të kthehet si ne të merrni më të fuqishme me atë që ne mund të bëjmë me kompjuter, por tani për tani, le të kemi një intro të shkurtër në cryptography, një lloj specifik i kriptografisë që nuk zgjidhë të gjitha problemet në botë por nuk zgjidhin disa prej tyre. Në këtë rast këtu, ne kemi diçka që quhet sekret-kyç cryptography. Sekret-kyç cryptography, siç sugjeron emri, rrjedh sigurinë e saj nga një sekret. Për shembull, nëse ju keni qenë kthyer në klasën e shkollës dhe ju ishin duke kaluar pak dashuri letër sekrete për djalë apo vajzë që ju u dërrmuese në, në qoftë se ju të kërkuar për të kaluar atë shënim me anë të audiencës, ju ndoshta nuk do të shkruaj një shënim të tillë në anglisht apo çfarëdo gjuha juaj amtare është. Përkundrazi, ju mund të encrypt atë ose ju mund të thjesht dërgoni atyre një mesazh shkrimor këto ditë. Por ju mund të vërtetë të kalojë atyre një shënim të gjithë klasës. Dhe të sigurt për të bërë këtë në një mënyrë të tillë që miqtë tuaj dhe mësuesi nuk e di se çfarë jeni duke shkruar, ju mund të dalë me një algorithm mjaft të thjeshtë, ri pse ju mund të jetë, për të vetëm të ngjitem fjalë. Pra, në vend e të shkruarit një që ju mund të shkruani b, në vend të b ju mund të shkruani c, vend të c ju mund të shkruani d, dhe kështu me radhë. Ose ju mund të dalë me një përkthim më të sofistikuar i shkronjave në letra të ndryshme. Por kapur është djalë apo vajzë për të cilin ju jeni dërguar këtë shënim duhet të dini diçka, e cila është ajo që, natyrisht? >> [Student] Çfarë ju jeni dërguar. Çfarë sekreti juaj, si ajo është se në mes të hartës së dhe një të B dhe C dhe e d's. Është vetëm duke shtuar 1 për secilën nga letrat për të shkuar nga një për të b, b të c? A është më komplekse se kaq? Pra, ju dhe shtrydhje tuaj duhet të ketë këtë informacion sekret, por nuk është lloj i një kapur-22 këtu. Nëse kjo është hera e parë që ju jeni dërguar këtë letër dashurie nëpër klasë, se si është se djalë apo vajzë do të dini se çfarë sekret edhe është? Pra, sekreti-kyç kripto nuk zgjidh të gjitha problemet e botës, dhe ka në fakt një marrëdhënie këtu se ne do të kthehen në drejtim të fund semestrit së. Në mënyrë të ngjashme nuk shumica prej nesh e dinë dikush që punon, për shembull, në Amazon.com, dhe ende shumë prej nesh kanë blerë sende ndoshta në Amazon.com, dhe ne kemi qenë të mësuar të supozojmë se këto e-commerce transaksionet janë të sigurta. URL ndoshta thotë https, ka ndoshta një kuptim pak ikonë dry diku, ka disa lloj cryptography siguruar informacion kartën tuaj të kreditit mes jush dhe Amazon.com. Dhe ende nëse cryptography përfshin ditur disa sekret dhe unë ende nuk e di kushdo në Amazon dhe unë kam nuk rregullohet me siguri ndonjë lloj të fshehtë me dikë në Amazon, si është kompjuterin tim ose shfletuesi im bërë këtë? Ajo rezulton se ka lloje të tjera të kriptografisë krejt se të zgjidhur atë problem. Por për sot, ne do të përqëndrohet në një të thjeshtë ku ju mund të caktoni paraprakisht të dini disa sekrete si 1 ose disa hartës ndërmjet një dhe e të b. Dhe procesi i cryptography në përgjithësi përfshin këtë. Ju keni disa plain text, përshkruar këtu në të majtë, ju drejtuar atë nëpërmjet disa lloj algorithm ose procedurë për encrypting atë - ndoshta kjo është vetëm një bëhet b, b bëhet c - dhe pastaj ju të përfundojë me ciphertext. Ndërkohë, pasi shtrydhje juaj merr këtë shënim sekret, ai ose ajo ka për të, atëherë decrypt atë duke përmbysur përgjithësi se algoritmi në mënyrë që të marrë përsëri plain text. Nuk janë incarnations fizike të kësaj. Për shembull, kjo është pak decoder sekret ring, dhe kjo është një unazë në kuptimin se ka dy dials këtu. Në periferi të jashtë këtë gjë, nuk ka shkronja A deri Z, edhe pse ata janë në mënyrë të rastit, dhe në brendësi, nuk ka në fakt disa numra tillë që me këtë rrjet ju mund të lloj të kthehet nga jashtë, por jo brenda në mënyrë që të vijë deri numrat me shkronja. Nga një film të quajtur A Christmas Story, ju do të shihni se Ralphie pak ishte aq i etur për të kuptoj se çfarë mesazhi sekret Annie Little Orphan ishte tek ai që kishin qenë të komunikuar, unë mendoj se, në formën e mesazheve numerike në një kuti drithëra dhe keni pasur për të grumbulluar të gjitha kartat që erdhi pak në kuti drithëra, ju duhet të postës ato në, keni pasur për të marrë përsëri në rrjet sekret decoder kështu që ju mund të më në fund të kuptoj se çfarë është në mes të hartës shkronja dhe numra ose letra dhe letra. Si në një kompjuter mund të shkoni në lidhje me zbatimin ose përfaqësojnë gjëra të tilla si kjo? Ne kemi nevojë për një mënyrë për të shprehur veten pak më shumë fleksibilitet se variablat tona deri tani kanë lejuar. Ne kemi pasur ints, ne kemi pasur chars, ne kemi pasur gjithandej dhe dyshe dhe disa të tjerë, por ato janë pjesë individuale të kujtesës që vërtetë nuk na lejojnë të shprehin gjërat si fjalëve dhe fjalive dhe frazave. Në të vërtetë, ne kemi quajtur gjëra të tilla strings, por ne premtojmë se kjo është me të vërtetë vetëm një thjeshtësim në bibliotekë CS50 se ne jemi duke synuar për të zhvishem përsëri. Dhe kështu le të fillojë për të bërë këtë këtu. Më lejoni të shkoj përpara dhe të hapur një skedë - të gjitha këto fotografi janë në dispozicion, si zakonisht, online - array.c quajtur për të zgjidhur një problem të palidhur me vargjet, por që paraqet një foto këtu se si ne mund të përdorim diçka që quhet një grup. Një grup është një lloj i të dhënave. Kjo është një lloj i variable nga llojet që ka lloje të shumta të vogla të dhënave në brendësi të saj për të kthyer prapa për të kthyer prapa. Kështu për shembull, në qoftë se ne të kërkuar për të shkruar një program të vogël që ju jep mesatarisht tuaj quiz për një kurs si 50 qe ka 2 kuize, ju mund shumë lehtë të shkruaj këtë program të bazuar edhe në disa nga materiali i javës së kaluar duke përdorur GetInt dhe nja dy variablave: int quiz1, int quiz2. Dhe kjo është goxha e thjeshtë. Kjo është ndoshta 10, 20 rreshta të kodit max për të zbatuar një program që pyet përdoruesin për 2 pikët quiz dhe pastaj llogarit mesataren e tyre duke shtuar ato së bashku, ndarë nga 2, dhe pastaj shtypjen rezultatet. Ne ndoshta mund të bëjë që shumë lehtësisht tani pas disa numrin e minutave. Por problemi është se mendoj që 50 kishte 3 ose 4 kuize. Supozoni se ju të kërkuar për të përdorur të njëjtin program për një klasë që kishte javore kuize. Mendoni për një klasë që ka kuize javore. Nëse ka 16 apo më shumë javë në një semestër, tani ju keni 16 variabla: int quiz1, int quiz2, int quiz3, int quiz4. Sa më shpejt që ju të filloni duke parë këtë tepricë, kjo kopjimi dhe pasting e kodit, ajo duhet të fillojë të bëjë që ju dëshironi ka qenë një mënyrë më të mirë. Dhe fatmirësisht, për shkak të vargjeve ka. Pra, le ta bëjmë këtë. Së pari, më lejoni të prezantoj një gjë shumë të thjeshtë që ne nuk kemi përdorur deri më tani, por ju do të shihni atë herë pas here në kodin. Kjo është ajo që është quajtur përgjithësisht një konstante. Pra, kjo është një konstante në kuptimin që kjo vlerë nuk ndryshon. Konventa e njeriut kur të krijuar një konstante është që të përdorin të gjitha shkronja kapitale vetëm në mënyrë që me të vërtetë qëndron në kodin tuaj, dhe fjalen e veçantë që keni përdorur është në C # define. Pra, ne themi # define, atëherë një hapësirë, pastaj fjalën që ju dëshironi të përdorni për emrin e vazhdueshme e dhe pastaj vlera e vazhdueshme. Këtë njoftim është i ndryshëm nga diçka për caktimin e një ndryshore. Nuk ka asnjë të barabartë të nënshkruar, nuk ka pikëpresje. Kjo është ajo që është e njohur përgjithësisht si një direktivë Preprocessor, por më shumë në atë kohë tjetër. Tani për tani, kjo krijon një vlerë të pandryshueshëm quajtur KUIZE vlera aktuale e të cilit është numerike 2. Pra, kudo që ju shihni kuize, kuize, kuize gjatë këtij file, kjo është vetëm numri 2. Nëse unë shoh në kryesore tani, le të shohim se si punon kjo. Së pari, ai duket pak i fshehtë, por kjo është e gjitha gjëra që nga java 1. Të kërkojë nga shfrytëzuesi për klasat. Si e bëjmë këtë? Në linjë 22 - kjo është me të vërtetë pjesë e lëng - Unë deklaroj një noton por jo vetëm një noton të vetme. Unë jam deklaruar, në vend, një sërë lundrues-pikë vlerave. Kjo variabël do të quhet klasat, siç nënkuptohet këtu, por pjesë e vetme e sintaksës së re, atëherë janë këto kllapa katrore. Fakti që unë kam thënë nota noton dhe pastaj parantezë të hapur dhe pastaj një numër - njoftim nëse kjo është një konstante kjo është ashtu si ne e bëmë këtë - kjo do të thotë, "Hej kompjuter, jepni 2 gjithandej dhe le kolektivisht quajmë ato notat." Kjo është në kontrast me një proces shumë më e lodhshme si kjo: noton grade1; noton Grade2, dhe kështu me radhë. Kështu një grup na lejon për të zbatuar këtë ide, por shumë më pak messily, në mënyrë të tillë që ne mund të shkruajnë 1 linjë të kodit në vend të, të themi, 16 për një semestër 16-javë. Unë nuk dua të vështirë-koduar 2 sepse në qoftë se ju mendoni për këtë tani logjikisht, mendoj vitin e ardhshëm CS50 ndryshime në 3 kuize vend dhe kam pasur numrin 2 këtu, kam pasur numrin 2 here, I kishte numrin 2 here, numri 2 here. Kjo bëhet shumë e lodhshme dhe shumë e lehtë për të vidhos deri dhe të ndryshojë aksidentalisht 1 vlerë 3 dhe miss disa vlera të tjera të 2. Kështu që unë jam duke shkuar për këtë vend abstrakt dhe larg përdorni këtë konstante që, si emrin e saj sugjeron se, kurrë nuk ndryshon. Dhe tani pa marrë parasysh se a kemi të ndryshme kuize këtë vit apo tjetër, Unë vetëm duhet të ndryshojë atë në një vend deri këtu në krye. Pra, kjo është e gjitha një konstante është. Ndërkohë, tipar i ri konceptual është ai i një grup. Pra kllapa katrore jepni këtë gjithandej shumë dhe lejon mua kolektivisht quajmë ato notat këtu. Pra, tani le të shohim se çfarë unë jam duke shkuar për të bërë. Këtu në linjë 24 është fillimi i një për lak. Kjo është me të vërtetë i zbukuruar asgjë. Është vetëm duke përdorur KUIZE në vend të një numri të vështirë-koduar. Por nuk ka asgjë intelektualisht të ndryshme ka nga java e fundit. Kjo është vetëm printf, kështu printf ("d # Quiz% e% d:") sepse unë vetëm dua të shtypura nga më jepni quiz numër 1 e 2 dhe pastaj 2 nga 2. Pra, kjo është një gjë e thjesht estetike. Por pjesa interesante tani është në linjë 27. Në mënyrë për të mbushur në një nga dy placeholders me një vlerë lundrues-pikë, ju përsëri përdorni kllapa katrore. Në këtë rast, unë jam i përdorur për lak, sepse kjo ka filluar me i barabartë me vlerën çfarë, me sa duket? [Student] 0. >> [Malan] 0. Kështu në përsëritje e parë të këtij loop, ai është sikur kam shkruar këtë në kodin, por në përsëritje e dytë të këtij loop, ai është sikur kam shkruar këtë në kodin tim. Por fakti që unë jam duke përdorur një ndryshore është e përsosur, sepse, siç sugjeron emri, është e ndryshme vlerën e saj në çdo përsëritje, kështu që unë jam duke plotësuar këtë grup një vend në një kohë. Çfarë e bën këtë rrjet të duken si? Arsyeja që unë tërhoqi drejtkëndësh super e thjeshtë në ekran këtu para ishte për këtë arsye. Një grup është vetëm një copë e kujtesës pasuar nga një tjetër copë e kujtesës pasuar nga një tjetër copë e kujtesës dhe kështu me radhë. Pra, nëse array ime është e madhësisë 2 në këtë rast këtu, të gjitha unë do të jetë bërë nga shtypja në rezultatet e mia quiz pëlqen këtu - I kam 100 për këtë dhe pastaj kam marrë një 99 në këtë një - atëherë kjo memorie nuk mund edhe të përdoret, sepse unë kam kërkuar vetëm në kompjuter për një grup të madhësisë 2. Këto sheshet janë ende atje, apo jo? Ju ende keni 2 gigabajt të RAM edhe në qoftë se ju jeni vetëm duke kërkuar për 2 gjithandej. Pra, ideja prapa vargjeve është se kompjuteri merr vetëm një copë e kujtesës dhe pastaj apportions copa të vogla për të kthyer prapa për të kthyer prapa. Dhe kështu kjo është e gjitha një grup është. Kjo është një copë e puqur brenda kujtesës të cilat ju mund të vënë gjërat. Kjo ndodh për të pastaj të bëjë vetëm aritmetike disa mërzitshëm. Nëse unë lëvizni poshtë këtu, ky është vendi ku unë pastaj iterate mbi array. Kam ardhur deri me përmbledhjen e të gjitha vlerave në grup, dhe pastaj unë të përdorni funksionin e rrumbullakët këtu për të bërë fakt shumën ndarë nga kuize. Por më lejoni të tundë dorën time në atë, si lloj aritmetike të mjaftueshme për tani. Por të gjitha që është bërë për mua në fund të fundit është një mesatare informatikë. Pra quiz e parë plus quiz dytë ndarë nga 2 dhe pastaj shtypjen atë si një int. Por le tani tranzicioni në një shembull tjetër të quajtur string1, e cila paraqet një tablo të ngjashme, por vargjet duke përdorur. Më lejoni të shkojnë përpara dhe do të thjeshtojë këtë për vetëm një moment. Fal vulë për tani. Njoftimi në linjë 19 të këtij shembull, unë të marrë një varg nga përdoruesit. Por vëreni se çfarë jam duke bërë më tej në linjat 22 tutje. Unë jam në të vërtetë nga i iterating deri - dhe kjo është një mashtrim i ri - strlen, gjatësia string. Ky është një funksion që vjen me C se në qoftë se ju të kalojë atë një varg, kjo tregon se sa shumë karaktere janë në atë varg. Kjo është e gjitha. Dhe fakti se ajo është strlen vend të gjatësisë string është vetëm për shkak se ajo është ngjeshur shumë. Tridhjetë vjet më parë, njerëzit i pëlqente të shkruajë gjëra si shkurtimisht të jetë e mundur, kështu që ne kemi mbajtur atë konventë këtu. i + + thjesht do të thotë shtim i në çdo përsëritje. Dhe tani vini re kjo, e cila është me të vërtetë interesante. Në linjë 24, unë them, "Kompjuteri, më jep një karakter, 8 bit, dhe e quajti atë c." Por çfarë është kjo në anën e djathtë duke thënë? Në anglisht, çfarë bën që përfaqëson? [Student] karakteri i parë në grup. Saktësisht. Jepni karakterin e parë në grup. Ose, më në përgjithësi, më jep karakter ith në rrjet. Dhe të kuptojë se është e rëndësishme tani se si shkencëtarët kompjuter, ne jemi në të vërtetë duke numëruar nga 0. Ju nuk keni liri tani për të fillojnë të bëjnë këtë. Tani ju duhet të sillen në përputhje me pritjet e kompjuterit dhe numërimin nga 0 sepse [0] do të jetë karakteri i parë në një varg, [1] do të jetë i dytë, [2] do të jetë i tretë, dhe kështu radhë. Pra ky program, në qoftë se unë përpiloj atë, kjo është përsëri string1, prandaj sigurohuni string1, dhe tani unë kam drejtuar string1 në dritaren time terminal. Është duke pritur për të dhëna, kështu që unë jam duke shkuar për të shkruani Davidit, Enter, dhe tani ajo printon Davidit të gjitha në linja të ndryshme, sepse njoftimi atë që unë jam duke bërë. Unë jam shtypjen një karakter në një kohë. Ne nuk do të shkojnë në detaje sot për këtë, por unë fshihet një moment më parë këtë kontroll këtu. Ajo rezulton se në qoftë se përdoruesi është misbehaving,, kundërshtuese, ose vetëm i hutuar ju në fakt mund të dështojë për të dhënë një varg të disa gjatësi. Nëse ju goditi kyç të gabuar në tastierë, ju mund të japin asnjë varg në të gjitha, ose në qoftë se ju jeni me qëllim të keq, ju mund të provoni për të ngjitur në vlerë një Gigabyte së një ese për të mbushur këtë varg, dhe nëse kompjuteri shkon nga e kujtesës, rezulton se ne jemi duke shkuar për të marrë përsëri këtë vlerë të veçantë të quajtur NULL. Kështu që tani për tani, vetëm e di se nuk është kjo vlerë të veçantë të quajtur NULL që do të na lejojë që të kontrolloni, kur ne jemi jashtë kujtesës, ndër të tjera. Por në qoftë se unë i hapur deri tani string2, vëreni një ndryshim këtu. Vini re një ndryshim këtu me string2. Me string2, kjo për lak është pak më ndryshe. Më lejoni të fshini NULLs kështu që ne mund të flasim për ato të një tjetër kohë. Çfarë është e ndryshme në lidhje me lak për këtë herë? Unë mund të shkoni përsëri në shembullin e mëparshëm. Pra, kjo është versioni 2, ky është version 1. 1, 2. 1, 2. Strlen thirrjes është ku? Kjo është në pjesën e parë të për lak. Çdo mendime se pse unë jam duke bërë këtë? Po. [Student] Pra, ju nuk telefononi funksioni çdo herë të vetme. [Malan] Pra, ne nuk e quajmë funksion çdo herë të vetme. Saktësisht. Kujtojnë nga për sythe se ata janë të thjeshtë super sapo ju lloj i kuptoni se kjo është initialization, gjendja, dhe update. Problemi është se gjendja ndodh në çdo ripërsëritje e lak. Dhe kështu në këtë shembull këtu, çfarë është e keqe për faktin se kjo është gjendja ime? [Student] Ju jeni duke bërë thirrje strlen. [Malan] Ju jeni duke bërë thirrje strlen përsëri dhe përsëri dhe përsëri. Por një herë unë kam shtypur në Davidit, gjatësia e vargut që është 5, dhe kjo nuk do të ndryshojë në çdo ripërsëritje e lak sepse string është ende D-nje-v-i-d. Pra, kjo është një aluzion në atë që do të bëhet gjithnjë e më e rëndësishme një ide njohur si një vendim të projektimit ku thjesht nuk do të bëjë kompjuteri të bëjë punën e panevojshme. Ashtu si një vrojtim vjedhës i pset2, pset2 në edicionin standarde do të ju sfidë për të zbatuar në fakt disa numrin e shifra, numrin e disa algoritme encryption, kështu që ju mund të encrypt të dyja dhe decrypt mesazhe sekrete shumë si një Ralphie deshifrohet atje. Në edicionin e hacker pset2, ne jemi duke shkuar për të shkuar pak më tej. Ne jemi duke shkuar për dorë ju një skedar nga një sistem kompjuterik aktual që përmban një bandë e tërë e përdoruesve dhe fjalëkalimet e koduar aktuale, dhe sfida për edicionin e hacker do të jetë për të goditur ato fjalëkalime dhe të kuptoj se çfarë cryptography apo çfarë sekreti është përdorur për të gjeneruar të vërtetë këto fjalëkalime. Dhe ne jemi duke shkuar për të bërë këtë duke përdorur një funksion të ri këtu e C që unë do të ju jap vetëm një demo të njohur si command-line argumente. Ajo rezulton, si disa prej jush mund të keni parë në seksionin ose në tekstet shkollore, kryesor nuk ka gjithmonë duhet të jetë i pavlefshëm në kllapa. Ajo rezulton se kryesore mund të shkruhet edhe si ky, me dy argumente, argc dhe argv, ku argc është numri i fjalëve që ju të shkruani pas emrin e programit në linjë tuaj komanduese dhe argv është fjalë aktuale. Dhe si kllapa katrore atje sugjerojnë, argv është me sa duket një grup. Ajo do të jetë një varg pas një varg pas një varg në kujtesë. Kështu që ajo që ne jemi duke shkuar të jetë në gjendje të bëjë duke filluar me pset 2 është diçka si kjo. Nëse unë bëjë argv1, e cila është një shembull ne do të kthehen në të hënën, dhe drejtuar atë, vini re se kjo nuk duket për të bërë ende asgjë. Ajo vetëm printon emrin e vet. Por në qoftë se unë them lamtumirë klasa, njoftim se ky program duket iterates mbi çdo fjalë që u typed në ftim. Dhe mjetet me të cilat ne do të fitojnë qasje në fjalët që përdoruesi ka shtypur në të shpejtë është duke ndryshuar kryesor filluar këtë fundjavë nga int main (void) për int main (argc, argv) dhe kështu do të jetë i lindur command-line argumente. Dhe një herë ju merrni të vërtetë të sofistikuar në këtë, ju do të jetë në gjendje të shkruajnë programe të vërtetë trippy të tilla si ky këtu, i cili shkon më lart dhe përtej disa nga funksionet që kemi bërë deri tani, por të gjitha mjaft të fuqishme. Pra, ne do të largohen këtë me këtë në ekran, dhe ne do të shohim ju në hënën. [CS50.TV]