David J. Malan: Tai CS50 ir tai yra iš keturių savaitę pradžia. Ir, berniukas, yra "Volkswagen" į Bėda visi, nes programinės įrangos. Leiskite mums pažvelgti. [Vaizdo įrašų atkūrimas] -Cars, Protingiausias Veikėjai į Greiti ir įsiutę filmus. Šią savaitę Vokietijos Automobilių Volkswagen atsidūrusi viduryje nuo skandalo potencialiai nusikalstama proporcijas. -Volkswagen Yra ruošiasi milijardus baudų, galimi kriminaliniai kaltinimai savo vadovų, kaip bendrovė atsiprašo už takelažas 11 milijonų automobilius padėti jai įveikti išmetamų teršalų bandymai. -apibrėžimai Dyzeliniai modeliai buvo suprojektuoti su sudėtingos programinės įrangos kuri naudojama informacija, įskaitant pozicija valdymo ir transporto priemonės pagreitinti, siekiant nustatyti automobilis buvo vyksta išmetamųjų teršalų bandymo. Pagal šią aplinkybę, variklis būtų sumažinti toksinių kiekį. Tačiau automobilis buvo suklastoti apeiti kad kai jis buvo išstumti. Išmetamųjų teršalų kiekis padidėjo nuo 10 iki 40 kartų virš priimtino EPS lygiais. [PABAIGA PLAYBACK] David J. Malan: tad Pažvelkite į šį išvaizdą ir pamatyti, kaip tiksliai tai gali būti įgyvendinama ir kaip tai gali paveikti tiek daug automobilių tai patinka. Taigi mano rankos čia yra spauda atleiskite, kad buvo išduotas EPA-- Aplinkos Apsaugos agentūra, kuri yra JAV reguliavimo agentūra, rankenos aplinkosaugos problemas, ir tada tikrasis teisinis pranešimas, kad buvo siųsti Volkswagen vos prieš keletą dienų. Taigi EPA rašo, ir atskleidžia dabar viešai, sudėtingas programinė įranga algoritmas tikras Volkswagen transporto aptinka kai automobilis patiria oficialūs Išmetamų teršalų bandymų ir paverčia visą emisiją kontroliuoja apie tik bandymo metu. Veiksmingumo Šios transporto priemonės taršos išmetamųjų teršalų kontrolės įtaisai yra labai sumažinti per visą įprastą vairavimo situacijos. Tai lemia automobilių, kurie atitinka standartai laboratorijoje arba bandymų stotis, bet normalaus veikimo metu išmeta azoto oxides-- arba NOx-- ne iki 40 kartų standartą. Pagaminta Volkswagen programinė įranga yra citata citatos pabaiga, išderinimo įtaisas, kaip apibrėžta Švaraus Oro aktas JAV. Jie eina pasakyti, kad EPA ir kita agentūra atidengta išderinimo įrenginio Programinė įranga po nepriklausomos analizės mokslininkai Vakaruose Virdžinijos universitete. NOx taršos prisideda prie azoto dioksidas, pažemio ozonas, ir smulkių kietųjų dalelių. Ekspozicijos į juos teršalai buvo susijęs su įvairiomis rimtų poveikis sveikatai, įskaitant didesnį astma išpuolių ir kitų kvėpavimo takų ligų, kurios gali būti pakankamai rimti siųsti žmones į ligoninę. Ozono poveikį ir kietųjų dalelių taip pat buvo susijęs su per anksti mirtis dėl kvėpavimo susijusios arba širdies ir kraujagyslių susijęs poveikis. Vaikai, vyresnio amžiaus žmonės, su nesieja kvėpavimo takų liga yra ypač gresia poveikis sveikatai teršalų. Užtenka tariant, tai gana rimta. Ir tegul eiti skaityti tik dar vienas ištrauka ir tada mes pažvelgti pagrindinės pasekmės tai yra su automobilio kontekste. Tiksliau, "Volkswagen" pagaminta ir sumontuota programinė įranga vadinamoji elektroninis valdymas module-- arba ECM-- nuo šios transporto priemonės kuris jautė kai transporto priemonė buvo išbandytas atitiktis EPS emisijos standartus. Remiantis įvairių įėjimų įskaitant pozicija vairo, transporto priemonės greitis, variklio trukmę operacija, ir barometrinis slėgis, šios sąnaudos tiksliai stebimi parametrai federalinės bandymo procedūrą naudojamą išmetalų bandymas EPS sertifikavimo tikslais. Per EPA išmetamųjų teršalų kiekio bandymą, transporto ECM programinė įranga bėgo programinę įrangą, kuri pagaminta atitinkantys išmetamųjų teršalų rezultatai. Visais kitais laikais, transporto ECM programinė įranga bėgo atskirą kelią kalibravimas, kuris sumažino iš veiksmingumas Bendras išmetamųjų teršalų kontrolės sistema, specialiai selektyvus katalitinis sumažinimas Lean NOx trap-- kuri matysime apie per akimirką. Kaip rezultatas, NOx padidintas 10 iki 40 kartų faktoriaus virš EPS atitinkančių lygių priklausomai nuo važiavimo ciklą tipo. Taigi, kas tai iš tikrųjų reiškia, ir kodo į programinės įrangos, veikiančios ant Volkswagen neturi dar nebuvo viešai atskleista, yra tai, kad, efektyviai, šis ekvivalentas yra kažkur viduje Volkswagen kodu. Jei yra išbandyta, o jei automobilyje aptinka tam tikrų aplinkos veiksnių kaip vairo pozicija arba judėjimas arba jos nebuvimas iš automobilio arba bet kiti veiksniai kad šiuo metu iškėlė hipotezę, būti dalis šios formulės, jie tiesiog įjunkite pilnas teršalų kontrolės. Kitaip tariant, jie pradeda skleidžiančios mažiau teršalų. Kita, kiekvienoje kitoje situacijoje kai jis neaptinkamas kaip laboratorijoje, jie tiesiog neturi. Ir todėl jūs galite supaprastinti į daugiau tai betono Pseudocode su kažkuo kaip šitas. Jei ratai yra posūkio bet vairas nėra, įtaigus kad automobilis yra dėl kai kurių rūšies besisukančio cilindro bet kai natūra Sandėlyje yra išbandyta, tada elgtis kaip EPS norėčiau, kad jūs. Priešingu atveju ne. Taigi leiskite pažvelgti ne trumpą vaizdo įrašą, kuris mano ne ką pasekmes išvaizdą yra tai faktiškai mechaniškai. [Vaizdo įrašų atkūrimas] -Last Penktadienį EPA paskelbė, kad kai Volkswagen Audi automobiliai pagaminti nuo 2009 o šiemet buvo naudojama vadinamasis išderinimo įtaisas gauti aplink emisijos įstatymus suprojektuota taip, kad švaraus oro. Bet ką tai reiškia tiksliai? Na, šiuolaikiniai automobiliai turi dešimtis Kompiuterių jų viduje. Ir kai kurie iš šių kompiuterių padėti koordinuoti funkcijas variklio optimaliam veiklos, o todėl, kad kad yra ne per daug šiukšlių išeina iš išmetimo vamzdžio. Jie iš tikrųjų dirba Tokiu būdu jau keletą dešimtmečių. Iš esmės, kiekvienas dalis šiuolaikinio automobilio variklio turi jutiklis arba valdiklio apie tai, ir šių kompiuterių skaito iš duomenų tūkstančiai kartų per sekundę, atliekant koregavimus kaip ir kuro santykis su oru kad vyksta į cilindrus. Tai oszukiwanie Volkswagen ir Audi modeliai yra dyzeliai, ir dyzeliai turi dar vieną tikrai svarbu kompiuteris kontroliuojami parametrai, kurie yra iš nesudegusių kuro kiekis bus į išmetamosiose dujose. Dabar tai skamba neblogai. Neskamba kaip jūs norėtumėte nesudegusių degalų vyksta į išmetamąsias dujas. Bet jeigu tai yra dyzelinas, turite kažką vadinama NOx gaudyklė, kuri yra įrenginys, kuris sugeria ir spąstai azoto oksidų kad yra teršalais, kurie kitaip eiti į atmosferą. Ir tos NOx gaudyklė poveikis yra tvirtesnis nesudegusių kuro. Taigi išderinimo įtaisas yra speciali programa viduje šių kompiuterių, kurie gali padaryti jį atrodo automobilis atitinka emisiją standartai, net jei jis nėra. "Volkswagen" turėjo problemų dėl savo rankose. Jos dyzeliniai varikliai buvo žinomi gauti didelę kuro ekonomiją, bet NOx gaudyklė veikia tik gerai kai daugiau kuras yra naudojamas. Taigi automobilis būtų aptikti, Naudojant šią išderinimo įrenginio, kai ji buvo gauti išmetamųjų teršalų testas, tai naudoja daugiau kuro, padaryti NOx gaudyklė darbą gerai, kiekis būtų gerai. Bet tada jūs gausite kelyje, prietaisą išsijungia, jūs dega mažiau kuro bet jūs pateikėte tiek, kiek 40 kartus daugiau teršalų į atmosferą. Bet kaip gi tai padarė automobilis žinoti, kad jis buvo bandomą emisijų atitiktį? EPA sako, kad ji buvo sudėtingas sistema, kuri patikrinta dalykus kaip vairaratis, greitis, kiek laiko variklis buvo įjungtas, ir net atmosferos slėgis. Kitaip tariant, ten buvo jokiu būdu tai buvo atsitiktinis nes programinė įranga buvo sukurta labai atidžiai, siekiant nustatyti oficialus išmetamų teršalų bandymas. Štai keletas gana rimtas apgaulė, ir kad Kodėl "Volkswagen" yra tokių rimtų problemų. Tiesą sakant, jų direktorius Martin Winterkornas, tiesiog atsistatydino. Taigi, kas bus toliau? Na, jei jūs esate vienas iš puse milijono dyzeliniai jettas, "The Beatles", Golfas, Passats, arba "Audi A3s vykdomas, Geros naujienos yra tai yra kad jūsų automobilis yra dar saugu vairuoti. Jūs neturite įdėti ją šalin iki Volkswagen išduoda prisiminti. Bet tam tikru momentu jie tikriausiai teks atnaujinti viduje jūsų automobilį programinę įrangą. Kai tai atsitiks jums gali gauti mažiau mylių per baką. Teisininkai jau ruošiasi už klasės ieškinių taip savininkai gali gauti kompensuojamas tam tikru momentu ateityje. Bet, kad nesiruošia atsitikti bet kada vėliau. [PABAIGA PLAYBACK] David J. Malan: Taigi tai iš tiesų kelia įdomi didesnį vaizdą klausimas kaip pasitikėti. Teisė? Visi mes turime "iPhone" ar Androids ar kažkas mūsų kišenės greičiausiai Šių dienų, ar nešiojamieji kompiuteriai mūsų ratus, kurie yra veikia programinė įranga padarė "Apple" ir "Microsoft" ir kekių kitų įmonių. Bet kaip mes žinome, kad tai, ką Šios programinės įrangos produktai darai yra iš tikrųjų, kas tai Įmonės sako, kad jie daro? Pavyzdžiui, kuris yra prie pasakyti, kad kiekvieną kartą, kai skambinti jūsų iPhone arba Android telefonas ar panašiai, kad telefono numeris, taip pat nėra buvo įkeltas į kai kurių įmonės serveryje nes kai programa jūs parašyta, ar tai operacinė pati sistema kaip iOS ar Android, arba todėl, kad jūs įkėlėte kai trečioji šalis app kad kažkaip klausosi viską įvedate arba viskas jūs iš tikrųjų sako. Kaip jūs žinote, kad kai vaikinai veikia klingsėti ar Padaryti sudaryti savo savo programinės įrangos CS50, kaip padaryti, kad CS50 savo darbuotojus, būdu į CS50 bibliotekoje, nebuvo prisijungdami kiekvieną styginių jūs kada nors Dotarłeś ar kas colių jūs kada nors Dotarłeś? Na, jūs tikrai galėtų atrodyti tuo kodo kažko kaip CS50 bibliotekoje, galite gali pažvelgti į kodą Linux operacinė sistema veikia CS50 IDE. Bet nuostabi pristatymas buvo suteiktas atgal 1984 gauna Tiuringo apdovanojimas pagal labai garsus kompiuterių mokslininkas žinomas as-- pavadintas Ken Thompson, kuris gavo Tiuringo apdovanojimas, kuris yra tarsi kompiuteris Science " Nobelio premijos, jei norite, už savo darbą ant operacinė sistema, vadinama Unix, kuris yra labai panašios dvasia, ką mes naudojame, kuris yra "Linux". Ir klausimas, jis paklausė jo priėmimo kalboje, iš esmės nustatantis už sistemą metų metus trukusių diskusijų apie pasitikėjimą ir saugumą, buvo tai. Kokiu mastu viena pasitikėti pareiškimas, kad program-- gabalas iš software-- yra nemokama Trojos arklių? Galbūt tai yra svarbesnis pasitikėti žmonės, kurie parašė programinę įrangą. Ir iš tiesų, mes susiję į aptarimas, kad jis davė priimdamas šį apdovanojimą 80-ųjų apie CS50 tinklapyje pagal paskaitų puslapyje šiandien. Nes tai, ką pamatysite yra tai, kad jis iš tikrųjų suteikia gana paprastas pavyzdys, kaip net panašus klingsėti ar kas sudarytojas Kompiliatoriai kiti naudojami praeityje, Ką daryti, jei įdėta į kompiliatorių mes patys naudojate yra, jei mažai Sąlyga, kad iš esmės teigia, jei pastebėjote, kad šis kodas yra naudojant GetString funkcija arba GetInt funkcija, eiti į priekį ir įdėkite galines duris ar Trojos arklys pavyzdžiui, kad ši programa dabar turi keletą nulių ir tie, kurie kažką daryti kenksmingą. Prisijungimas visus savo klavišų, įkelti, kad duomenys tam tikru serveriu, ar tikrai nieko. Ir kas Ken Thompson eina daryti savo aptarimas yra parodyti, kad net jei jūs turite prieigą prie šaltinio kodas sudarytojas, kad piktavališkai gali daryti tai, nesvarbu, nes ten tai vištienos ir kiaušinių tikrovė per pastaruosius keletą metų pagal kurias kompiliatoriai yra naudojami sudarant patys. Kitaip tariant, kelio atgal, kai kas nors turėjo būti parašyta pirmąjį kompiliatorių. Ir po to, bet kuriuo metu jie neatnaujino šalutinis keičia savo kodą sudarytojas, įtraukti daugiau funkcijų ir recompiling ją žmonės, kaip mums naudoti, gerai, jie naudoja senas versija kompiliatorių sudaryti naujas versija sudarytojas. O jei pažvelgsime tuo aptarimas, kad jis davė, pamatysite, kad dėl tos apykaitinį, jūs iš tikrųjų gali turėti klaidų arba Trojos arkliai įterptųjų programinės įrangos mes naudojame. Ir net jei peržvelgsite kodo šių programų, tai gali būti net akivaizdu, nes apgaulė yra iš tikrųjų kai vyresnio amžiaus versija kompiliatorius, kad bet kada, nes buvo švirkščiamųjų grėsmę į mūsų programinę įrangą. Kuris yra tik pasakyti, mes tikrai negali ir neturėtų pasitikėjimas programinė įranga veikia mūsų nešiojamieji kompiuteriai ar telefonus arba bet vietų skaičius. Ir iš tiesų, vėliau šį semestrą, kai mes pradedame kalbėti apie interneto programavimo ir iš tikrųjų pradėti statyti interneto programų save, mes kalbame apie tai grėsmes ir kt. Dabar, jums gali tekti susimąstėte, ir pastebėjau kad ten buvo maža maža Darth Vader klipų kad Slenksčio buvo ten rodo apie Volkswagen. Jeigu Jūs niekada matė, aš maniau, kad mes turėtų palengvinti nuotaika, nes visa tai labai slegia ir bauginantis. Aš ruošiuosi atsigręžti Super Bowl 2011 kai komercinės paskirties Volkswagen-- ir tai beveik daro juos simpatiškas again-- eteryje pirmą kartą per televiziją. Tai 60 sekundžių klipas kad aš manau, jums patiks. [Vaizdo įrašų atkūrimas] [Muzika - TEMA iš "Žvaigždžių karai"] [ŠUO loja] [AUTOMOBILIŲ STARTS] [PABAIGA PLAYBACK] David J. Malan: Taip. Aš tiesiog patikrinti. Tai automobilis apie pažeidimus sąrašą. Gerai. Taigi, mes pažvelgti į kai Pseudocode akimirką prieš. Ir čia yra didesni fragmentas Pseudocode kodas kad mes matėme kelis kartus iki šiol. Ir tegul naudoja tai galimybė dabar įvesti naują programavimo technika, kuri mes padarėme matyti algoritmiškai Praėjusią savaitę, kai mes pažvelgė merge rūšiuoti. Bet tegul formalizuoti jį ir pamatyti, kaip mes galime jį naudoti faktinio kodas, ir tada mes ketiname naudoti šią technika žemyn kelio dauguma Tikėtina, išspręsti tam tikras kitas problemas. Taigi, tai buvo vienas iš pirmųjų programų mes kada rašė, nors Pseudocode kodą. Ir ką ši programa leido mums padaryti kursą buvo rasti Mike Smith telefonų knygoje. Ir pranešimas ypač aštuonių eilučių ir 11, kurie turėjo šią Eiti į pareiškimą. Ir iš tiesų, tam tikra kalbos C tarp jų, iš tikrųjų turėti teiginys, kad yra tiesiog eiti, kad leidžia jums peršokti į konkrečią eilutę. Tai paprastai frowned nes ji gali būti labai lengvai piktnaudžiaujama ir jūs galite pradėti savo šokinėja programa visur, o ne į naudojant rūšies logika ir kontrolės srauto kad mes naudojamas iki šiol tik su kilpos ir sąlygos ir panašiai. Tačiau mes galime supaprastinti šį algoritmą į Pseudocode kodas taip. Vietoj to kartotinis arba kilpų metodą, kur mes nuolat grįžta ir atgal atgal į liniją trys, kodėl ne mes tiesiog rūšies punt ir daugiau paprastai pasakyti septyniose linijos ir 10, tiesiog pakeisti šių dviejų poros linijos su, else if Smith anksčiau knygoje mes ieškoti Mike į kairė pusė knygos. Kita, jei Smith vėliau, knyga, ieškoti Mike į dešinę pusė knyga. Ir pastebėsite jau su apykaitą. Teisė? Aš ieško mike telefonų knyga ir tada Aš galų gale nukentėjo gal arba linija septyni gal 10 eilutė ir mano nurodymas sau yra paieška Mike pusėje telefonų knygoje. Na, kaip man ieškoti Mike? Aš viduryje ieškoti Mike, kodėl tu tarsi siunčia mane ratu? Bet tai gerai, nes tai, kas yra vyksta su problemos dydžio, kaip parašyta 7 ir 10 eilutė? Mes ne tik kalbėjo, paiešką Mike, ieškoti Mike. Mes specialiai sakydamas ką? Paieška jam kairėje pusėje teisė pusė, kuri yra efektyviai pusė problemos dydį. Taigi viskas OK, kad mes rūšies užsiima šiuo apykaitinį, Tai apskritas argumentas, nes bent jau mes priėmimo problema mažesni ir mažesni. Ir galiausiai mes ketiname pasiekti kad vadinamasis pagrindas tuo atveju, kai mes turime tik vieną puslapį left-- kaip mūsų savanorio praėjusią savaitę did-- mes turėjome vieną puslapį į kairę ir tada mes ne turi toliau ieškoti Mike Smith nes jis arba tame puslapyje ar jis nėra. Taigi, kaip mes galime įgyvendinti šią idėją, šį rūšiuoti apykaitinį faktinio kodas? Na, mes galime išnaudoti technika kad manimi paprastai žinomas kaip rekursijos. Ir mes matėme tai į Pseudocode už merge rūšiuoti praėjusią savaitę. Prisiminkite, kad tai buvo Pseudocode už merge rūšiuoti. Tai, be abejo, net paprastesnis nei burbulas ar atranka arba įterpimo Rūšiuoti tik kalbant apie paprastumą su kuria jūs galite ją išreikšti. Bet tai todėl, kad mes tarsi cikliškai sakydamas, ieškoti kažko ieškant jį dar kartą. Bet mes ieškome tiek ant kairė pusė ar teisingas pusę o galiausiai mes sujungus šiuo atveju. Bet čia, taip pat su šie du rūšiuoti linijos, Ar mes vėl turime tai idėja rekursijos. Ir konkrečiai, ką tai reiškia, į algoritmą kontekste, yra tai, kad algoritmas yra rekursywny jei jis naudoja, arba save vadina. Arba, kalbant apie C, funkcija yra recursive-- funkcija vadinama foo yra grįžtamojo jei foo, kažkur savo kodą, ragina pati funkcija foo. Ir tai blogai, jei visi rūšys nors daro yra skambinti save vėl ir vėl. Tai gerai, jei foo galiausiai sustoja, kaip tai daro sujungti rūšiuoti, sakydamas, palauk, jei tai problema yra super mažas, pavyzdžiui, arba radau tą, kurį aš ieško, tiesiog grįžti. Negalima rekursyviai, ne cikliškai vadintis dar kartą. Ir todėl galime pažvelgti kaip tai iš tiesų gali dirbti. Taigi, aš ruošiuosi eiti į priekį ir atvira iki dviejų šaltinis kodų pavyzdžių čia. Iš kurių vienas yra vadinamas sigma 0. Ir tai yra ne visi rekursywny, bet galime imtis pažvelgti, ką ši programa daro. Aš atimta iš visų komentarai iš jo bet visi šaltinio kodą CS50 s svetainė turi pastabų Jei noriu perskaityti jį dar kartą vėliau. Ir darykime pora apie sveiką protą tikrina čia. Taigi, šio kodo viršuje, mes turime įtraukti CS50.h. Ką tai daryti? Kodėl tai čia? Protingais profanas sąlygomis. Ką tai daro? Taip. Auditorija: Kad GetInt funkcija veikia. David J. Malan: Taigi, kad GetInt funkcija veikia. Kadangi šis vidų failą, CS50.h, kuris matysime prieš ilgai Terminai jos kodo, turi funkcijų krūva declared-- GetInt, GetString, ir tarnauja kitiems, ir jeigu krūva mes iš tikrųjų turime, kad Įtraukti linija, kompiliatorius klingsėti nėra vyksta žinoti, kad jis egzistuoja. Ir pats pasakytina linija du, kur tarpinis junginys yra apibrėžta printf, kuris yra funkcija mes nuolat naudojant gana didelis. Dabar, keturių linija atrodo truputį Funky nes tai tik vienas įdėklas. Jis atšoko kabliataškį, ne garbanotas petnešos, ne viduje ji kodą. Bet ką darė mes vadiname šis dalykas savaitėmis anksčiau? Taip. Taigi prototipas. Ir kodėl mes turime prototipas, kuris atrodo būti šiek tiek nereikalingas paprastai, nes mes paprastai matyti funkcija vėl vėliau į bylą, ar ne? Tad kodėl mes have-- jūs tiesiog braižymo ant galvos, bet aš jį priimti. Taip. Auditorija: [nesigirdi] funkcija po pagrindine. David J. Malan: Būtent. Taigi, kad kompiliatorius žino jus ilgainiui nustatyti arba įgyvendinti kad funkcija po Pagrindinis, matyt. Taigi klingsėti ir labiausiai kompiliatoriai yra rūšies kvailas ir jie bus žinoti tik ką jūs pasakykite jiems. Ir jei jūs norite naudoti funkcija vadinama Sigma, jums geriau mokyti kompiliatorius kad jis egzistuoja iš anksto. Dabar pagrindinis pati, net nors tai linijų krūva, yra gana susipažinę tikiuosi dabar. Ji atšoko, o kilpa do kurio tikslas gyvenime Čia, matyt, yra gauti teigiamas sveikas skaičius nuo naudotojo. Ir tiesiog laikyti jį paerzinti ar jai kol jie bendradarbiauja. Tada pagal 16 Turiu įdomi skambutis. IntAnswer. Kuris kairėje pusė suteikia man Int kuris gali store-- vadinamas Answer-- kurie ketina laikyti, matyt, grįžti vertė sigma. Taigi Sigma yra tiesiog savavališkas, bet prasmingas vardas kad aš suteikti funkcijos kurio tikslas gyvenime yra imtis vieną argument-- mes jį vadiname N šį case-- ir tiesiog imtis šio skaičiaus sumą plius kiekvienas teigiamas skaičius, kad tai mažesnis negu jos. Taigi, jei aš pereiti į numerį nuo 2 iki Sigma, noriu pridėti 2 plius 1 plius 0-- ne 0--, kad man duoda 3. Jei aš praeiti 3 Sigma, aš noriu turi 3 plius 2 plius 1, kuris suteikia man 6 d. Ir taip toliau. Taigi tai tik prideda visus numeriai yra mažesnis arba lygus jai. Dabar, žemyn čia aš tik ketina spausdinti atsakymą. Taigi, kaip greitai normalumas patikrinti, tegul kad Sigma 0-- dot velniop sigma 0-- ir leiskite man įrašykite 2. Ir aš iš tikrųjų Gauk 3. Leiskite įveskite 3. Aš iš tikrųjų gauti 6 d. Ir jei kas nors gali padaryti matematikos greitai, jei aš 50 ką aš ketinu gauti? Auditorija: [nesigirdi]. David J. Malan: Na, ne. Tačiau 1275 kuri yra gana arti. Taigi, tai yra daro 50 rezultatas plius 49 plius 48 plius 47 plius 46 visą kelią žemyn iki 1. Taigi, kad viskas Sigma daro. Bet pažiūrėkime, kaip mes įgyvendinti jį dabar. Taigi žemyn čia yra pati funkcija. Ir tai neatrodo, kad nieko daryti su rekursijos dar. Tiesą sakant, mes naudojant senosios mokyklos technika. Aš Inicijuojama kintama pavadino sumą nuliui, tada aš turiu foreloop čia ir aš, skelbiantys Int vadinamas Aš, kuriame jis lygus 1-- nors galėčiau nustatyti, kad jis lygus nulis, bet kadangi aš darau to, who cares, jei tai nulis arba vienas. Ji ketina turėti jokio poveikio. Taigi, aš Iteracja taip ilgai, kaip aš yra mažiau nei arba lygus m, kuris yra argumentas, kad buvo priimtas. Ir tada aš tiesiog laikyti incrementing I ir įžvalga kilpos visi darau daro sumą plius lygus I. Ir tai sąmoningas. Aš nenoriu daryti, šiame atveju, kaip ir sumos, plius plius. Noriu, kad iš tikrųjų pridėti dabartinė vertė I kuri saugo vis didesni ir didesni ir daugiau į einamuosius. Ir tada aš grįžti sumą. Ir taip atsakymas gauna suma. Ir tada aš jį atspausdinti. Taigi yra galimybė čia nors, rūšies supaprastinti šis kodas konceptualiai ir smūgis natūra vienas yra omenyje kalbant iš paprastumas, nors ji užtrunka kol rūšiuoti iš vertiname kodėl šis yra galinga šių mažų pavyzdžių. Čia yra Sigma one-- todėl Antroji versija šį kodą. Viskas iki viršaus yra identiški taip kad pati istorija taikomas kaip anksčiau. Bet dabar pažiūrėkime ne įgyvendinimas sigma, kuri Aš whittled tiesiog jų lines-- keturios eilutės kodo, tikrai, plius kai garbanotas petnešos ir balta erdvę. Bet ką aš darau? Jei m yra mažesnis nei arba lygus nulis, man reikia kokios rankena kad super paprasta byla. O jei ranka man nulį arba nieko neigiami, tai yra tik keistai, Aš tik ketina savavališkai bet nuosekliai grįžti prie nulio. Nenoriu šį dalyką į patekti į kažkokiam keistam begalybės kilpa dėl neigiamo vertės. Taigi, aš tiesiog pasakyti, jei jūs suteikiate man nuliui arba mažesnė, aš grįžti prie nulio. Bet tai gerai, nes tai kad vieno puslapis telefonų knygoje Liko. Aš kramtymas išjungtas labai konkrečią problemą ir neplaukia kažką rekursyviai. Tačiau 31 eilutėje, kas man atrodo, darai? Skliaustuose yra tiesiog laikyti viskas, tikiuosi, šiek tiek aiškiau. Bet viskas, ką aš darau yra aš grįžti m-- kokia Jums perduoti me-- plius vertė m-- Atsiprašome, plius sigma M minus 1 vertė. Taigi, ką tai reiškia? Jei galite man duoti numerį 3, įvesties, atsakymas Noriu gauti galiausiai yra 6, nes 3 plius 2 plius 1 man duoda 6. Bet kaip man galvoti apie kaip šis kodas veikia? Pirmą kartą aš vadinu Sigma ir aš praeiti vertės 3, tai tarsi sakydamas ant gabalas popieriaus, čia vertė 3 ir aš buvo perduota tai kaip sigma. 3 yra akivaizdu, kad ne mažiau kaip 0, todėl IF sąlyga netaikoma. Else daro. Taigi, ką aš galiu padaryti? Noriu grįžti m, kuris yra 3, plius Sigma M minus 1. Taigi leiskite man sekti tai. Aš ruošiuosi įdėti šią popieriaus lapo žemyn. Ir kas vertė, būti aišku, aš ketina perduoti į sigma Šiuo istorija? Kas numeris? 2, tiesa? 3 atėmus 1 yra 2. Taigi aš tiesiog reikia šiek tiek makulatūra čia. Taigi dabar Sigma vis vadinamas dar kartą. Ir aš sąmoningai įdėti tai žemyn, nes tai lyg sustoja kad istorijos versija nes dabar aš dėmesio nuo signalo M minus 1. Taigi m buvo 3 m atėmus 1 yra 2. Taigi čia yra 2, kad aš buvo perduota. 2 yra akivaizdu, kad ne mažiau kaip 0 kad atvejis netaikomas. Kitaip aš grįžti m, kuris yra tai dalykas, plius Sigma ir kas vertė? Taigi, jei sigma iš 1--, nes m yra dabar 2 SO 2 atėmus 1 yra 1. Taigi dabar turiu tik vertę 1. Aš artimųjų tik skaičių 1 funkcija sigma-- arba pats here-- tiek 1, žinoma, nėra mažiau nei nulis, dar netaikomas. Else return 1 plius Sigma ką? 0. Taigi leiskite man tiesiog prisiminti, kad. Aš grįžti į vėliau. Dabar aš ruošiuosi eiti į priekį ir jota žemyn 0, nes tai mano argumentas ar parametras. Aš išlaikė skaičių 0 ir, galiausiai, šis procesas tiesiog kartoti sau skelbimą nauseum ar nutraukti, nes tai, ką aš iš karto daryti, kai matau šį 0? Grįžtu prie nulio. Taigi, dabar jūs turite atsukti istoriją. Jei aš dabar grįžti atgal laiku, kas buvo paskutinis dalykas, Aš, jei buvo pažodžiui pervyniojimas video? Aš ruošiuosi pasiimti naujausias 1 ir tai suteikia man 1 plius 0 yra 1. Jei aš nuolat prisukimo istorija, kad ketina suteikti man 2 plius tai veikia vertė, kuri yra 1. Štai 3. Ir tada aš ruošiuosi laikyti pervyniojimas. Kai aš pirmą kartą pribaigti skaičių 3-- taip 3 plius 3 suteikia man 6. Ir dabar, jei jūs vynioti vaizdo iki šio taško, tai buvo labai Pirmasis klausimas, aš paklausiau. Kai praėjo 3, kas yra Sigma 3? Tai iš tiesų 6, sumos ir Visi šie popieriaus gabalus. Taigi, jei tai trunka šiek tiek laiko wrap savo mintis aplinkui, tai gerai. Tačiau mano, kad tai buvo little-- jį buvo labai sąmoningas, kad aš sukrauti šie numeriai ant kito viršaus. Tai tipo kaip turintys memory-- įrašą laiku, tarsi vaizdo skruberyje, kad aš iš tiesų gali atsukti į. Ir mes ketiname grįžti į kad metafora tik šiek tiek. Bet pirmiausia, it turns out, kad ten iš Geeks ir juokingų žmonių, Manau, ne "Google". Ar kažkas, kas labai gerai "Google" paiešką proto artėja tik už momentą ir man padėti ieškoti kažko? Labai, labai mažas raktas. Kažkas, kas niekada sugalvoti prieš, galbūt. GERAI. Taip? Nagi. Nagi žemyn. Koks tavo vardas? SAM: Sam. David J. Malan: Sam, nagi žemyn. Tai yra ta pati. Malonu susipažinti. Ei. Nagi daugiau. Taigi, visi man reikia daryti, jei galite Sam, čia "Google". Ar jums ieškoti terminas rekursijos? Negalima sugadinti. Ir dabar let's-- taip. Gerai Spauskite, kad. Geriau spustelėkite, kad. Ahh, jį gauti. Nėra? GERAI. Taigi padarykime keletą kitų. Ne tiek daug, susijusios akademiškai čia, bet ar kada nors ieškojote Google Anagram? SAM: Ne David J. Malan: Gerai. Ieškoti Anagram vietoj rekursijos. Kaip apie kreivai. Jūs kada nors ieškojote kreivai? Dabar, tai vienas yra šiek tiek sunku pamatyti, bet tikiuosi everything's-- Gerai. Tai tiesiog jums ir man naudojasi tai. GERAI. Taigi, pagaliau, tai one's-- tai šiek tiek kreivai. Dabar tai padaryti barelį ritinėlį. Nuostabus. Gerai. Didelis ačiū Sam. Čia jūs einate. Ačiū. Taigi, kas vyksta visiems Šių kvailas pavyzdžių? Taigi tikrai, prispaudžia gaubtu "Google" milijonai eilučių kodo matyt yra keletas kvailas JEI sąlygos, kurios yra iš esmės tikrinti, ar vartotojas turi įvedėte šios frazės, kažką daryti, kad tikriausiai paėmė nontrivial daug laiko įgyvendinti tik būti smagu tokiu būdu. Bet tai viskas užverda iki po gaubtu. Bet, žinoma, rekursija yra daugiau iš geekier pavyzdys tarp tų specialių triukų. Ir tikrai ten kiti ten kaip gerai, kad mes galbūt net ne atrado tik dar. Taigi pažvelgsime, ar mano dabar taip programa, ir tikrai patraukti bet iš jų savo išeitį. Aš ruošiuosi eiti į priekį ir atverti programą, kad yra ketiname bandyti sukeisti dvi reikšmes. Bet kol mes ten, tegul tai padaryti. Ar mes dar vieną savanoris, manau? Ar norėtumėte savanoriauti? Nėra? Nagi iki. Nagi iki. Gerai. Taigi jūsų vardas yra kas? LAUREN: Lauren. David J. Malan: Lauren. Nagi iki Lauren. Taigi Lauren yra yra ginčijo čia taip. Malonu susipažinti. Taigi Lauren čia yra priešais jos dviejų tuščių puodeliai. Ir mes turime šiek tiek oranžinė sulčių ir kai pienas ir mes ketiname eiti į priekį ir daryti toliau. Užtenka tik ketina užpildyti šią. Keletas uncijos pieno Čionai ir tegul užpildyti šiek tiek apelsinų sulčių čia. Ir priešais visus Šios auditorijos nariai, apsikeitimo dviejų verčių šių puodeliai. Įdėkite apelsinų sulčių, pieno puodelis ir į apelsinų sulčių stiklinė pieno. Kaip jūs tai padaryti, jei jums buvo ne Namai ir turėjo prieigą prie kitų tiekimo? LAUREN: Padėkite ją į kitą puodelį. David J. Malan: Gerai. Taigi leiskite turėti laikiną kintamasis, jei mes. Ir eiti į priekį dabar ir įgyvendinti tas pats Swapping procedūra. Labai gerai. Mes įdėti OL į laikinas kintamasis, pienas į OL kintamojo, ir dabar laikinas kintamasis į pieno kintamąjį. GERAI. Taigi labai gerai padaryta iki šiol. Taigi paaiškėja out-- konstatuoti, kad pagalvojo tik akimirką. Čia tiesiog geek jį šiek tiek, tai būtų atitinkamas kodas C kad mes tik įgyvendinti. Mes turėjome du įėjimus, abu A ir B kuri mes tiesiog pasakyti paprastumo yra INT-aisiais. Ir pastebėsite čia, jei noriu sukeisti Iš dviejų kintamųjų A ir B vertes, mes iš tiesų reikia tarpininkus A laikinas kintamasis, laikinas puodelis, į kurią supilti viena vertybių, kad mes turime už jį vietos rezervavimo ženklą. Bet tada kodas yra būtent kaip Lauren čia įgyvendinta. Dabar, tik gauti mažai crazier, paaiškėja, kad jūs galite padaryti tai be laikinas kintamasis. Norėdami tai padaryti tinkamai, nors mes ketiname turėti apgauti su kai chemija. Mes turime keletą papildomų puodeliai čia. Taigi arčiausiai dalykas, kad atrodo kaip pieno ir vandens perhaps-- arba pieno ir OJ-- yra mes turime kai vandens, todėl mes užpildyti šią vieną iki su keletą uncijų švariu vandeniu. Tai tikriausiai per daug. Taip. Tai tikrai per daug. Laikykite ant vienos sek. Ir dabar mes turime aliejaus, kuris, kaip prisimenu nuo vidurinės mokyklos chemijos klasę, tikiuosi, ji neturi sumaišoma su vandeniu. Bet tai kokios rūšies atrodo pieno ir OL. Taigi dabar, nenaudojant laikinas kintamasis, galite sukeisti šiuos du vertybes? Taigi aliejai eina į puodelį vandens, vanduo teka į naftos puodelio. LAUREN: Jokių kitų puodeliai? David J. Malan: Jokių kitų puodeliai. Ir aš ne iš tikrųjų išbandyti tai prieš šių metų todėl aš nežinau, jei tai bus faktiškai dirba chemiškai. Tai nebuvo nutikti. Ar tai veikia? Gerai. Taigi atskiriant? Geras. Dabar mes turime gauti vandens į kitą puodelį. Gudresni chemija koncentratoriai galėtų tikriausiai tai padaryti geriau už mane. LAUREN: Vanduo yra ant dugno. David J. Malan: The water--, kad buvo kas svarbiausia paskutinį kartą mes tai padarėme. Jūs turite padaryti ją į teisingą tvarka. Taip. That's-- Gerai. Taigi dabar mes turime du puodeliai aliejaus. GERAI. Tai gerai. Bet chemiškai jei tai neapdoroti I-- LAUREN: Šis yra vanduo. David J. Malan: Tai daugiausia vandens. Gerai. Bet tai vis dar tas pats puodelis, kaip ir anksčiau. Taigi užpilkite it-- pabandykite jį ten. GERAI. Tai yra geras panaudojimas klasės laiko šiandien. GERAI. Taigi dabar we-- gražus. Rūšiuoti. Gerai. Taigi labai geras. Dėkojame Lauren. Labai gerai padaryta. Taigi tiesiog susprogdinti savo mintis, ir tai turbūt kažkas žaisti su, jei jums patinka CS50 ID, galite, iš tiesų, apsikeitimo dviejų kintamųjų nenaudojant laikiną sveikasis skaičius. Ir tai yra, atitinkantis kodas C. Ir jei jūs prisimenate iš paskutinės Trečiadienis, mes pristatėme, jei trumpai, keletas naujų operatoriai C ir neturi kas prisiminti, kas mažai morkų simbolis yra, kad mažai trikampio simbolį klaviatūroje reiškia? Kas Bitinis operatorius? Auditorija: EXOR. David J. Malan: EXOR. Arba išimtines. Taigi, jei norite, tiesiog for fun ne Namai duoti a ir b du savavališkas vertės kaip ir bet eight-- ir aš rinktųsi aštuonių bitų reikšmę. Jei tai padaryti su 32 bitais, jūs labai greitai atsibosta. Bet tik suteikti aštuonių bitų vertė tai ką, vienas ar du, ir duoti b panašiai vertę. Ir tada naudojant apibrėžimas iš XOR nuo paskutinio trečiadienį, taikyti tą truputį, kiekvienas tie aštuoni bitai kiekvienam iš a ir b ir tada daryti tiksliai už šį kodą. Ir tai ne neteisingas, ką čia matote ekrane. Iš tiesų suvesta tris XOR operacijų ir kažkaip stebuklingai A ir b keisis pozicijas neprarandant informacijos. Taigi naftos ir vandens triukas yra Artimiausias realaus pasaulio įsikūnijimas Galėčiau galvoti imituoti, kad. Bet tai tikrai lengviau naudoti laikiną kintamąjį kaip šiuo atveju. Ir tai taip pat yra puiki galimybė pasakyti, taip pat, šis mikro optimizavimo rūšies, kaip kompiuterio mokslininkas sakyčiau, o rūšies įdomus girtis apie tai, kaip tu tai be kaip Swapping su papildomu kintamuoju, tai dar ne viskas, kad įtikinamos. Nes taupyti kaip 32 bitai, į realų int atveju, yra ne visi, kad įtikinamų dėl sistemos, kurioje jums gali būti naudojant dešimtis megabaitų ar net daugiau tokių atminties šių dienų. Ir iš tiesų, kai mes gauname vėlesniam problemų rinkinys ir jums įgyvendinti rašybos tikrintuvą ir jūs galima ginčyti tai padaryti su tai taip mažai RAM ir taip mažai laiko, kiek įmanoma dėl computer-- jūs vis dar turi per savaitę įgyvendinti it-- jums have-- jūs būsite ginčijo sumažinti šiuos išteklius. Ir tai tikrai vienintelis tam reikia tik šį semestrą kur jums bus skatinami skustis išjungti net smulkiausias veiklos kainuoja kitaip. Taigi what-- kaip mes galime tai matome tikrąjį kodą? Leiskite man eiti į priekį dabar ir atverti pavyzdį kad sąmoningai vadinamas Nėra Sukeisti nes ji neturi Iš tiesų apsikeitimo kintamuosius kaip jūs iš tikrųjų galima tikėtis. Taigi leiskite pažvelgti. Štai programa, kuri neturi CS50 biblioteka vyksta, tiesiog standartinė i / o. Dabar mes turime prototipą už apsikeitimo iki viršaus, kuri tiesiog tai reiškia, kad turiu būti apibrėžta vėliau. Ir čia pagrindinis. I sutartinai priskiriamas x ir y, atitinkamai, vertės vieno ir dviejų tik todėl, kad jie maži ir lengva galvoti apie tai. Ir tada aš tiesiog turėti printfs krūva kur turiu normalumas patikrinti. x yra 1 ir y yra nuo 2, matyt, ką tie printfs pasakys. Taigi ne magija šiol. Tada aš ruošiuosi teigia su spausdinti def, Swapping dot dot dot. Aš ruošiuosi skambinti apsikeitimo funkcija, einančios į x ir y. Ir tegul prielaidą, kad dabar apsikeitimo įgyvendinama tiksliai kaip tai buvo prieš momentas su laikina kintamąjį. Ir todėl aš teigti drąsiai, pavertė. x yra dabar dabar tai ir y yra tai, kad. Tačiau failo, žinoma, vadinamas Nėra Sukeisti. Taigi leiskite realiai pamatyti, kas atsitiks. Jei aš kaupia jokios apsikeitimo ir tada do ./noswap, x yra 1, y yra 2. Swapping pavertė. x yra 1, y yra 2. Taigi ji iš tikrųjų atrodo ydinga net nors swap-- tegul slinkite žemyn now-- įgyvendinama tiksliai vienam kodas siūliau prieš momentas. Taigi mes nesiruošia gauti išgalvotas su XOR stuff dabar. Tai taip pat turėtų dirbti tik kaip su pienu ir OL, bet neatrodo, kad reikia dirbti. Taigi leiskite tai padaryti dar kartą. Gal aš tiesiog nebuvo paleisti jį į dešinę. Taigi leiskite paleisti Nėra Sukeisti dar kartą. Gal I-- Nr. Taigi tai tiesiog neveikia. Taigi leiskite padaryti šiek tiek sveiko proto patikrinimą. Leiskite man eiti į priekį čia Swap ir tiesiog pridėti, palauk, a yra% i / n ir tegul plug-in į vertės. Nes aš tikrai noriu pamatyti, kas vyksta. Ir iš tikrųjų, tai yra Derinimo technika kad jums gali būti naudojant iš Darbo valandos ar namie jau, panašus į pirmojo pusmečio Dano Armendariz Vaizdo PSET3 kuriame mes pristatėme Spausdinti def kaip rekomenduojama technika, bent jau paprastų atvejų. Leiskite man eiti į priekį ir paleisti padaryti nėra apsikeitimo vėl ./noswap. Įdomu. Taigi pastebėti tai, ką, atrodo, kad būtų tiesa. x yra 1, y yra 2, bet a yra 2, jei b yra 1. Taigi tie du kažkaip gavo pavertė bet X ir Y yra ne gauti pavertė. Taigi, kad būtų aišku, kas vyksta yra, čia turiu x ir y ir tie, kurie kintamieji vietos į apimtis pagrindinis, aš einančios į x ir y apsikeitimo. Dabar, apsikeitimo, kaip atskiras funkciją, yra nemokama skambinti savo argumentus arba jo parametrai nieko ji nori. "Foo ar baro arba X arba Y arba A arba B. Tiesiog, kad būtų aišku, kad jie nėra identiškas X ir Y per se, Sakiau a ir b. Bet mes galime skambinti jiems nieko mes norime. Ir taip atrodo apsikeitimo yra perduodama x-- AKA a-- ir tai pravažiuojamas y-- AKA b. Kažkaip šios trys linijos Swapping šias vertybes būtent kaip Lauren padarė su pienu ir OL. Bet kai mes atsispausdinti vertybėms, a ir b iš tiesų yra sukeisti, bet X ir Y neturi juos pakeisti. Prisiminkite, kad X ir Y yra čia. Taigi, mes galime pamatyti tai per Kitas būdas, kaip gerai. Ir tai taip pat yra technika įdėta į problemą nustatyti trys. Vykime į priekį ir tai padaryti CS50 ID, jei dar neturite. Dešinėje pusėje mes turėti šią Debugger skirtuką. Ir jeigu Jūs atidarote tai aukštyn, ten kai paslaptinga informacija kad manimi išmesti į tave iš pradžių. Bet tegul erzinti tai be labai greitai. Taigi vienas, pamatysite vietinius kintamuosius. Pasirodo, kad statyti į CS50 IDE ir iš programavimo aplinkoje daug daugiau Apskritai, yra debugeris. Įrankis, kuris leidžia vizualiai pamatyti kas vyksta viduje jūsų programa nereikia griebtis pridedant printfs ir kompiliuoti ir paleisti ir pridedant printf "ir renkant ir veikia, jau iš darbo valandomis arba namuose, tikriausiai gauti gana varginantis. Taigi čia, tik akimirkai, mes ketina pamatyti realiu laiku Mūsų vietos kintamųjų reikšmės. Mes taip pat bus galima nustatyti kas yra vadinama ribinės reikšmės, kurios Yra galimybių, mano programos, jei norite sustabdyti vykdymas konkrečiu eilutę kodo kad aš smalsu. Teisė? Šios programos paleisti sekundės. Tai tipo gražus mus lėčiau žmonėms gebėti sustabdyti, skirkite laiko, pamatyti tai, kas vyksta aplink tam tikra linija kodą be programos arimo per ją ir apdailos visiškai. Taigi A ribinės reikšmės ketina leisti mums pertrauka, ir sustabdyti tam tikru. Skambučių kamino yra išgalvotas būdas sakydamas, kokias funkcijas šiuo metu yra vadinamas šiuo metu. Pagrindinė visada vadinamas pirmas. Bet jei Pagrindinė vadina funkcija vadinama Sukeisti, mes iš tikrųjų ketiname pamatyti šį bokštas funkcijų, kurios buvo vadinama atvirkštine chronologine tvarka. Taigi pažiūrėkime, kad. Aš ruošiuosi nutolinti. Aš ruošiuosi grįžti į savo kodą. Ir tik todėl, kad aš noriu būti pedantiškas čia Aš ruošiuosi eiti į priekį ir spustelėkite tik į linija penkių kairę. Ir tai sukuria raudoną taškelį. Ir pastebėti dešinėje pusėje kad debugeris žino, ei, Aš tiesiog pasakė ne atskaitos tašką noswap.c linija penki, specialiai šiuo kodu linija. Taigi debugeris žino, kad aš prašėte, kad kitą kartą Aš paleisti savo programos, kurią ji pauzę vykdymas yra, o ne tik veikia visa tai super greitai. Taigi, dabar aš ruošiuosi spustelėkite debug mygtuką pačiame viršuje IDE ir tai ketina daryti toliau. Ji ketina atidaryti iš pradžių šiek tiek baisu ieškote antrasis terminalas window-- nuotolinio derinimo iš surengti tokia ir such-- ir mes grįžti į tai, kas visi tai reiškia, kad prieš ilgas. Bet tai, kas svarbu dabar yra tai, kad, kad "red dot" smogė, Debugger tyčia stabtelėjo execution-- ne tą per se linijos, bet pirmas linija faktinio kodą tą funkciją. Ir štai kodėl linija septyni yra dabar paryškinamas geltonai. O dabar leiskite pažvelgti dešinėje pusėje. Atrodo, pagal nutylėjimą, pakankamai gražiai, X yra kas vertė? 0. Ir Y yra kas vertė? Nulis. Ir tai galima tikėtis, ta prasme, kad X ir y-- kad geltona line-- turi nebuvo įvykdyta dar. Taigi x neturėtų turėti vertę 1. Tai gali turėti bet kurią kitą vertę, taip vadinama šiukšlių vertė. Ir mes pasisekė, kad tai nuliui ne šiame punkte, iš esmės. Taigi, dabar ten tik nedaugelis mygtukai turime rūpintis kai derinate šiuo būdu. Atkreipkite dėmesį, čia mes turime Play mygtuką. Ir jei mes žaisti ar nukentėjo tęsti, tai tik ketina paleisti per programos poilsio arba tol, kol ji hitai kitą atskaitos tašką. Bet aš ne nustatyti bet kokį kitą Ribinės todėl tik ketina paleisti per pabaigoje. Tai pralaimėjimus natūra tikslas išnyra aplink. Taigi vietoj to, aš rūpi Šios piktogramos į dešinę. Ir jei aš užveskite pelės žymeklį ant juos, kaip jūs turite per daug, pamatysite mažai tips-- įrankių patarimų. Tai vienas peržengti. Dabar tai nereiškia Pereiti taip linija kodą. Tai tiesiog reiškia, paleiskite jį ir judėti į kitą, judėti į kitą, pereiti į kitą. Kitaip tariant, per kad mygtuką, galiu vaikščioti per savo kodas vienu žingsniu metu. Eilutė po eilutės, pažodžiui. Dabar, į dešinę kad ten dar vienas kad mes matome tik akimirką. Tai yra taip vadinamas Žingsnis į piktogramą, kad manimi ketina leisti man neria į kitą funkciją. Bet pažiūrėkime, tai tik akimirkai. Taigi, aš ruošiuosi spustelėkite peržengti. Ir dabar pastebėsite, kaip aš spustelėkite Ši viršuje dešinėje mygtuką, saugoti savo akis maždaug pagal Vietinis Kintamieji ir pamatyti, kas atsitiks su x. x yra 1, nes dabar geltona linija jau įvykdytas ir mes persikėlė į 8 eilutę. Ir akimirką y turėtų tikiuosi tapti 2. Dabar nieko, įdomi atsitinka truputį. Visa tai yra printf. Ir pastebėsite, mano antrinio terminalo langas, matau spausdinimo def produkcija. Ir dabar aš turiu padaryti sprendimas, kaip programuotojas. Galiu žingsnis virš šios linijos kodas, jį paleidus, bet ne vis smalsu apie tai, kas viduje. Arba aš iš tikrųjų galėtų dėti į jį ir vidun pati Sukeisti. Taigi darykime pastarasis. Leiskite man eiti į priekį ir spustelėkite ne peržengti bet žingsnis į. Pranešimas, visi staiga langų pokyčiai pabrėžti pirmas eilutę kodo keitimas. Štai linija 21. Ir dabar, kas natūra funky yra tai, kad Jei atrodo per čia, kaip ir tikėtasi, kablelis b yra 1, ir 2, atitinkamai. Kodėl temp 32767? Primindama, kad temp, panašiai kaip tuščias puodelis prieš momentas, deklaruojama čia on-line 21. Kodėl 32,000- Aš turiu galvoje, kodėl jis tiesiog kažkokiam keistam vertė? Taip? Auditorija: Tai ne inicializuoti. David J. Malan: Tai nebuvo inicijuotas. Taigi, mūsų kompiuteris visada turi fizinę atmintį. Jis visada turi fizinę RAM. Ir visada Zero ir vienas yra ten, tiesa? Kadangi mes naudojame mūsų kompiuterio visą dieną, jūs naudojate CS50 IDE arba serveriai visą dieną. Taigi, kad RAM arba turi keletą nulių arba kai One arba kai nulių ir. Nesvarbu, ar ne jūs naudojate juos. Jūs negalite tiesiog tuščias erdves, kur norite bitai. Jie nei su nulių ir. Taigi paaiškėja, kad temp, nes mes neinicijuota ją dar, mes turime tuos 32 bitus, bet jie jau nėra buvo inicijuoti visoms žinomoms vertybėms. Taigi, kas jiems buvo dauguma neseniai vartojote for-- tų 32 bits-- mes tiesiog matome kai kurių artefaktų Ankstesnis naudoti tose ypač 32 bitai. Kaip tik aš spustelėkite peržengti nors, Na ir na temp ketina gauti vertę 1. Ir jei aš tai padaryti dar kartą, a yra bus suteikta vertės 2 , tuomet b ketina būti suteikta vertę 1. Ir kas taip malonu dabar šis punktas į istoriją yra tai, kad debugeris yra rodo man, super lėtai mano tempu, koks apsikeitimo sandorių valstybė. Tačiau pastebėti ne čia viršuje, pranešimas kad skambutis kamino tikrųjų turi du sluoksnius į jį. Dabar tas, kuris manimi pabrėžė, kaip Sukeisti, jei aš spustelėkite Pagrindinė vietoj to, Atkreipkite dėmesį, kaip vietiniai kintamieji keisti nes kūrėjas gali tik apynių aplink ir eiti į bet skirtingos apimties. Taigi, nors mes darome visa tai dirbti ir teisingai Swapping a ir b jei aš einu atgal ir pirmyn tarp Swap kur a yra 2, ir b yra 1, ir Main, jau Pagrindinė turėjo įtakos ne visi? Ne. Taigi, kas yra Takeaway čia? Na, it turns out, kad bet kuriuo metu skambinate funkciją kaip apsikeitimo sandoriai, ir jūs perduoti jį argumentus, kas Jūs pereiti į Swap funkcijos šiuo atveju yra kopija šių argumentų. Taigi, jei x ir y yra kiekvienas atitinkamai 32 bitų, kas Sukeisti gauti yra dvi naujos vietos kintamieji, ar argumentų, vadinamas ir b-- bet tie yra savavališkas names-- bet nulių modelis ir tie, viduje a ir b yra pamušalu iki būti identiškos x ir y tačiau jie yra ne tas pats, kaip x ir y. Tai tarsi Pagrindinė turi savo gabalas popieriaus numeris 1-ą ir 2 x ir y, ir tada, kai jis rankas, kad gabalas popieriaus Sukeisti, Sukeisti labai greitai gauna savo rašiklis, rašo žemyn 1 ir 2 savo popieriaus lapo, rankos atgal originalų xy į pagrindinį ir tada daro savo dalykas su a ir b. Ir tai yra svarbu, nes dabar super tai turi nontrivial pasekmių už faktiškai raštu teisingą kodą nes atrodytų, mes negalime apsikeitimo du kintamuosius. Parašiau teisingą apsikeitimo funkciją. Mes jį įgyvendino kartu su Lauren, kaip teisingas apsikeitimo funkcija iš tikrųjų, bet, matyt, nė vienas iš šių klausimai, jei jūs negalite iš tikrųjų apsikeitimo dvi reikšmes visam laikui. Taigi, mes turime kitą būdą faktiškai gauti ne tai, ir turime, kad būtų galima tikrųjų išspręsti šią problemą. Ir paaiškėja out-- ir mes ateiti Atgal į šio konkretaus paveikslėlio prieš long-- tai yra vienas iš būdų, kad jums gali atkreipti jūsų kompiuterio atminties. Tai tiesiog stačiakampis. Jūs galite piešti bet skaičius būdais, tačiau tai patogu piešti kaip stačiakampis dėl šios priežasties. Mes ketiname pradėti šiandien ir už jos ribų kalbame apie vadinamąją kamino. Ir kamino yra tik riekė iš RAM-- iš memory-- riekė kad funkcijos turi prieigą kada jie vadinami. Ir taip paaiškėja, kad ne pačioje apačioje šio kamino kur visi pagrindiniai vietinių kintamųjų ir org C org V ir visi, kad kita ketinate eiti pagal nutylėjimą. Ir jeigu pagrindinis ragina kai kurias kitas funkcijas, pavyzdžiui apsikeitimo sandoriai, gerai, Sukeisti ketina gauti kitą sluoksnis atmintį iki virš jo. Ir taip tiesiog suteikti jums greitai paviršutiniškai nuotrauka tai, jei aš einu per here-- ir leiskite man veidrodis tai dėl Pakabinami kaip well-- kas tikrai turiu, jei mums rūpi tik apie apatinė šio paveikslėlio dabar, yra tai, kad, kai aš paleisti programą ir pagrindiniai iškviečiamas, Pagrindinė skiriamas iš riekė RAM mano kompiuteryje, kad yra šio vadinamosios pluošto apačioje. Ir aš ruošiuosi padaryti ją sąmoningai, kaip aikštėje. Taigi, tai, kaip 32 bitų ar keturi baitai. Ir jei tai pagrindinė funkcija turi kintami vadinamas x, kurių vertė yra 1 ir ji turi kintamąjį vadinamą y su 2 vertės, tai kaip vartoti šį atminties rakštis, kad Pagrindinė buvo suteikta pagal veiklos sistema ir dalijant jį taip, kad pirmasis vietinis kintamasis eina čia antras eina čia, ir tai viskas. Kai Pagrindinė ragina apsikeitimo sandoriai, apsikeitimo gauna savo gabaliuką atminties kad mes, kaip tai padaryti iš operacinės sistemos, ir jis ketina turėti savo pačių vietos kintamieji remiantis Mūsų įgyvendinti anksčiau su vietos rodikliams ir b, kad iš pradžių gauti vertybes 1 ir 2. Bet tada, kai tik SWAP kodas vykdo, Lauren tikrųjų apsikeitimo sandorių OL ir pienas, kas vyksta? Na, tai 2 tapti 1 dalį, šis 1 tampa 2, ir, beje, yra temp kintamasis, kuris manimi yra naudojamas, kad visą laiką, kad ilgainiui nueina. Bet tai nesvarbu kiek dirbate Šioje eilutėje of-- šiame atminties, X ir Y yra visiškai nepaliesti. Taigi, mes turime tam tikrą užleidimas Sukeisti ir funkcijos, kaip ji Paslaptis prieiga, jei norite, kad funkcijos like-- į atmintį kaip x ir y. Taigi leiskite pažvelgti pavyzdys, kuris padeda mums pamatyti, ką praėjo vyksta visą šį laiką. Aš ruošiuosi eiti į priekį ir atverti palyginkite nulio. Ir aš ruošiuosi uždaryti Mūsų debugeris, aš ruošiuosi uždaryti šį baisu ieškote pranešimą ką tik sako, palauk, Jūs esate vidurinėje derinti. Aš ruošiuosi paslėpti šį skirtuką čia tiesiog grįžti į paprastumą. Taigi nesijaudinkite, jei GDB žūsta. Tai tiesiog reiškia, kad programa turi buvo mesti, tyčia šiuo atveju, man. O dabar palyginkite nulis tai daro. Aš naudoju CS50 biblioteka standarto I / O. Aš turiu pagrindinę funkciją, kad pirmoji sako, ką nors pasakyti, ir gauna eilutę. Tada sako, kad ji ir vėl gauna kitą eilutę. Ir pastebėti, kad šie du stygos yra vadinami s ir t, atitinkamai. Ir dabar ši programa, palyginkite Nulis, jo gyvenimo tikslas, jis turėjo man pasakyti, aš įrašykite tą patį? Ir todėl aš ruošiuosi grįžti į savaitę vieną. Aš naudoju mano vienodas vienodas operatorių kuris yra kokybės operatorius. Ne perleidimas operatorius, lygybės operatorius. Aš tiesiog lyginant su S ir T. Tad iš tikrųjų eiti į priekį ir tai padaryti. Ir aš ruošiuosi eiti į priekį ir padaryti palyginkite nulio. Aš ruošiuosi daryti ./comparezero. Ir aš ruošiuosi eiti į priekį ir ką nors pasakyti kaip, darykime mama mažosiomis raidėmis ir kaip apie mama didžiosiomis raidėmis. Ir, žinoma, aš tipo skirtingus dalykus. Gerai. Štai galima tikėtis. Leiskite paleisti jį dar kartą. Abu kartus padaryti mažosiomis raidėmis, mažosiomis raidėmis. Tai atrodo super identiškas mane. Įveskite. GERAI. Gal tai tiesiog keista, nes tai ne mylėti savo gramatiką. Taigi darykime kapitalo mama, kapitalo Mama, identiški. Skirtingi dalykai. Taigi, kodėl taip yra? Na, kas iš tikrųjų vyksta apie po gaubtu čia? Taigi grįžkime per čia tik akimirkai ir apsvarstyti, ką GetString yra iš tikrųjų daro. Kai skambinate GetString, tai funkcija, mes patys rašė ir tai kažkaip gauna seka simbolių iš vartotojui. Ir galime manyti, kad pirmasis laikas man skambinti GetString, kuri suteikia man iš atminties riekė, kad atrodo taip. Ir jei aš įvedėte mažosiomis M-O-m-- ir tai, kas vyksta po to? Tiesiog greitai normalumas patikrinti. Kairinis pasvirasis brūkšnys nulis. Mes žinome, kad. Ir prisiminti, kad mes žaidėme aplink su Zamila pavadinimas ir kitų pavadinimų krūva kai Robas buvo čia ieškome ne tai, kas vyksta viduje atmintį. Taigi, kad istorija yra lygiai tas pats. Tai yra tai, ką GetString grįžta į mane. Dabar, mano kodas momentas prieš saugomi grįžti vertė GetString į kintamąjį vadinamas s. Ir tada antrą kartą aš jį pavadino, jis saugomas jį kintamojo vadinamas t. Taigi, jei aš einu per čia, man reikia atkreipti šį vietinį variable-- ir aš paprastai vyksta atkreipti eilutę kaip just-- mes vadina jį s-- kaip mažai aikštėje čia. Ir dabar, somehow-- kaip veikia mama vidun šio kintamojo s? Na, mes turime grįžti kad pirmųjų principų čia. Ką GetString tikrųjų grįžta? Taigi, Pasirodo, kad M-O-M Backslash nulis, ir bet koks skaičius Kitų styginiams atminties kaip Zamila ir Robas arba Andy ar bet kokius kitus, yra, žinoma, mūsų kompiuterio RAM arba atminties. Ir jūsų RAM turi like-- turite RAM koncertą, du koncertai RAM, arba milijardo ar du milijardas baitų, arba gal net daugiau šių dienų. Taigi tarkime, šiandienos tikslais, kad nesvarbu, kaip mes numeruoti juos, bet mes galime suskaičiuoti kiekvieną iš tų milijardų ar du milijardai ar keturis milijardas baitų. Ir tegul tiesiog pasakyti, kad savavališkai tai yra pirmasis įkandimo, antroji įkandimo, trečia, ketvirta. Aš sąmoningai nenaudoja prilyginamas nuliui šiandien, bet mes grįžti prie to. Taigi, kitaip tariant, jei tai yra labai pirmą kartą aš naudoju šią programą, Aš tiesiog sekasi ir pirmasis įkandimas yra vietos vienoje, o vėliau du tada tris kaip keturi. Ir jei aš nuolat piešimas, dėžutės numeris du milijardus būtų būdas čia. Taigi, ką jūs manote, tada, GetString tikrųjų grįžta? Jis negrįžta M-O-M Atgal nerijos velniop nulis savaime, nes tai aiškiai netilps langelį, kad aš sudarytas. Taigi, ką dar gali GetString tikrųjų grįžta visi šie savaites? Atsakymas dėl Pagrindinis diskusijų čia kažkur. Jūs negalite tilptų M-O-M Atgal nerijos velniop nulis, Taigi, kas gali prasmės vietoj? Jei jums teko būti itin protingas, išleisti nuo vadinamojo inžinerijos skrybėlę, Ką galėtumėte grįžti? Kas yra mažiausia suma informacijos galite grįžti, kad vis dar tegul Jums susirasti M-O-M atmintyje? Taip? Auditorija: Vienas. David J. Malan: Vienas. Ir kodėl vieną? Auditorija: Nes ji pasakys kur eiti [nesigirdi]. David J. Malan: Būtent. Aš tik ketina grįžti adresą Virvės, kad aš Dotarłeś. Į šis adresas atvejis yra vieta viena. Taigi kas iš tiesų yra saugomi s-- ir kiekvieną eilutę kintamasis taip far-- ką tik buvo adresas tą eilutę. Tuo tarpu, jei aš vadinu GetString antrą kartą ir aš įveskite pažodžiui tą patį thing-- M-O-M su lowercase-- M-O-M o kitas Backslash nulis, o dabar gal mano programa s veikia jau kurį laiką, tai gal tai yra 10, tai yra vietą 11, tai yra 12, tai yra 13. Kompiuteriai, naudojantys kai kurie kiti Atminties dėl kokios nors priežasties. Kas dabar eina mano antras kintamasis mano programa t? 10. Būtent. Ir todėl, kai mes žiūrime ne kodo šią programą kur aš tiesiog bando palyginti dvi vertybes, yra S lygi lygi t, kas akivaizdus žmogaus atsakymas? Tiesiog nėra, nes 1 nėra lygi 10. Ir taip čia glūdi galimybė mums tikrai tiesiog grįžti į vėl pirmas principai ir galvoti apie, gerai, kas vyksta po gaubtu? Mes jau kalbame apie bitai ir baitai ir atmintį, bet tai tikrai naudinga suprasti nes kai skambinate GetString, nors mes galvojame apie tai grįžti M-O-M arba string mama arba Andy arba Zamila arba panašiai, techniškai tai tik grįžimas adresą tos atminties riekė. Bet tai viskas OK. Nes kaip man sužinoti, kur eilutė baigiasi? Jei aš tik atsižvelgiant į pradžią? Na, Backslash nulis, tiesa? Tiesiog linijinio laiko galiu spausdinti su spausdinimo def M-O-M. Ir kuo greičiau matau Atgal nerijos velniop nulis, man nerūpi, kur aš pradėjau, Aš jau žinau, netiesiogiai kur man reikia baigti. Ir taip šiandien sukanka beginning-- ir leiskite man tai padaryti dramatiškai, nes mes išgyveno daug problemų gauti juos čia mokymas wheels-- Taigi, šiandien mokymo ratai pradėti pleiskanoti ir mes atskleisti ne least-- [Plojimai] Tai buvo verta kelionės Tikslinė šį rytą, taip? Taigi, now-- yra, pasirodo out, nėra tokio dalyko kaip eilutę. Styginių neegzistuoja. Tai sinonimas, kad mes turėjome viduje CS50 bibliotekoje. Nuo šiol, mes ketiname pradėti skambinti s ir t ne įsipareigojimų bet char žvaigždžių. Ir char žvaigždutė mes erzinti, išskyrus prieš ilgas. Tačiau tai yra, kad net jei mes ir toliau naudojant GetString dabar, techniškai turėčiau sakydamas char žvaigždė ir char žvaigždė. Ir it turns out, kas tai žvaigždė ketina reikšti kažką vadinamas žymeklis ar adresą. Ir iš tiesų, kibinimas už tai, kas yra priekyje tai 20 Antras klipas iš mūsų draugas Nikas Parlante Stanfordo kurie prieš gana ilgą laiką, praleisti juokinga suma laiko, kaip geriausiai galiu pasakyti iš savo virtuvės arba jo rūsyje, priėmimo Claymation Įvadas į pasaulį personažas pavadintas Binky, su kuriais mes būti įvesta kitą laiko rodykles. Taigi čia yra, kas turi ateiti peržiūra. [Vaizdo įrašų atkūrimas] -hey, Binky. Kelkis. Atėjo laikas rodykle įdomus. -Kas tai? Sužinokite daugiau apie rodykles? Oi, Goody. [PABAIGA PLAYBACK] David J. Malan: Ir dėl šio rašto, matysime jus trečiadienį. Gerai. Kas yra šokis? Nagi. Kas yra šokis? Jūs norite man gauti ji pradėjo? Aš gausiu ji pradėjo. Woooo! LAUREN: Saldūs išgalvotas Mozė.