DAVID J. Malan: Kjo është CS50 dhe ky është fillimi i javës së katër. Dhe, djalë, është në Volkswagen probleme të gjitha për shkak të softuerit. Le të marrin një sy. [VIDEO rishikim] -Cars, Personazhet të zgjuar në filma Shpejtë dhe i furishëm. Kjo automaker gjermane javë Volkswagen gjeti veten në mes të një skandali të proporcione potencialisht kriminale. -Volkswagen Po bëhet gati për miliarda në gjobave, akuza të mundshme penale për drejtuesit e saj, si Kompania kërkon ndjesë për manipulim 11 milionë makina për ndihmojë atë të mundi teste emisionet. Modelet -Certain naftë ishin projektuar me software të sofistikuar që informacioni përdorur duke përfshirë Pozicioni i drejtimit dhe automjeteve shpejtuar për të përcaktuar se makina ishte nënshtruar testimit emisionet. Nën këtë rrethanë, motor do të reduktonte emetimet toksike. Por makina ishte i manipuluar për të anashkalojë që kur ai ishte duke u shtyrë. Emetimet rritur 10 deri 40 herë mbi nivele të pranueshme EPA. [END rishikim] DAVID J. Malan: Pra, le të hidhini një sy në këtë dhe parë saktësisht se si kjo mund të zbatohen dhe se si kjo mund të ndikojë kaq shumë makina si kjo. Pra, në dorën time këtu janë shtypi lirimin se është lëshuar nga EPA-- e Mjedisit Agjencia e Mbrojtjes e cila është agjencia rregullatore amerikane që trajton shqetësimet mjedisore, dhe pastaj aktual Njoftim ligjor që ishte dërgojnë në Volkswagen vetëm pak ditë më parë. Pra, EPA shkruan, dhe zbulon tani publikisht, një software të sofistikuar algorithm për të caktuar Automjetet Volkswagen zbulon kur makina është duke kaluar nëpër Testimi emisionet zyrtare dhe kthehet emisioneve të plota kontrollon në vetëm gjatë testit. Efektiviteti i këto ndotja automjeteve Pajisjet e kontrollit emisioneve është në masë të madhe reduktuar gjatë gjithë ngarje normale situata. Kjo rezulton në makinat që plotësojnë Standardet në laborator ose testimin stacion, por gjatë funksionimit normal lëshojnë oxides-- azoti ose NOx-- në deri në 40 herë standardit. Software prodhuar nga Volkswagen është një pajisje kuotë mbyll thonjëzat, humbjen, siç përcaktohet nga Clean Air Act në SHBA. Ata shkojnë të thotë se EPA dhe një tjetër agjenci zbuluar pajisjen humbjen software pas analizave të pavarura nga hulumtuesit në Perëndim Universiteti Virginia. Ndotja e NOx kontribuon në dioksidi i azotit, ozoni i nivelit tokë, dhe çështje gjobë grimcat. Ekspozimi ndaj këtyre Ndotësit ka qenë e lidhur me një gamë të gjerë të efekte serioze shëndetësore, duke përfshirë edhe rritjen e astmës Sulmet dhe frymëmarrjes të tjera Sëmundje që mund të jenë mjaft serioze për të dërguar njerëzit në spital. Ekspozimit ndaj ozonit dhe grimcat ka edhe qenë lidhur me parakohshme vdekje për shkak të rrugëve të frymëmarrjes të lidhura ose kardiovaskulare efekte të lidhura. Fëmijët, të moshuarit, njerëzit me sëmundje preexisting frymëmarrjes janë veçanërisht në rrezik për Efektet shëndetësore të këtyre ndotësve. Mjaftojnë do të thotë, se është mjaft serioze. Dhe le të shkojnë në për të lexuar vetëm një fragment më shumë dhe pastaj ne do të hedhim një vështrim në implikimet themelore e kjo në kontekstin e një makine. Në mënyrë të veçantë, Volkswagen prodhuar dhe instaluar software në të ashtuquajturat kontrollit elektronik module-- ose ECM-- e këto automjete që ndjen kur automjeti ishte duke u testuar për pajtueshmëria me standardet EPA emetimit. Bazuar në të dhënat e ndryshme duke përfshirë edhe Pozicioni i timonit, automjeteve shpejtësi, kohëzgjatja e motor-së operacion, dhe presion barometrik, këto inputeve pikërisht gjurmuar parametrat e procedurës së testimit federale përdoren për testimi emision për certifikimin EPA qëllime. Gjatë testimit EPA emetimit, Automjetet ECM software vrapoi software që prodhuar emisionet përputhje rezultate. Në të gjitha raste të tjera, software ECM automjeteve u zhvillua një rrugë të veçantë kalibrimit e cila reduktuar efikasiteti i sistemi i përgjithshëm i kontrollit të emetimit, veçanërisht katalitik selektiv reduktimi i NOx Lean trap-- të cilat ne do të shohim për në një moment. Si rezultat, emetimet e NOx u rritën me një faktor prej 10 deri në 40 herë mbi nivelet EPA përputhje në varësi të llojit të ciklit të drejtimit. Pra, çfarë do të thotë kjo me të vërtetë, dhe kod burim të software running në Volkswagen nuk ka ende nuk është ditur publikisht, është se, në mënyrë efektive, kjo ekuivalent ka diku brenda e kodit Volkswagen. Në qoftë se ju jeni duke u testuar, dhe nëse makina zbulon disa faktorë mjedisorë si timon pozicioni apo lëvizja ose mungesa e tij e makinave ose çdo numër i faktorëve të tjerë që janë aktualisht hypothesized të jetë pjesë e kësaj formule, ata thjesht kthehet në emisionet Kontrolli i plotë. Me fjalë të tjera, ata fillojnë emitting më pak e ndotësve. Tjetër, në çdo situatë tjetër kur ajo nuk është zbuluar si në laborator, ata thjesht nuk e bëjnë. Dhe kështu që ju mund të thjeshtojë këtë në më shumë pseudokod konkrete me diçka si kjo. Nëse rrotat janë kthyer, por timon nuk është, sugjestive se makina është në disa lloj i rradhës cilindër por në një lloj depo duke u testuar, atëherë sillen si EPA do të doja të. Përndryshe nuk e bëjnë. Pra, le të marrin një vështrim në një video të shkurtër që merr një vështrim në atë implikimet janë kjo në fakt mekanikisht. [VIDEO rishikim] -Last Premten EPA njoftoi se disa Makina Volkswagen Audi bërë midis viteve 2009 dhe këtë vit ishin duke përdorur një të ashtu-quajtur pajisje disfatë për të marrë rreth ligjeve emisionet projektuar për të mbajtur në ajër të pastër. Por çfarë do të thotë kjo saktësisht? E pra, makina moderne kanë dhjetra e kompjuterëve brenda tyre. Dhe disa prej këtyre kompjuterëve të ndihmuar koordinimin e funksionet e motorit për optimal Performanca ndërsa duke u siguruar se nuk ka shumë mbeturina vjen nga tub i shkarkimit. Ata kanë qenë në fakt duke punuar në këtë mënyrë për disa dekada. Në thelb, çdo pjesë e motorit një makinë moderne të ka një sensor apo kontrollues në të, dhe këta kompjuterë duke e lexuar në të dhënat e mijëra të herë në rregullimet e dytë e bërë si raportin e karburantit në ajër që po ndodh në cilindra. Këto Volkswagen mashtrimit dhe modelet Audi janë diesels, dhe diesels kanë një më shumë kompjuter të vërtetë e rëndësishme parametra të kontrolluar, i cili është sasia e karburantit padjegur shkuar në shter. Tani që tingëllon keq. A nuk të tingëllojë si ju do të duan lëndë djegëse e padjegur shkon në shter. Por në rastin e një naftë, ju keni diçka quhet një kurth NOx cila është një pajisje që thith dhe kurthe për oksidet e azotit që janë ndotës që do të ndryshe shkojnë në atmosferë. Dhe efekti i kësaj kurth NOx është rritur me karburant të padjegur. Pra, një pajisje disfatë është një program i veçantë brenda këtyre kompjuterat që mund të bëjë atë duken si makina takohet emisionit Standardet e madje edhe kur ajo nuk ka. Volkswagen kishte një problem në duart e saj. Motorët e saj naftë ishin të njohur për marrjen e ekonomisë madhe e karburantit, por kurthi NOx punon vetëm mirë kur më shumë karburant është duke u përdorur. Pra, makina do të zbulojë, përdorur këtë pajisje humbjen, kur ajo ishte duke u një emisioneve provë, kjo do të përdorin më shumë karburant, të bëjë punën e NOx kurth mirë, Emisionet do të jetë mirë. Por pastaj ju merrni në rrugë, pajisjen fiket, ju jeni djegur më pak karburant por ju jeni vënë sa më shumë që 40 herë më shumë ndotësve në atmosferë. Por si dreq e bëri makina dinte se ishte duke u testuar për pajtim emisioneve? EPA thotë se ishte një i sofistikuar sistem që kontrollohen gjërat si drejtues rrota pozicion, shpejtësi, sa kohë motori ishte në, dhe madje presioni atmosferik. Me fjalë të tjera, ka pasur asnjë mënyrë kjo ishte aksidentale sepse software ishte projektuar me shumë kujdes për të zbuluar një testi zyrtar emisionet. Kjo është një shumë serioze mashtrim dhe kjo është pse Volkswagen është në probleme të tilla serioze. Në fakt, CEO i tyre, Martin Winterkorn, sapo u largua poshtë. Pra, çfarë ndodh më pas? E pra, në qoftë se ju jeni një nga gjysmë milion Jettas naftë, Beatles, Golfs, Passats, ose Audi A3s kryer, një lajm i mirë është është se makina juaj është ende i sigurt për të përzënë. Ju nuk keni për të vënë atë larg derisa Volkswagen lëshon një risjell. Por në një moment ata janë ndoshta do të ketë për të rinovuar software brenda makinën tuaj. Kur kjo ndodh ju fuqi merrni pak milje në tank. Avokatët tashmë janë duke u përgatitur up për padi veprim klasës kështu që pronarët mund të merrni kompensohen në disa pika në të ardhmen. Por kjo nuk do të të ndodhë në çdo kohë së shpejti. [END rishikim] DAVID J. Malan: Pra, ky fakt ngre një pyetje e madhe interesant foto si të besojnë. E drejtë? Të gjithë ne kemi iPhone ose androids ose diçka në xhepat tonë ka shumë të ngjarë këto ditë, apo laptopë në xhiro tona që janë software running bërë nga Apple dhe Microsoft dhe rrush të kompanive të tjera. Por si nuk e dimë se çfarë këto produkte software janë duke bërë në fakt është ajo që këto kompanitë thonë se ata janë duke bërë? Për shembull, kush është për të thonë se çdo herë që të bëjë një telefonatë në iPhone tuaj ose telefon Android apo si, se se numri i telefonit gjithashtu nuk është e duke u ngarkuar për serverin e disa kompanisë për shkak të ndonjë program ju keni shkruar, nëse kjo është operativ sistem veten si iOS apo Android, ose për shkak se ju keni shkarkuar disa app palës së tretë që në njëfarë mënyre është dëgjuar për çdo gjë që ju jeni të shtypni ose çdo gjë që ju jeni në të vërtetë duke thënë. Si nuk e dini se, kur ju djema janë duke tingëllimë ose të bëjë për të hartuar tuaj software vet në CS50, si a Stafi vetë atij CS50-së, me anë të bibliotekës CS50, nuk ka qenë prerjet çdo string ju keni marrë ndonjëherë ose çdo inç ju keni marrë ndonjëherë? E pra, ju me siguri mund të shikoni në kodin burim për diçka si bibliotekë CS50, ju mund të shikoni në kodin burimor për sistemin operativ Linux kandidon për CS50 IDE. Por një prezantim të mahnitshme u dha në vitin 1984 në marrjen e Çmimit Turing nga një shkencëtar shumë i njohur kompjuterik të njohur as-- emrin Ken Thompson i cili mori Çmimin Turing që është lloj i shkenca kompjuterike të Çmimi Nobel, në qoftë se ju do të, për punën e tij në një Sistemi operativ i quajtur Unix, e cila është shumë e ngjashme në shpirt për atë që ne përdorim cila është Linux. Dhe pyetja që ai pyeti në e tij Fjalimi i pranimit, në thelb hedhjen poshtë kornizën për vjet dhe vitet e diskutimit në lidhje me besimin dhe sigurinë, ishte kjo. Deri në çfarë mase duhet një besoni një deklaratë që një program-- një copë i software-- është i lirë nga kuajt e Trojës? Ndoshta kjo është më e rëndësishme për të besimit njerëzit që shkruan software. Dhe në fakt, ne kemi lidhur për fjalimin që ai dha kur pranuar këtë çmim në vitet '80 në faqen CS50 e nën faqen Lectures për sot. Sepse ajo që ju do të shihni është se ai në fakt i jep një shembull mjaft të thjeshtë se si edhe një përpilues si tingëllimë ose çfarëdo Përpiluesit të tjerë kanë përdorur në të kaluarën, çfarë nëse ngulitur në përpilues ne vetë janë duke përdorur është pak nëse kusht që në thelb thotë: në qoftë se ju të vini re se ky kod është duke përdorur funksioni getString ose GetInt funksion, të shkojnë përpara dhe të futur një derë prapa apo një kalë trojan tillë që kjo program tani ka disa zero dhe ato që bëjnë diçka me qëllim të keq. Logging gjithë tuaj tasteve, ngarkimi që të dhënat në një server, apo me të vërtetë ndonjë gjë. Dhe çfarë Ken Thompson vazhdon të bëjë në fjalë është për të treguar se edhe në qoftë se ju keni qasje në burimin Kodi i një përpilues që keqdashje mund të jetë bërë këtë, kjo nuk ka rëndësi, sepse ka kjo pule dhe vezë Realiteti i shumë kaluarën vjet Xhibrili hartuesit janë përdorur për të hartuar vetë. Me fjalë të tjera, në mënyrë mbrapa kur dikush duhet të kishte shkruar përpiluesit e parë. Dhe pas kësaj, çdo herë ata kanë përditësuar një përpilues duke ndryshuar kodin e saj burimor, duke shtuar veçori dhe recompiling atë për njerëz si ne që të përdorin, mirë, ata janë duke përdorur të vjetër Versioni i përpiluesit për hartimin e re Versioni i përpiluesit. Dhe nëse ju merrni një vështrim në diskutim që ai dha, ju do të shihni se për shkak se e atij qarkullimit, ju në fakt mund të ketë bugs ose Trojan horses ngulitur në software ne jemi duke përdorur. Dhe edhe në qoftë se ju shikoni në kod burim për ato programe, ajo nuk mund edhe të jetë e qartë sepse dinakëri është në fakt në disa version të vjetër të një përpilues që nga atëherë ka qenë injektuar kërcënimin në software tonë. E cila është vetëm për të thënë, ne me të vërtetë nuk mund dhe nuk duhet të software besimi kandidon për laptopë tonë ose telefonat apo ndonjë numër të vendeve. Dhe në fakt, më vonë në këtë semestër kur ne fillojmë të flasim për programimin e web dhe në fakt të fillojë ndërtimin e aplikimet web Jonë, ne do të flasim për këto kërcënimet dhe të tjerët. Tani, ju mund të keni menduar dhe vënë re se ka pasur një Darth vogël pak Vader në klipet që Prag u treguar atje për Volkswagen. Nëse ju kurrë nuk kam parë, unë menduam se duhet të ndriçohet humor, sepse kjo është e gjitha shumë të dëshpëruar dhe të frikshme. Unë do të shikojmë prapa në Super Bowl 2011 kur një nga tregtar Volkswagen-- dhe kjo pothuajse i bën ata të pëlqyeshëm again-- transmetuar për herë të parë në TV. Është clip 60 dytë që unë mendoj se ju do të gëzojnë. [VIDEO rishikim] [MUSIC - TEMA NGA "star wars"] [Barks qen] [CAR FILLON] [END rishikim] DAVID J. Malan: Po. Unë kam qenë vetëm kontrolluar. Kjo makinë është në listën e shkeljeve. Në rregull. Pra, ne shikojmë në disa pseudokod një moment më parë. Dhe këtu është një më i madh copë e kodit pseudokod që ne kemi parë disa herë deri tani. Dhe le të përdorim kjo është një mundësi tani për të futur një programimit të re teknikë që ne e bëmë shih algoritmikisht javën e kaluar kur kemi shikuar në merge lloj. Por le të formalizuar atë dhe të shohim se si ne mund të përdorin atë në kodin aktual, dhe pastaj ne jemi duke shkuar për të përdorur këtë Teknika poshtë rrugës më gjasa për të zgjidhur disa probleme të tjera. Pra, kjo ishte një nga programet e para ne shkruar ndonjëherë, megjithëse në kodin pseudokod. Dhe çfarë ky program na lejohet të bëjmë kurs ishte për të gjetur Mike Smith në një libër telefoni. Dhe vini re në veçanti linjat e tetë dhe 11 e cila kishte këtë deklaratë të shkuar në. Dhe në fakt, të caktuara gjuhë, C në mesin e tyre, në fakt kanë një deklaratë se është fjalë për fjalë shkoni në që ju lejon për të hidhen në një linjë të veçantë. Është përgjithësisht frowned mbi të, sepse ajo mund të jetë abuzuar shumë lehtë dhe ju mund të filloni duke kërcyer tuaj program në të gjithë vendin si krahasim për të përdorur llojin e Logjika dhe rrjedha kontrollit se ne kemi përdorur deri tani me vetëm sythe dhe kushtet dhe si. Por ne mund të thjeshtojë këtë algorithm në kodin pseudokod si vijon. Në vend të kësaj përsëritës ose qasje looping ku do të vazhdojmë duke shkuar prapa dhe përsëri dhe përsëri për të vijë tre, pse nuk kemi vetëm lloji i vë bast dhe më shumë përgjithësisht thonë se në përputhje shtatë dhe 10, vetëm të zëvendësojë ato dy palë linjave me, tjetër në qoftë se Smith është herët në libër ne do të kërkoni për Mike në gjysma e majtë e librit. Tjetër në qoftë se Smith është më vonë në libër, kërkoni për Mike në të drejtën gjysma libri. Dhe vini re tashmë qarkullimit. E drejtë? Unë jam në kërkim për Mike në libri telefon dhe pastaj Unë përfundimisht goditi ndoshta Linja e shtatë apo ndoshta line 10 dhe udhëzim ime për veten time është kërkimi për Mike në gjysmën e librin e telefonit. E pra, si mund ta kërkoni për Mike? Unë jam në mes të kërkim për Mike, pse po ju lloj i dërguar mua në një rreth? Por kjo është në rregull, sepse ajo që është ndodh me madhësinë e problemit, ashtu siç është shkruar në përputhje 7 dhe 10? Ne nuk jemi vetëm duke thënë kërkimin për Mike, kërkoni për Mike. Ne jemi duke thënë në mënyrë specifike se çfarë? Kërko për të në gjysmën e majtë të gjysma e drejtë që është efektivisht gjysma e madhësisë së problemit. Pra, kjo është në rregull që ne jemi lloj i të angazhohen në këtë qarkullimit, ky argument rrethore, sepse të paktën ne jemi duke e bërë problem vogla dhe të vogla. Dhe në fund ne jemi duke shkuar për të arritur se i ashtuquajturi rasti bazë ku ne kemi vetëm një faqe left-- si vullnetar tonë javën e kaluar did-- kemi pasur një faqe majtas dhe pastaj ne nuk e bëjmë duhet të mbajnë në kërkim për Mike Smith sepse ai është ose në atë faqe ose ai nuk është. Pra, si mund ta zbatojë këtë ide, këtë lloj i qarkullimit në kodin aktual? E pra, ne mund të levave një teknikë që është e njohur përgjithësisht si recursion. Dhe ne kemi parë këtë në pseudokod për merge lloj javën e kaluar. Kujtojnë se ky ishte pseudokod për merge lloj. Kjo është ndoshta edhe më e thjeshtë se flluskë apo përzgjedhje apo futje lloj vetëm në aspektin e thjeshtësisë me të cilat ju mund të shprehin atë. Por kjo është për shkak ne jemi lloj rrethore duke i thënë: kërkoni për diçka duke kërkuar për atë përsëri. Por ne jemi në kërkim ose në gjysmën e majtë apo gjysma e djathtë dhe pastaj në fund ne jemi bashkimi në këtë rast. Por edhe këtu, me këto dy linja lloj, kishte ne përsëri kemi këtë Ideja e recursion. Dhe konkretisht se çfarë do të thotë kjo, në kontekstin e një algoritmi, është se një algoritmi është gjithkund rekursive nëse ajo përdor ose e quan veten. Apo në aspektin e C, një funksion është recursive-- një funksion të quajtur foo është gjithkund rekursive nëse foo, diku në kodin e tij burimor, e quan foo funksion vetë. Dhe kjo është e keqe në qoftë se të gjithë foo ndonjëherë bën është e quajnë veten përsëri dhe përsëri. Është në rregull nëse foo përfundimisht ndalesa, siç bën shkrihen lloj, duke thënë, prit një minutë, në qoftë se ky problem është super të vogla, për shembull, ose kam gjetur atë që unë jam në kërkim të, vetëm të kthehet. Mos Recursively, nuk ciklikisht quaj veten përsëri. Dhe kështu që le të marrin një vështrim në se si kjo mund të vërtetë punojnë. Kështu që unë jam duke shkuar për të shkuar përpara dhe të hapur deri dy shembuj të kodit burim këtu. Një prej të cilave është quajtur sigma 0. Dhe kjo nuk është aspak e gjithkund rekursive, por le të marrin një vështrim në atë ky program bën. Unë e kam hequr nga të gjithë Komentet e prej saj, por të gjithë e kodit burim të CS50-së Faqja e internetit ka komente Nëse ju dëshironi të lexoni nëpërmjet saj përsëri më vonë. Dhe le të bëjmë një çift e mendje e shëndoshë kontrollon këtu. Kështu që në majë të këtij kod, ne kemi përfshijnë CS50.h. Çfarë do të bëni këtë? Pse është ajo këtu? Në terma laik arsyeshme. Çfarë do të bëni? Po. Audienca: Pra, që funksioni i GetInt punon. DAVID J. Malan: Pra, që funksioni GetInt punon. Sepse brenda këtij file, CS50.h, e cila ne do të shohim para se të gjatë në kushtet e kodit të tij burim, ka një bandë e funksioneve të declared-- GetInt, getString, dhe një bandë e others-- dhe nëse ne fakt kemi që përfshijnë linjë, tingëllimë përpilues nuk është do të dinë se ajo ekziston. Dhe njëjta gjë vlen edhe për linjë dy ku int është përcaktuar printf, i cili është një funksion do të vazhdojmë të përdorim mjaft. Tani, linja katër duket një Funky vogël sepse kjo është vetëm një avion i linjës. Atë e mori një pikëpresje, asnjë kaçurrel formatimin e teksteve, nuk ka kod në brendësi të saj. Por ajo që bëri që ne e quajmë kjo gjë në javët e fundit? Po. Pra, një prototip. Dhe pse nuk kemi një prototip që duket të jetë i tepërt pak zakonisht sepse ne zakonisht shoh funksionin përsëri më vonë në dosje, e drejtë? Pra, pse nuk kemi have-- ju jeni vetëm kruarje kokën tuaj, por unë do të marrë atë. Po. Audienca: [padëgjueshme] Funksioni pas kryesor. DAVID J. Malan: Pikërisht. Në mënyrë që përpiluesit ju njeh përfundimisht do të përcaktojë ose të zbatojë se funksioni kryesor pas, me sa duket. Pra tingëllimë dhe më Hartuesit janë lloj i heshtur dhe ata vetëm do të dinë ajo që ju tregoni atyre. Dhe në qoftë se ju doni të përdorni një funksion të quajtur sigma, ju më mirë mësojnë përpiluesit se ajo ekziston që më parë. Tani, në vetvete kryesor, madje edhe edhe pse kjo është një bandë e linjave, është shumë e njohur shpresojmë se nga tani. Atë e mori një të bërë, ndërsa loop qëllimi i të cilit në jetë këtu me sa duket është për të marrë një numër i plotë pozitiv nga përdoruesit. Dhe vetëm i mbajnë pestering atë ose të saj derisa ata të bashkëpunojnë. Pastaj në linjë 16 Unë kam një telefonatë interesant. IntAnswer. E cila në të majtë Ana më jep një int e cila mund të quhet store-- Answer-- e cila do të ruajtur, me sa duket, vlera kthimi i SIGMA-s. Pra Sigma është vetëm një Emri arbitrare por kuptimplotë që unë kam dhënë një funksion qëllimi i të cilit në jetë është që të marrë një argument-- ne do të thërrasë atë N në këtë case-- dhe vetëm për të marrë shumën e atij numri plus çdo numër pozitiv që është më e vogël se ajo. Pra, nëse unë kaloj në numrin 2 të SIGMA, unë dua të shtoj 2 plus 1 plus 0-- jo 0-- në mënyrë që më jep 3. Në qoftë se unë të kalojë në 3 deri SIGMA, unë dua të kanë 3 plus 2 plus 1, e cila i jep më 6. Dhe kështu me radhë. Pra, ai thjesht shton deri të gjithë Numrat më pak se ose e barabartë me të. Tani, këtu poshtë unë jam vetëm duke shkuar për të shtypur jashtë përgjigjen. Pra, si një kontroll të shpejtë mendje e shëndoshë, le të bëjnë SIGMA 0-- dot SIGMA slash 0-- dhe më lejoni të shkruani në 2. Dhe unë me të vërtetë të merrni 3. Më lejoni të shkruani në 3. Unë me të vërtetë të merrni 6. Dhe në qoftë se dikush mund të bëjë matematikë shpejt, në qoftë se unë bëj 50 çfarë jam unë do të merrni? Audienca: [padëgjueshme]. DAVID J. Malan: E pra, nuk ka. Por 1,275 cila është shumë afër. Pra, kjo është rezultat i bërë 50 plus 49 plus 48 plus 47 plus 46 gjithë rrugën poshtë në 1. Pra, kjo është e gjitha sigma bën. Por le të shohim se si ne kemi zbatuar atë tani. Kështu që këtu poshtë është funksioni vetë. Dhe kjo nuk duket të ketë asgjë të bëjë me recursion ende. Në fakt, ne jemi duke përdorur një teknikë e vjetër e shkollës. Unë jam fillimin e një ndryshore të quajtur shumë në zero, atëherë unë kam një foreloop këtu, dhe unë jam deklaruar një int quajtur Unë, vendosjen e atë të barabartë me 1-- edhe pse unë mund të vënë atë të barabartë me zero, por pasi që unë jam duke bërë shtimin, kush kujdeset nëse është zero ose një. Ajo do të ketë asnjë efekt. Kështu që unë jam iterating aq kohë sa unë është me pak se ose te barabarte me m, e cila është argumenti që u miratua në. Dhe atëherë unë vetëm i mbajnë bën rritjen I. dhe depërtim e lak të gjitha unë jam duke bërë është duke bërë shumë plus barabartë I. Dhe kjo është e qëllimshme. Unë nuk dua të bëj, në këtë rast, si shumë plus plus. Unë dua që në fakt të shtuar vlera aktuale e I e cila mban marrë më të mëdha dhe më i madh për drejtimin numërimin. Dhe pastaj do të kthehem shumë. Dhe kështu përgjigje merr shumën e vlerës. Dhe pastaj unë të shtypura it out. Pra, ka një mundësi këtu, Megjithatë, për lloj të lehtësuar ky kod konceptualisht dhe lloji i një goditje e mendje në aspektin e Thjeshtësia edhe pse ajo merr një kohë për të zgjidhur e vlerësojmë pse kjo është i fuqishëm në këto shembuj të vogla. Këtu është SIGMA one-- kështu Versioni i dytë i këtij kodi. Çdo gjë deri të lartë është identike aq se e njëjta histori vlen edhe si më parë. Por tani le të shohim në zbatimi i SIGMA-s që Unë kam whittled poshtë për vetëm këto lines-- katër rreshta të kodit, me të vërtetë, plus disa formatimin e teksteve kaçurrel dhe hapësirë ​​të bardhë. Por çfarë jam unë duke bërë? Nëse m është më pak se ose e barabartë me zero, Unë kam nevojë për lloj të trajtuar se çështja e thjeshtë super. Dhe nëse ju dorëzojë mua zero ose asgjë negative e cila është vetëm i çuditshëm, Unë jam vetëm duke shkuar për të në mënyrë arbitrare por vazhdimisht kthehen zero. Unë nuk dua këtë gjë për merrni në disa Infinite pazakontë lak për shkak të një vlerë negative. Kështu që unë jam vetëm duke thënë, në qoftë se ju më jepni zero ose më pak, unë jam kthyer zero. Por kjo është e mirë, sepse kjo është se faqja e vetme e librit të telefonit që ka mbetur. Unë jam ashpër nga një problem shumë të veçantë dhe jo duke e quajtur diçka Recursively. Por në linjë 31, çfarë mund të duket të jetë bërë? Kllapa janë vetëm duke e mbajtur gjëra, me shpresë, pak më të qarta. Por të gjitha unë jam duke bërë është që unë jam kthyer m-- çfarëdo ju dorëzojë me-- plus Vlera e m-- keq, plus vlera e SIGMA-s e m minus 1. Pra, çfarë do të thotë kjo? Në qoftë se ju më jepni numrin 3 si input, përgjigja unë dua të merrni në fund të fundit është 6 për shkak se 3 plus 2 plus 1 më jep 6. Por si mund ta mendoj për si ky kod është i rrjedhshëm? Hera e parë që unë e quaj sigma dhe unë të kalojë në vlerën 3, kjo është si duke thënë se në një copë e letrës, këtu është vlera 3 dhe unë kam qenë miratuar këtë si SIGMA. 3 është qartë jo më pak se 0 kështu gjendja NESE nuk aplikohet. Tjetër e bën. Pra, çfarë të bëj? Unë dua të m kthehen, e cila është 3, plus sigma i m minus 1. Pra më lejoni të mbajnë gjurmët e kësaj. Unë jam duke shkuar për të vënë këtë copë letër poshtë. Dhe çfarë vlere, që të jetë qartë, jam duke shkuar për të kaluar në SIGMA në këtë pikë në histori? Çfarë numri? 2, e drejtë? 3 minus 1 është 2. Kështu që unë vetëm nevojë për pak skrape të letrës këtu. Kështu që tani SIGMA është duke u quajtur përsëri. Dhe unë kam vënë qëllimisht kjo për shkak se ajo është lloj si heshti se versioni i historisë sepse tani unë jam i fokusuar në sinjal të m minus 1. Pra, m ishte 3, M minus 1 është 2. Kështu që këtu është 2 që unë kam kaluar. 2 është padyshim jo më pak se 0 në mënyrë që çështja nuk zbatohet. Tjetër unë kthehen m, e cila është ky gjë, plus sigma i asaj vlere? Pra, nëse sigma i 1-- sepse m është tani 2 kështu 2 minus 1 është 1. Deri tani unë kam vetëm vlerën 1. Unë jam duke kaluar vetëm numrin 1 në sigma-- funksionit ose veten here-- kështu që natyrisht që nuk është e 1 më pak se zero, ende nuk zbatohet. Kthimi tjetër plus 1 sigma e çfarë? 0. Pra më lejoni vetëm mos harroni se. Unë do të kthehet në atë më vonë. Tani unë jam duke shkuar për të shkuar përpara dhe shënoj poshtë numrit 0, sepse kjo është argumenti im apo parametër. Unë jam duke kaluar numrin 0 dhe më në fund ky proces i vetëm duke përsëritur veten ad nauseum pushon, sepse çfarë mund menjëherë të bëjë një herë unë shoh këtë 0? Kthehem zero. Deri tani ju keni për të Rewind histori. Nëse unë tani të shkojnë prapa në kohë, çfarë ishte gjëja më e fundit Unë e bëri qoftë se keni qenë fjalë për fjalë rewinding një video? Unë jam duke shkuar për të marr më të fundit 1 dhe që më jep 1 plus 0 është 1. Nëse unë mbaj rewinding histori, që do të më jepni 2 plus kjo vlerë të rrjedhshëm, i cili është 1. Pra, kjo është 3. Dhe atëherë unë jam duke shkuar për të mbajtur rewinding. Kur kam parë vënë poshtë numrin 3-- kështu 3 plus 3 jep 6. Dhe tani, në qoftë se ju keni rewound video deri në këtë pikë, kjo ishte shumë Pyetja e parë që unë pyeta. Kur kaloi 3, çfarë është sigma e 3? Është e vërtetë 6, shuma e të gjitha këto copa letre. Pra, nëse kjo merr pak kohë për të përfundojë mendjen tuaj rreth, kjo është në rregull. Por e konsiderojnë atë ishte një little-- saj ishte shumë e qëllimshme që kam bërë pirg këto shifra në krye të njëri-tjetrit. Kjo është lloj i si të paturit e një memory-- një rekord në kohë, si një aparat pastrimi në një video, që unë mund të vërtetë Rewind në. Dhe ne jemi duke shkuar për të ardhur përsëri në që metaforë në vetëm pak. Por së pari, rezulton se nuk ka shumë geeks dhe njerëz qesharake, I guess, në Google. A do dikush që është shumë mirë në mendje googling vjen për vetëm një moment dhe të më ndihmojë të kërkoni për diçka? Shumë, kyç shumë e ulët. Dikush që nuk është dalë përpara, ndoshta. NE RREGULL. Po? Eja. Eja poshtë. Si e ke emrin? SAM: Sam. DAVID J. Malan: Sam, vijnë më poshtë. Ky është i njëjtë. Gëzohem që u njohëm. Hej. Ejani në më shumë. Pra, të gjitha unë duhet të bëni, nëse ju mund të, Sam, këtu është Google. Mund të kërkoni për recursion afat? Nuk e prishin. Dhe tani let's-- vërtet. OK Kliko se. Më mirë të klikoni atë. Ahh, të merrni atë. Nuk ka? NE RREGULL. Pra, le të bëjë një çift të tjerët. Jo aq shumë të lidhura në shkollë këtu, por a keni kërkuar ndonjëherë Google për anagram? SAM: Jo. DAVID J. Malan: OK. Kërko për anagram vend të recursion. Si në lidhje me shtrembër. Ju ndonjëherë kërkuar për shtrembër? Tani, kjo është pak e vështirë për shih por shpresojmë everything's-- OK. Është vetëm ju dhe mua shijuar këtë. NE RREGULL. Pra më në fund, kjo one's-- kjo është një shtrembër pak. Tani të bëjë një listë fuçi. Wonderful. Në rregull. Madh ju falënderoj për Sam. Këtu ju shkoni. Faleminderit. Pra, çfarë po ndodh në të gjithë nga këta shembuj pa kuptim? Pra me të vërtetë, nën kapuç e Miliona Google e linjave të kodit me sa duket është një budalla pak ose kushtet që janë në thelb kontrolluar nëse përdoruesi ka shtypur në këtë frazë, të bëjë diçka që ndoshta mori një sasi jo trivialë kohës për të zbatuar vetëm për të të jetë zbavitës në këtë mënyrë. Por kjo është e gjitha ajo vlon deri nën kapuç. Por, natyrisht, recursion është më i geekier shembull në mesin e atyre mashtrimeve të veçanta. Dhe me siguri nuk ka të tjerë atje po ashtu se ne ndoshta kemi as zbuluar vetëm ende. Pra, të marrë një sy, ose e konsiderojnë tani programi në vijim, dhe sigurisht kap ndonjë prej tyre në rrugën tuaj jashtë. Unë jam duke shkuar për të shkuar përpara dhe hapur një program që është do të përpiqet të bie në ujdi dy vlera. Por, para se të shkojmë atje, le ta bëjmë këtë. A mund ne të merrni një më shumë vullnetar, unë mendoj se? Do të dëshironit që të dalin vullnetarë? Nuk ka? Eja up. Eja up. Në rregull. Pra, emri juaj është ajo? Lauren: Lauren. DAVID J. Malan: Lauren. Eja lart, Lauren. Pra, Lauren është duke u sfiduar këtu si më poshtë. Gëzohem që u njohëm. Kështu Lauren këtu ka para dy gota e saj bosh. Dhe ne kemi disa portokalli lëng dhe disa qumësht dhe ne jemi duke shkuar për të shkuar përpara dhe të bëjë të mëposhtme. Ne jemi vetëm duke shkuar për të mbushur këtë. Disa ounces e qumështit mbi këtu dhe le të plotësoni një lëng portokalli të vogël këtu. Dhe në frontin e të gjitha këta anëtarët e publikut, të bie në ujdi dy vlerat e këtyre gota. Vendos lëng portokalli në filxhan qumësht dhe qumësht në filxhan lëng portokalli. Si do ta bëni këtë në qoftë se keni qenë në shtëpi dhe kishte qasje në furnizimeve të tjera? Lauren: Vendoseni atë në një filxhan. DAVID J. Malan: OK. Pra, le të ketë një të përkohshme ndryshueshme, në qoftë se ne do të. Dhe të shkojnë përpara tani dhe të zbatojë kjo procedurë njëjtë shkëmbejnë. Shume mire. Ne kemi vënë OJ në të përkohshme ndryshueshme, qumësht në ndryshore OJ, dhe tani variabli i përkohshëm në variablin e qumështit. NE RREGULL. Pra bërë shumë mirë deri tani. Pra, ajo rezulton out-- mbajë atë menduar për vetëm një moment. Këtu, të vetëm geek atë pak, kjo do të jetë kodi përkatës C që ne vetëm zbatuar. Ne kishim dy inpute, a dhe b, të dyja të cilat ne do të themi vetëm për thjeshtësi janë int-së. Dhe vini re këtu, në qoftë se unë dua të bie në ujdi vlerat e dy variablave, a dhe b, ne me të vërtetë nevojë për një ndërmjetës, një ndryshueshme të përkohshme, një filxhan i përkohshëm, në të cilën derdh një nga vlerat kështu që ne kemi një placeholder për të. Por pastaj kodi është pikërisht si Lauren zbatuar këtu. Tani, vetëm për të marrë një pak crazier, rezulton që ju mund ta bëni këtë pa një variabël i përkohshëm. Për ta bërë këtë si duhet, edhe pse, ne jemi duke shkuar që duhet të mashtrojnë me disa kimi. Ne kemi disa gota ekstra këtu. Pra, gjëja më e afërt që duket si qumësht dhe ujë perhaps-- ose qumësht dhe OJ-- është që ne kemi një ujë, kështu që ne do të plotësoj këtë një deri me një ounces pak e ujë të pastër. Kjo është ndoshta shumë. Po. Kjo është padyshim shumë. Të mbajë në një sec. Dhe tani ne kemi të naftës, e cila, si unë kujtoj nga kimi mesme shkollore të klasës, shpresojmë se kjo nuk do të përzihen me ujë. Por kjo lloj lloj duket si qumësht dhe OJ. Deri tani, pa përdorur një variabël i përkohshëm, mund të bie në ujdi këto dy vlera? Pra, vajra shkon në filxhan të ujit, uji shkon në filxhan të naftës. Lauren: Nuk ka gota tjetër? DAVID J. Malan: Nuk ka gota tjera. Dhe unë nuk kam në fakt testuar këtë më parë këtë vit kështu që unë nuk e di nëse kjo do të të vërtetë punojnë kimikisht. Kjo nuk duhej të ndodhte. A është duke punuar? Në rregull. Pra, ndarja? Të mirë. Tani kemi marrë për të marrë ujë në filxhan tjetër. Concentrators Smarter kimi mund të ndoshta e bëjnë këtë më mirë se unë. Lauren: Uji është në pjesën e poshtme. DAVID J. Malan: The water-- që ishte çfarë është çelësi hera e fundit që ne e bëmë këtë. Ju duhet të bëni atë në mënyrë të drejtë. Po. Eshte ne rregull. Deri tani ne kemi dy gota e naftës. NE RREGULL. Eshte ne rregull. Por kimikisht, nëse kjo ka punuar se I-- Lauren: Kjo është ujë. DAVID J. Malan: Kjo është kryesisht ujë. Në rregull. Por kjo është ende e njëjtë si më parë filxhan. Pra, pour it-- provoni atje. NE RREGULL. Kjo është një përdorim të mirë të kohës së klasës sot. NE RREGULL. Deri tani we-- bukur. Dicka e tille. Në rregull. Pra, shumë i mirë. Faleminderit për Lauren. Bërë shumë mirë. Pra, vetëm për të hedhur në mendjet tuaja, dhe kjo është ndoshta diçka për të luajtur me të në qoftë se ju pëlqen në ID CS50, ju mund, në fakt, të bie në ujdi dy variablave pa përdorur një numër të plotë të përkohshme. Dhe kjo është kodi përkatës C. Dhe në qoftë se ju kujtohet nga të fundit E mërkurë, ne kemi prezantuar, nëse shkurtimisht, disa operatorë të reja në C. dhe nuk dikush kujtojnë se çfarë karrota pak Simboli është, se trekëndësh pak simbol nga tastierë përfaqëson? Çfarë bitwise operator? Audienca: EXOR. DAVID J. Malan: EXOR. Ekskluzive Ose. Pra, nëse ju dëshironi, vetëm për argëtim në shtëpi, për të dhënë a dhe b dy arbitrar Vlerat si çdo eight-- dhe I do të zgjedhin një vlerë tetë bit. Nëse ju bëni këtë me 32 bit, ju do të shumë shpejt të mërzitem. Por vetëm të japë një një tetë pak vlerë që është çfarëdo, një ose dy, dhe të japë b një vlerë të ngjashme. Dhe pastaj duke përdorur përkufizimin i XOR nga e mërkura e kaluar, zbatojë këtë pak nga pak, secili prej këto tetë bit në secilën prej A dhe B, dhe pastaj të bëjë atë pikërisht në këtë kod. Dhe kjo nuk është e gabuar ajo që ju shihni këtu në ekran. Ajo me të vërtetë boils poshtë për tre operacionet XOR dhe disi magjike dhe një b do të shkëmbejnë pozitat pa humbur asnjë informacion. Pra, vaj dhe ujë mashtrim është afërt mishërim bota reale Unë mund të mendoj për të imitoj atë. Por kjo është me siguri më e lehtë për të përdorni një ndryshore të përkohshme, si në këtë rast këtu. Dhe kjo shumë është e them një mundësi, gjithashtu, ky lloj i optimization mikro, si një shkencëtar kompjuteri do të thonë, ndërsa lloj i fun të mburrem në lidhje me se si ju e bëri këtë pa si shkëmbejnë me një variabël shtesë, kjo nuk është e gjitha që bindëse. Sepse për të shpëtuar 32 bit, si në rastin e një int aktual, nuk është e gjitha që bindëse në një sistem ku ju mund të jetë duke përdorur dhjetëra megabajt apo edhe më shumë memorie të tillë këto ditë. Dhe në fakt, kur ne të merrni në një grup të mëvonshme e problemeve dhe ju të zbatojë magji checker dhe ju do të të sfidohen për ta bërë këtë me kjo RAM sa më pak dhe sa më pak kohë të jetë e mundur mbi computer-- ju ende kanë një javë për të zbatuar it-- ju do have-- ju do të jetë sfiduar për të minimizuar këto burime. Dhe kjo është me të vërtetë e vetmja rast ky semestër ku ju do të inkurajohen për të rruhem off edhe performancën mirën kushton ndryshe. Pra what-- si mund të shihni këtë në kodin aktual? Më lejoni të shkoj përpara tani dhe të hapë një shembull se qëllimisht është quajtur Jo Swap për shkak se ajo nuk ka në fakt bie në ujdi variablave si ju në fakt mund të presin. Pra, le të marrin një vështrim. Këtu është një program që ka CS50 bibliotekë në vazhdim e sipër, unë vetëm standarde / O. Tani ne kemi një prototip për shkëmbim deri të lartë që sapo do të thotë se e mori për të përcaktohet më vonë. Dhe këtu është kryesor. Unë në mënyrë arbitrare caktuar X dhe Y, përkatësisht, një vlerat dhe dy vetëm për shkak se ata janë të vogla dhe të lehtë për të menduar. Dhe atëherë unë vetëm kam një bandë e printfs ku unë kam një kontroll mendje e shëndoshë. x eshte 1 dhe y eshte 2 është duket çfarë ato printfs do të thonë. Pra, nuk ka magji deri tani. Atëherë unë jam duke shkuar për të kërkuar me shtypura def, shkëmbejnë dot Dot Dot. Unë jam duke shkuar për të thirrur shkëmbim funksion, duke kaluar në x dhe y. Dhe le të supozojmë për tani që shkëmbim është zbatuar saktësisht si ajo ishte një moment më parë me një ndryshore të përkohshme. Dhe kështu që unë pretendojnë guxim, swapped. x është tani kjo dhe y tani është se. Por fotografi, natyrisht, quhet No Swap. Pra, le të vërtetë të shohim se çfarë ndodh. Nëse unë përpilojnë asnjë shkëmbim dhe pastaj bëjnë ./noswap, x është 1, y është 2. Shkëmbejnë swapped. x eshte 1, y eshte 2. Pra, në fakt duket të jetë me të meta edhe pse swap-- le të lëvizni poshtë now-- është zbatuar saktësisht sipas rregulloreve Kodi kam propozuar një moment më parë. Pra, ne nuk jemi duke shkuar për të marrë dashuroj me gjëra të XOR për tani. Kjo, gjithashtu, duhet të punojnë vetëm si me qumësht dhe FZ, por kjo nuk duket të jetë duke punuar. Pra, le ta bëjmë këtë përsëri. Ndoshta unë thjesht nuk ishte duke ecur atë të drejtë. Pra, le të kandidojë No Swap përsëri. Ndoshta I-- nr. Pra, kjo nuk është vetëm duke punuar. Pra, le të bëjmë një kontroll të vogël mendje e shëndoshë. Më lejoni të shkoj përpara këtu në Swap dhe vetëm të shtoni, prit një minutë, një është% i / n dhe le të plug-në vlerën e një. Sepse unë me të vërtetë duan për të parë se çfarë po ndodh. Dhe në të vërtetë, kjo është një teknikë debugging që ju mund të jetë duke përdorur në orë zyrë apo në shtëpi tashmë, ngjashme me gjysmën e parë të Danit Video Armendariz në PSET3 ku ne kemi prezantuar shtypura def si një teknikë e rekomanduar, të paktën për raste të thjeshta. Më lejoni të shkoj përpara dhe të drejtuar të bëjë nuk ka shkëmbim përsëri, ./noswap. Interesante. Pra, vini re atë që duket të jetë e vërtetë. x eshte 1, y eshte 2, por a është 2 kur b është 1. Pra, ata të dy disi u swapped por x dhe y nuk janë duke u swapped. Pra, të jetë i qartë, se çfarë po ndodh po, këtu unë kam x dhe y dhe ata janë variabla lokale në Qëllimi i kryesor, unë jam duke kaluar në x dhe y të bie në ujdi. Tani, swap, si një funksion të veçantë, është i lirë për të thirrur argumentet e saj ose parametrat ndonjë gjë e saj ajo dëshiron. Foo ose bar apo x apo y ose A ose B. Vetëm për të bërë të qartë se ata janë jo identike me x dhe y në vetvete, Unë e kam thënë a dhe b. Por ne mund të telefononi ata çdo gjë që duam. Dhe kështu ajo duket si shkëmbim është duke u kaluar x-- AKA a-- dhe kjo është duke kaluar y-- AKA b. Disi këto tri linja janë shkëmbejnë ato vlera saktësisht ashtu si Lauren me qumësht dhe FZ. Por, kur kemi të shtypura nga vlerat, a dhe b janë me të vërtetë të bie në ujdi, por x dhe y nuk kanë asnjë ndryshim në to. Kujtojnë se x dhe y janë deri këtu. Pra, ne mund të shohim këtë nëpërmjet Një tjetër teknikë si edhe. Dhe kjo shumë është një teknikë ngulitur në problemin vendosur tre. Le të shkojnë përpara dhe të bëjë këtë në CS50 ID qoftë se ju nuk e keni tashmë. Në anën e djathtë ne kanë këtë tab Rregullues. Dhe në qoftë se keni hapur këtë ide, ka disa informata misterioze që është hedhur në ju në fillim. Por le të të vë në lojë kjo përveç reale të shpejtë. Pra, një, ju shihni variabla lokale. Rezulton se të ndërtuar në CS50 IDE, dhe një shumë e mjediseve të programimit më shumë në përgjithësi, është një Rregullues. Një mjet që ju lejon të shihni me sy çfarë po ndodh brenda programit tuaj pa pasur nevojë të përdorë shtuar printfs dhe hartimin dhe drejtimin e dhe duke shtuar printf-së dhe hartimin dhe drejtimin, i cili tashmë, në orarit të punës ose në shtëpi, është ndoshta duke marrë mjaft i lodhshëm. Kështu që këtu, në vetëm një moment, ne jemi duke shkuar për të parë në kohë reale vlerat e variablave tonë lokale. Ne jemi gjithashtu do të jetë në gjendje për të vendosur ato që quhen pikat e ndalimit të cilat mundësi në programin tim për pauzë Ekzekutimi në një linjë të veçantë të kodit që unë jam kurioz rreth. E drejtë? Këto programe të kandidojë në një ndarje të dytë. Kjo është lloj i bukur për ne njerëzit ngadalshme të jetë në gjendje të bëj një pauzë, të marrë një moment, shih çfarë po ndodh përreth një linjë të caktuar të kodit pa plugimi programit nëpërmjet saj dhe duke përfunduar tërësisht. Pra, një pikat e ndalimit do të na lejojë që të pushim dhe pushim në një pikë të caktuar. Rafte thirrje është një mënyrë e sofistikuar për duke thënë se ajo që funksionet janë aktualisht duke u thirrur në këtë moment. Kryesor është quajtur gjithmonë i pari. Por në qoftë se kryesore quan një funksion i quajtur Swap, Ne jemi të vërtetë duke shkuar për të parë këtë kullë e funksioneve që kanë qenë quajtur në mënyrë kronologjike. Pra, le të shohim se. Unë jam duke shkuar për të zoom jashtë. Unë jam duke shkuar për të shkuar mbrapa në kodin tim. Dhe vetëm për shkak se unë dua të jetë pedant këtu, Unë jam duke shkuar për të shkuar përpara dhe klikoni vetëm në të majtë të linjës pesë. Dhe kjo krijon një njollë të kuqe. Dhe vini re në anën e djathtë se debugger di, hej, Unë vetëm tha një breakpoint në Linja noswap.c pesë, në mënyrë specifike në këtë linjë të kodit. Pra debugger dinë se unë kanë kërkuar që herën tjetër I drejtuar tim atë program pauzë Ekzekutimi atje në vend se vetëm drejtimin e gjithë gjë super të shpejtë. Kështu që tani unë jam duke shkuar për të klikoni korrigjoj button në krye të IDE dhe kjo do të bëjë të mëposhtme. Ajo do të hapë një fillimisht disi frikshme në kërkim terminal dytë window-- debugging largët nga presë të tilla dhe such-- dhe ne do të kthehen në atë që të gjithë ata që do të thotë para se të gjatë. Por çfarë është e rëndësishme për tani është që kjo pikë të kuqe u godit, debugger ka qëllimisht ndaluar execution-- jo në atë linjë në vetvete, por në ditën e parë linjë e kodit aktual në atë funksion. Dhe kjo është arsyeja pse linja shtatë është tani theksuar në të verdhë. Dhe tani le të marrin një vështrim në anën e djathtë. Ajo duket si, by default, bukur të mjaftueshme, x ka çfarë vlerë? 0. Dhe y ka çfarë vlerë? Zero. Dhe kjo është për t'u pritur në kuptimin se x dhe y-- që line-- verdhë ka Nuk ekzekutuar ende. Pra, x nuk duhet të ketë vlerën 1. Ajo mund të ketë ndonjë vlerë tjetër, një të ashtu-quajtur vlera e mbeturinave. Dhe kemi marrë me fat në atë që është zero në këtë pikë, në thelb. Kështu që tani ka vetëm disa butonat ne duhet të kujdesemi kur debugging në këtë mënyrë. Vini re këtu, ne kemi një butonin Luaj. Dhe në qoftë se ne të luajë apo goditur rinisë, kjo është vetëm duke shkuar për të drejtuar përmes pjesa tjetër e programit ose deri sa ajo godet një tjetër breakpoint. Por unë nuk kam vendosur ndonjë tjetër pikat e ndalimit kështu që kjo është vetëm do të vazhdojë deri në fund. Kjo lloj humbje Qëllimi i poking rreth. Pra, në vend, më intereson këto ikona në të djathtë. Dhe në qoftë se unë rri pezull mbi ato, si ju duhet të too, ju do të shihni pak këshilla tips-- mjet. Ky është hap gjatë. Tani kjo nuk do të thotë kaloni vija e mëposhtme të kodit. Kjo thjesht do të thotë të ekzekutuar atë dhe lëvizin në të ardhshëm, të lëvizin për të ardhshëm, lëvizin për të ardhshëm. Me fjalë të tjera, me anë të që buton, mund të eci përmes sime Kodi një hap në një kohë. Rresht pas rreshti, fjalë për fjalë. Tani, në të djathtë të se, ka një tjetër se ne do të shohim në një moment të vetëm. Kjo është e ashtuquajtura Hapi në ikonën që është do të më lejoni pikiatë në një tjetër funksion. Por le të shohim këtë në një moment të vetëm. Kështu që unë jam duke shkuar për të klikoni mbi hap. Dhe tani vini re, si unë klikoni ky buton në krye të drejtë, mbani sytë tuaj afërsisht nën Lokale Variablat dhe shikoni se çfarë ndodh me x. x është tani 1 sepse vija e verdhë ka ekzekutuar tani dhe ne kemi lëvizur në në linjë 8. Dhe në një moment të vetëm y duhet të shpresojmë se të bëhet 2. Tani, asgjë që interesante ndodh për një grimë. E gjithë kjo është është printf. Dhe vini re, në terminalin e mia mesëm dritare, unë shoh prodhimin e def shtypura. Dhe tani unë kam për të bërë një Vendimi si programues. Unë mund të hap mbi këtë linjë të Kodi, ekzekutimin e tij por jo duke marrë kurioz për atë që është brenda. Ose unë në fakt mund të futemi në atë dhe shko brenda vetë Swap. Pra, le ta bëjmë këtë të fundit. Më lejoni të shkoj përpara dhe klikoni jo Hapi Mbi por Hapi në. Njoftim, të gjithë një e papritur ndryshimet dritare për të nxjerrë në pah të parë linjë e kodit në Swap. Kjo është linjë 21. Dhe tani, çfarë është lloj i shokuar është se, në qoftë se ju shikoni mbi këtu, siç pritej, a comma b eshte 1 dhe 2, respektivisht. Pse është temp 32.767? Duke kujtuar se temp, ashtu si kupa bosh një moment më parë, është deklaruar këtu në linjë 21. Pse 32,000- Dua të them, pse është ajo vetëm disa vlera pazakontë? Po? Audienca: Kjo nuk është nisur. DAVID J. Malan: Është e nuk është nisur. Pra, kompjuteri ynë gjithmonë ka memorie fizike. Ajo gjithmonë ka RAM fizik. Dhe ka gjithmonë zero-së dhe një është në atje, apo jo? Sepse ne jemi duke përdorur tonë kompjuter gjatë gjithë ditës, ju jeni duke përdorur CS50 IDE ose serverat gjatë gjithë ditës. Kështu që RAM ose ka disa zero ose disa dikujt apo disa zero dhe ato. Nuk ka rëndësi nëse janë apo nuk jeni duke përdorur ato. Ju nuk mund të ketë vetëm bosh hapësira ku ju doni bit. Ata janë as zero dhe ato. Pra, ajo rezulton se temp, sepse ne nuk kemi nisur atë ende, ne kemi këto 32 bit, por ata nuk e kam janë nisur për çdo vlerave të njohura. Pra, çdo gjë që ata ishin më përdorur kohët e fundit for-- ato 32 bits-- ne jemi vetëm duke parë objekte të disa Përdorimi i mëparshëm i atyre të veçantë 32 bit. Sapo unë klikoni kalosh edhe pse, phew, temp do të marrë vlerën 1. Dhe në qoftë se unë bëj atë përsëri, një është do të jepet vlera 2 dhe pastaj b do të jepet vlera 1. Dhe kështu që çfarë është e bukur tani në këtë pikë në histori është se Rregullues është treguar mua, super ngadalë në ritmin tim, çfarë gjendja e Swap është. Por vini re në krye këtu, njoftimi se thirrja rafte në fakt ka dy shtresa në të. Tani ajo që është theksuar si Swap, në qoftë se unë klikoni mbi Main në vend të kësaj, vini re se si të ndryshojë variablat lokale sepse zhvilluesi i mund vetëm hop përreth dhe të shkojnë në ndonjë fushëveprimit të ndryshme. Pra, edhe pse ne jemi duke bërë të gjithë këtë punojnë dhe të saktë të shkëmbejnë a dhe b, kur të shkoj mbrapa dhe me radhë në mes Swap ku a është 2 dhe b eshte 1 dhe kryesore, ka qenë e prekur kryesor në të gjitha? Jo. Pra, çfarë është takeaway këtu? E pra, ajo rezulton se çdo kohë ju telefononi një funksion si Swap, dhe ju të kalojë argumente atë, çfarë ju jeni duke kaluar me funksionin Swap në këtë rast është një kopje prej atyre argumenteve. Kështu që nëse x dhe y jane secili respektivisht 32 bit, çfarë po bëhet Swap është dy të reja lokale variabla, apo argumentet, quhet dhe b--, por ato janë arbitrare names-- por modeli i zero dhe ato brenda të A dhe B janë rreshtuar të jetë identike me x dhe y por ato nuk janë të njëjta gjë si x dhe y. Është sikur ka Main në pjesë e saj e letër numri 1 dhe 2 për të x dhe y, dhe atëherë kur ajo që duart copë letër të bie në ujdi, Swap shumë shpejt merr stilolaps e vet, shkruan poshtë 1 dhe 2 në bilancin e vet të letrës, Duart mbështetur xy origjinale në Main dhe pastaj e bën vet gjë me a dhe b. Dhe kjo tani është super i rëndësishëm për shkak se kjo ka implikime nontrivial për fakt të shkruar kodin e saktë sepse kjo do të duket ne nuk mund të bie në ujdi dy variablave. Unë kam shkruar një funksion të saktë Swap. Ne e kemi zbatuar atë me Lauren si një funksion i saktë swap në realitet, por me sa duket asnjë nga që çështje në qoftë se ju nuk mund të vërtetë të bie në ujdi dy vlera të përhershme. Pra, ne kemi nevojë për një mënyrë tjetër që në fakt të marrë në këtë, dhe ne duhet të jenë në gjendje të në fakt të zgjidhur këtë problem. Dhe kjo rezulton out-- dhe ne do të vijnë përsëri në këtë foto të veçantë para long-- kjo është një mënyrë që ju mund të tërheqë kujtesën e kompjuterit tuaj. Është vetëm një drejtkëndësh. Ju mund të tërheqë atë ndonjë disa mënyra, por kjo është i përshtatshëm për të nxjerrë atë si një drejtkëndësh për arsyen vijuese. Ne jemi duke shkuar për të filluar sot dhe më tej duke folur për të ashtuquajturin rafte. Dhe rafte është vetëm një copë e RAM-- një copë të memory-- që funksionon kanë qasje kur ata janë quajtur. Dhe kështu kjo rezulton se në në fund shumë të këtij rafte është vendi ku të gjithë variablat lokale kryesor i dhe org C dhe org V dhe të gjitha këto gjëra do të shkojnë by default. Dhe nëse Main e quan një funksion tjetër si Swap, mirë, Swap do të marrë një tjetër shtresë e kujtesës lart atë. Dhe kështu që vetëm të ju jap një të përciptë të shpejtë foto e kësaj, në qoftë se unë shkoj mbi here-- dhe më lejoni të pasqyrojnë këtë në lart si well-- çfarë me të vërtetë unë kam, në qoftë se ne kujdesemi vetëm për fund të kësaj foto për tani, është se kur unë të drejtuar një program dhe Main merr quajtur, Kryesor i është dhënë një copë të RAM në kompjuterin tim që është i në pjesën e poshtme të këtij ashtuquajturës pirg. Dhe unë jam duke shkuar për të nxjerrë atë qëllimisht si një katror. Pra, kjo është si 32 bit apo katër bytes. Dhe në qoftë se ky funksion kryesor ka një ndryshueshme quajtur x me një vlerë prej 1 dhe ajo ka një ndryshore të quajtur y me vlerën e 2, kjo është si duke marrë këtë copë e kujtesës që Kryesor është dhënë nga operative sistem dhe duke e ndarë atë në mënyrë që variabli i parë lokal shkon këtu, e dyta shkon këtu, dhe kjo është ajo. Kur Main quan Swap, Swap merr fetë e vet të kujtesës se ne do të tërheqë si kjo nga sistemi operues, dhe ajo do të ketë saj Variablat e veta lokale bazuar mbi zbatimin tonë më parë me variablat lokale një dhe b që fillimisht të marrë vlerat 1 dhe 2. Por pastaj, sa më shpejt që kodi Swap ekzekuton, dhe Lauren fakt këmbime OJ dhe qumësht, çfarë po ndodh? E pra, kjo 2 po bëhet një 1, këtë 1 është bërë një 2, dhe, nga rruga, ka një variabël temp që është duke u përdorur atë gjithë kohës që eventualisht shkon larg. Por kjo nuk ka rëndësi si puna sa ju të bëni në këtë linjë of-- në këtë hapësirë ​​e kujtesës, x dhe y janë plotësisht paprekur. Pra, ne kemi nevojë për një mënyrë e dhënies Swap dhe funksionet si ai Qasje sekret, në qoftë se ju do të, për Funksionet like-- të kujtesës si x dhe y. Pra, le të marrin një vështrim në një shembull që ndihmon na shikoni saktësisht çfarë ka qenë ndodh në këtë kohë e tërë. Unë jam duke shkuar për të shkuar përpara dhe e hapur deri Krahaso Zero. Dhe unë jam duke shkuar për të mbyllur Rregullues ynë, unë jam duke shkuar për ta mbyllur këtë mesazh frikshme në kërkim i drejti thotë, prit një minutë, ju jeni në debugging mesme. Unë jam duke shkuar për të fshehur këtë skedë këtu vetëm për të shkuar përsëri në thjeshtësi. Pra, mos u bëni merak nëse GDB është vrarë. Kjo thjesht do të thotë se programi ka u lë, me qëllim në këtë rast, nga une. Dhe tani Krahasoni Zero bën këtë. Unë jam duke përdorur CS50 Biblioteka në I / O standarde. Unë kam marrë një funksion kryesor që për herë të parë thotë, të themi diçka, dhe merr një varg. Pastaj thotë atë përsëri dhe merr një tjetër varg. Dhe vini re se këto dy vargje quhen s dhe t, respektivisht. Dhe tani ky program, Krahaso Zero, qëllimi i tij në jetë, është menduar për të më thoni, nuk kam lloji të njëjtën gjë? Dhe kështu që unë jam duke shkuar prapa në javë një. Unë jam duke përdorur operatorin tim të barabartë të barabartë që është operatori cilësisë. Jo operatori detyrë, operatori barazi. Unë jam vetëm duke krahasuar s dhe t. Pra, le të vërtetë të shkojnë përpara dhe të bëjë këtë. Dhe unë jam duke shkuar për të shkuar përpara dhe të bëjnë Krahaso Zero. Unë jam duke shkuar për të bërë ./comparezero. Dhe unë jam duke shkuar për të shkuar përpara dhe të thonë diçka si, le ta bëjmë mom në Fjala dhe si për mom në uppercase. Dhe sigurisht unë lloji gjëra të ndryshme. Në rregull. Kjo është për të pritur. Le të drejtuar atë përsëri. Dy herë bëjnë vogle, vogle. Kjo duket super identik me mua. Enter. NE RREGULL. Ndoshta kjo është vetëm për shkak se pazakontë kjo nuk është simpati gramatikë tim. Pra, le të bëjmë një mom kapitalit, Kapitali mom, identike. Gjëra të ndryshme. Pra, pse është kjo? E pra, çfarë në të vërtetë do në nën kapuç këtu? Pra, le të kthehemi mbi këtu për vetëm një moment dhe të marrë parasysh se çfarë getString është në të vërtetë duke bërë. Kur ju telefononi getString, kjo është një funksion ne vetë shkroi dhe ajo disi merr një Sekuenca e karaktere nga përdoruesit. Dhe le të supozojmë se i pari herë që unë quaj getString, që i jep më një copë e kujtesës që duket si kjo. Dhe në qoftë se unë shtypur në të gjitha Fjala m-o-m-- dhe atë që shkon pas tij? Vetëm një kontroll i shpejtë mendje e shëndoshë. Zero backslash. Ne e dimë se. Dhe kujtoj se kemi luajtur rreth me emrin Zamila së dhe një bandë e emra të tjerë kur Rob ishte këtu në kërkim në atë që po ndodh në brendësi të kujtesës. Pra kjo histori është saktësisht e njëjtë. Kjo është ajo që getString po kthehet në mua. Tani, kodi im një moment më parë ruajtura vlera kthimi i getString në një ndryshore të quajtur s. Dhe pastaj herën e dytë unë e quajti atë, ajo ruajtur atë në një ndryshore të quajtur t. Pra, nëse unë shkoj këtu, Unë kam nevojë për për të nxjerrë këtë variable-- lokale dhe unë jam duke shkuar për të në përgjithësi të nxjerrë një varg si just-- ne do të e quajti atë s-- si një shesh të vogël këtu. Dhe tani, somehow-- si e bën mom shkoni brenda këtij s ndryshueshme? E pra, ne duhet të kthehemi në parimet e parë këtu. Çfarë është getString fakt kthyer? Pra, ajo rezulton se M-O-M backslash zero, dhe çdo numër e vargjeve të tjera në kujtesë si Zamila dhe Rob ose Andy apo çfarëdo të tjerët, janë sigurisht në tonë RAM kompjuterit apo kujtesës. Dhe RAM juaj ka like-- ju keni një koncert të RAM, dy koncerte të RAM, ose një miliard apo dy miliardë bytes, apo ndoshta edhe më shumë këto ditë. Pra, le të supozojmë, për qëllime të sotme, se kjo nuk ka rëndësi se si ne të numërojë ata, por ne mund të llogarisë çdo e atyre miliardë lekë ose dy miliardë ose katër miliardë bytes. Dhe le të vetëm në mënyrë arbitrare të themi se kjo është kafshoj i parë, pickim të dytë, të tretë, të katërt. Unë jam qëllimisht jo duke përdorur zero për sot, por ne do të kthehen në atë. Pra, me fjalë të tjera, nëse kjo është e hera e parë që unë jam duke përdorur programin, Unë jam vetëm duke u fat dhe i pari pickim është në një vend pastaj dy pastaj tre se katër. Dhe në qoftë se unë mbajtur vizatim, numri kuti dy miliardë do të jetë mënyra më e gjatë këtu. Pra, çfarë mendoni ju, atëherë, GetString fakt kthehet? Kjo nuk është kthyer M-O-M backslash zero në vetvete për shkak se në mënyrë të qartë nuk do të përshtaten në kuti që unë kam tërhequr. Pra, çfarë tjetër mund të vërtetë të getString të kthehen të gjitha këto javë? Përgjigja është mbi Bordi këtu diku. Ju nuk mund të përshtatet M-O-M backslash zero, kështu që ajo që mund të ketë kuptim në vend? Nëse keni pasur të jetë super i zgjuar, duke në të ashtuquajturën hat inxhinieri, çfarë mund të kthehet? Çfarë është më pak e informacionit ju mund të kthehet se do ende ju lejojnë të gjeni M-O-M në kujtesë? Po? Audienca: Një. DAVID J. Malan: Një. Dhe pse një? Audienca: Për shkak se ajo do të tregoj ju ku të shkoni [e padëgjueshme]. DAVID J. Malan: Pikërisht. Unë jam vetëm duke shkuar për të kthyer adresën e vargut që unë kam marrë. Adresa në këtë Rasti është vend një. Pra, çfarë me të vërtetë është duke u ruajtur në s-- dhe çdo variabël string kështu far-- ka qenë vetëm Adresa e atë varg. Ndërkohë, në qoftë se unë e quaj GetString për herë të dytë dhe unë shkruani në fjalë për fjalë të njëjtën thing-- M-O-M me lowercase-- M-O-M dhe një tjetër backslash zero, dhe tani ndoshta programin tim qenë duke konkurruar për disa kohë kështu që ndoshta kjo është 10, kjo është vendndodhja 11, kjo është 12, kjo është 13. Kompjuterët që përdorin disa të tjera kujtesës për çfarëdo arsye. Çka tani shkon në sekondë tim ndryshueshme në t programin tim? 10. Pikërisht. Dhe kështu, kur ne shikojmë në Kodi burimor i këtij programi ku unë jam thjesht duke u përpjekur për të krahasuar dy vlera, është s barabartë e barabartë me t, çfarë është përgjigja e qartë e njeriut? Vetëm për shkak se nuk ka 1 nuk ka të barabartë 10. Dhe kështu këtu qëndron një mundësi për ne të vërtetë për të thjesht shkoni përsëri në, përsëri, për herë të parë parimet dhe mendoni rreth, mirë, çfarë po ndodh nën kapuç? Ne kemi qenë duke folur për copa dhe bytes dhe kujtesës, por është e vërtetë e dobishme për të kuptuar sepse kur ju telefononi getString, edhe pse ne mendojmë se është kthimit M-O-M ose string nëna ose Andy apo Zamila ose si, teknikisht kjo është vetëm kthimin adresa e atij copë e kujtesës. Por kjo është në rregull. Sepse si mund ta di ku mbaron vargu? Nëse unë jam duke pasur parasysh vetëm fillimi? E pra, backslash zero, e drejtë? Vetëm në kohë lineare unë mund shtypura nga me def shtypura M-O-M. Dhe sa më shpejt që unë shoh backslash zero, unë nuk bëj kujdes se ku kam filluar, Unë tashmë e di pa dyshim ku kam nevojë për t'i dhënë fund. Dhe kështu sot shënon beginning-- dhe më lejoni të bëjë këtë në mënyrë dramatike sepse ne shkoi nëpër shumë vështirësi për merrni këto këtu trajnimin wheels-- kështu që sot rrotat e trajnimit të fillojë të çohet dhe publikojmë në least-- [Duartrokitje] Kjo ishte edhe vlerë të udhëtimit për të synuar këtë mëngjes, po? Pra now-- ka, ajo kthehet jashtë, nuk ka gjë të tillë si string. String nuk ekziston. Është një sinonim që ne i kemi pasur brenda bibliotekës CS50. Tani e tutje, ne do të fillojnë duke e quajtur s dhe t jo vargjet, por yjet char. Dhe ylli char ne do të vë në lojë përveç para se të gjatë. Por kjo do të thotë, se edhe në qoftë se ne vazhdojmë duke përdorur getString për tani, teknikisht unë duhet të jetë duke thënë yll char dhe yllin char. Dhe kjo rezulton se çka yllin do të të treguar është diçka quajtur një tregues apo një adresë. Dhe në fakt, një ngacmues për çfarë shtrihet përpara është kjo clip 20 dytë nga tonë Miku Nick Parlante në Stanford i cili, mjaft disa kohë më parë, shpenzojnë një sasi qesharake të kohës, si të mira unë mund të them në e tij kuzhinë ose bodrumin e tij, duke e bërë claymation Futja në botë një karakter të quajtur Binky me të cilët ne do të të futet herën tjetër për pointers. Kështu që këtu është një vrojtim të asaj që është për të ardhur. [VIDEO rishikim] Hej, Binky. Zgjohu. Është koha për argëtim akrep. -Cfare eshte kjo? Mësoni rreth pointers? Oh, Goody. [END rishikim] DAVID J. Malan: Dhe në këtë shënim, ne do të shohim të mërkurën. Në rregull. Kush është vallëzimi? Eja. Kush është vallëzimi? Ju doni mua për të marrë atë filluar? Unë do të marrë atë filluar. Woooo! Lauren: dashuroj Sweet Moisiu.