David J. MALAN: Tämä on CS50 ja tämä on alku viikolla neljä. Ja poika, on Volkswagen vaivaa kaikki, koska ohjelmisto. Olkaamme katsomaan. [VIDEOTOISTOSTA] -Cars, Älykkäin merkkiä Fast and Furious elokuvia. Tällä viikolla saksalainen autovalmistaja Volkswagen löytyi itse keskellä skandaali mahdollisesti rikollista mittasuhteet. -Volkswagen On piristävä miljardeja sakkoja, mahdollinen syyte sen johtajat, kuten Yhtiö pahoittelee varten takila 11000000 autoja auttaa se voittaa päästöjä testejä. -Certain Diesel mallit olivat suunniteltu ohjemistosovellukset että käytetyt tiedot, mukaan lukien ohjausmekanismin asennoissa ja ajoneuvon nopeus määrittää auto oli olevien päästöjen testausta. Tämän seikka, moottori vähentäisi myrkyllisiä päästöjä. Mutta auto oli väärennetty ohitus että kun se ajetaan. Päästöt kasvoivat 10-40 kertaiseksi hyväksyttävä EPA tasolle. [Lopeta toisto] DAVID J. MALAN: Joten katsomaan tämä ja nähdä, miten tämä voitaisiin toteuttaa ja miten tämä voisi vaikuttaa niin paljon autoja kuin tämä. Joten kädessäni täällä ovat lehdistö julkaistujen on antanut EPA-- Environmental Protection Agency joka on USA: n virasto, joka kahvat ympäristönäkökohdat, ja sitten varsinainen oikeudellinen huomautus, joka oli Lähetä Volkswagen vain muutama päivä sitten. Joten EPA kirjoittaa, ja esittää nyt julkisesti, hienostunut ohjelmisto algoritmi tietyistä Volkswagen ajoneuvot havaitsee kun auto on käynnissä virallinen päästöt testaus ja muuttuu koko päästöt ohjaa vain testin aikana. Tehokkuus näiden ajoneuvojen saastuminen päästöt ohjauslaitteet on suuresti vähennetään kaikissa tavanomaisissa ajo tilanteissa. Tämä johtaa autojen, jotka täyttävät standardit laboratoriossa tai testaus asemalla, mutta normaalin toiminnan aikana päästää typen oxides-- tai NOx-- jopa 40-kertainen. Ohjelmisto tuottama Volkswagen on lainaus lainaus päättyy, estolaitteena, määritelty Clean Air Act Yhdysvalloissa. He menevät edelleen, että EPA ja toinen virasto paljastui estolaite ohjelmistot jälkeen riippumaton analyysi tutkijat West Virginia University. NOx pilaantuminen lisää osaltaan typpidioksidin, alailmakehän otsonin, ja pienhiukkasten. Altistumista näille yhdisteistä onkin linkitetty jossa on laaja valikoima vakavia terveysvaikutuksia, mukaan lukien lisääntynyt astma iskut ja muut hengityselinten sairauksia, jotka voivat olla niin vakavia lähettää ihmisiä sairaalaan. Otsonille altistumisen ja hiukkasten on myös liittynyt ennenaikaista kuolema johtuu hengitysteiden liittyvä tai sydän liittyviä vaikutuksia. Lapset, vanhukset, preexisting hengityselinten sairaus ovat erityisen alttiina terveysvaikutukset näiden epäpuhtauksien. Riittää sanoen, se on melko vakava. Ja mennään edelleen lukea vain yksi ote ja sitten me katsomaan taustalla vaikutukset Tämän yhteydessä auton. Erityisesti Volkswagen valmistetaan ja asennetaan ohjelmisto ns elektroninen ohjaus module-- tai ECM-- on nämä ajoneuvot, jotka aisti kun ajoneuvo oli testataan noudattaminen EPA päästönormit. Perustuu eri panokset lukien asento ohjauspyörä, ajoneuvojen nopeus, kesto moottorin toimintaa, ja ilmanpaine, nämä tulot tarkasti seurataan parametrit liittovaltion testausmenettelyn käytetty päästöjen testaus EPA sertifiointi tarkoituksiin. Aikana EPA: n päästöjen testausta, ajoneuvot ECM ohjelmisto juoksi ohjelmisto joka tuotti yhteensopiva päästöjen tuloksia. Kaikkina muina aikoina, ajoneuvon ECM ohjelmisto juoksi erillinen tie kalibrointi mikä vähensi tehokkuutta yleinen päästöjenrajoitusjärjestelmän, erityisesti selektiivinen katalyyttinen vähentäminen Lean NOx trap-- joka näemme hetken kuluttua. Tämän seurauksena NOx-päästöt kasvoivat kertoimella 10-40 kertaa yläpuolella EPA tasot riippuen drive cycle. Joten mitä tämä todella tarkoittaa, ja lähdekoodin ohjelmisto käynnissä on Volkswagenin ei ole vielä julkisesti, on se, että käytännössä, tämä vastaava on jossain siellä sisällä Volkswagenin koodin. Jos testataan, ja jos auto havaitsee tietyt ympäristötekijät kuten ohjauspyörä asento tai liike tai sen puuttuminen auton tai useita muita tekijöitä että tällä hetkellä arveltu olla osa tätä kaavaa, ne yksinkertaisesti päälle täysi päästöjen valvontaa. Toisin sanoen, ne alkavat säteilevät vähemmän epäpuhtauksia. Else, joka toisessa tilanteessa kun se ei ole havainnut olevan laboratoriossa, he eivät vain. Ja niin voit yksinkertaistaa tämä useampaan betoni pseudokoodilla jotain kuten tämä. Jos pyörät pyörivät mutta ohjauspyörä ei ole, suggestiivinen että auto on joissakin sellainen pyörivän sylinterin mutta jonkinlainen varasto testataan, sitten käyttäytyä EPA haluaisivat sinun. Muuten ei. Joten katsomaan lyhyen videon, joka ottaa tarkasteluun mitä seurauksia ovat tämän todella mekaanisesti. [VIDEOTOISTOSTA] -Last Perjantaina EPA ilmoitti, että jotkut Volkswagen Audi tehty vuodesta 2009 ja tänä vuonna käyttivät ns estolaite kiertää päästöjen lakeja suunniteltu pitämään ilman puhtaana. Mutta mitä se tarkoittaa tarkalleen? No, nykyaikaiset autot on kymmeniä tietokoneita niiden sisällä. Ja jotkin näistä tietokoneista auttaa koordinoimaan toimintoja moottorin optimaalisen suorituskykyä samalla on huolehdittava, että ei ole liikaa roskaa tulossa ulos pakoputkesta. He todella työskennelleet Näin useita vuosikymmeniä nyt. Periaatteessa jokainen osa nykyaikaisen auton moottori on anturi tai ohjain sitä, ja nämä tietokoneet lukevat tietojen tuhansia kertaa sekunnissa säätöjen kuten suhde polttoaineen ja ilman että menee sylintereihin. Nämä huijaaminen Volkswagen ja Audi mallit ovat dieselit, ja dieselit on vielä yksi todella tärkeä tietokone ohjatut muuttujat, joka on määrä palamattoman polttoaineen menossa osaksi pakoputki. Nyt kuulostaa pahalta. Ei kuulosta mitä haluaisi palamattoman polttoaineen menee pakokaasun. Mutta kun kyseessä on diesel, sinulla on jotain kutsutaan NOx-trap, joka on laite, joka imee ja ansoja typen oksidien jotka ovat epäpuhtauksia, jotka muuten mennä ilmakehään. Ja vaikutus, että NOx-trap- on parannettu palamattoman polttoaineen. Joten estolaite on erityinen ohjelma sisällä näitä tietokoneita, jotka voivat tehdä sen näyttää auto täyttää päästöjen standardit, vaikka se ei ole. Volkswagen oli ongelma sen käsissä. Sen dieselmoottorit olivat tiedossa saada suuri polttoainetalouden, mutta NOx-trap vain toimii hyvin kun enemmän polttoainetta käytetään. Niin auto olisi havaita, käyttämällä tätä estolaitteena, kun se oli tulossa päästöt testi, se käyttää enemmän polttoainetta, tehdä NOx-trap toimivat hyvin, päästöt olisi hienoa. Mutta sitten saat tiellä, laite sammuu, poltat vähemmän polttoainetta mutta olet laskemisesta peräti 40 kertaa enemmän epäpuhtauksia ilmakehään. Mutta miten hitossa auton tietää, että se oli testataan päästöjen noudattamista? EPA sanoo, että se oli hienostunut joka tarkastetaan asiat kuten ohjauspyörän asento, nopeus, kuinka kauan moottori oli, ja jopa ilmanpaine. Toisin sanoen, oli mitenkään tämä oli vahingossa koska ohjelmisto oli suunniteltu erittäin huolellisesti havaitsemaan virkamies päästötesti. Se on joitakin melko vakavia petos ja se on miksi Volkswagen on tällaisia ​​vakavia ongelmia. Itse asiassa niiden toimitusjohtaja, Martin Winterkorn, juuri astui alas. Joten mitä tapahtuu seuraavaksi? No, jos olet yksi puoli miljoonaa diesel jettas, Beatles, golfs, Passatin, tai Audi A3S suoritettu, hyvä uutinen on on että auto on edelleen turvallista ajaa. Sinun ei tarvitse laittaa sen pois kunnes Volkswagen antaa muistaa. Mutta jossain vaiheessa he luultavasti menossa on päivittää ohjelmisto autoosi. Kun näin tapahtuu saatat saada vähemmän mailia tankki. Asianajajat ovat jo valmistautuu up ryhmäkanteen oikeusjuttuja joten omistajat voisivat saada korvauksen jossain vaiheessa tulevaisuudessa. Mutta se ei aio tapahtua milloin tahansa pian. [Lopeta toisto] DAVID J. MALAN: Eli tämä todella herättää mielenkiintoinen isompi kuva kysymys kuten luottaa. Oikea? Kaikilla meillä on iPhone tai Androids tai jotain meidän taskuihin todennäköisimmin näinä päivinä, tai kannettavat tietokoneet meidän kierrosta, jotka ovat käynnissä ohjelmisto tehty Apple ja Microsoft ja rypäleterttuja muiden yritysten. Mutta miten me tiedämme, että mitä näistä ohjelmista tekevät on oikeastaan ​​mitä nämä yritykset sanovat he tekevät? Esimerkiksi kuka on sanoa, että aina kun soittaa iPhonella tai Android-puhelinta tai vastaavaa, että puhelinnumero ei myöskään ole latautumisen jonkin yrityksen palvelimelle koska joidenkin ohjelman olet kirjoitettu, onko se toiminta itse järjestelmän kuten iOS tai Android, tai koska olet ladannut jotkut kolmannen osapuolen sovellus että jotenkin kuuntelee kaikki mitä kirjoitat tai kaiken, mitä olet todella sanovat. Mistä tiedät, että kun te ovat käynnissä kalahtaa tai Tee kokoat oma ohjelmisto CS50, miten oletteko että CS50 oma henkilökunta, Poiketen CS50 kirjasto, ei ole kirjautumisen joka string olet koskaan saanut tai jokaisen sentin olet koskaan saanut? No, voit varmasti etsiä klo lähdekoodi jotain kuten CS50 kirjasto, sinua voisi katsoa lähdekoodia Linux-käyttöjärjestelmä käynnissä CS50 IDE. Mutta hämmästyttävä esitys sai takaisin vuonna 1984 jotka saavat Turing Award hyvin kuuluisa tietokone tiedemies tiedossa as-- nimeltään Ken Thompson jotka sai Turing Award joka on eräänlainen tietokoneen tieteen Nobelin, jos haluatte, hänen työstään käyttöjärjestelmä nimeltään Unix, joka on hyvin samankaltainen henki, mitä käytämme joka on Linux. Ja kysymys hän kysyi hänen hyväksymistä puhe, lähinnä koskevista puitteista vuodet keskustelu noin luottamusta ja turvallisuutta, oli tämä. Missä määrin yksi luottamus maininta siitä, että program-- pala on software-- on vapaa troijalaiset? Ehkä se on tärkeää luottaa ihmiset, jotka kirjoittivat ohjelmisto. Ja itse asiassa olemme sidoksissa on puhua, että hän antoi Hyväksyessään tämän palkinnon 80-luvulla on CS50: n verkkosivuilla alle Luennot sivun tänään. Koska mitä näet on, että hän todella antaa melko yksinkertainen esimerkki siitä, miten jopa kääntäjä kuten kalahtaa tai mitä tahansa kääntäjät toiset ovat käyttäneet aiemmin, mitä jos upotettu kääntäjä me itse käyttävät on vähän, jos edellyttäen, että pohjimmiltaan sanoo, jos huomaat, että tämä koodi on käytössä GetString toiminto tai GetInt toiminto, mennä eteenpäin ja lisätä takaoven tai Troijan hevonen siten, että kyseinen ohjelma nyt joitakin nollia ja ne, jotka tekevät jotain haittaohjelmia. Kirjautumalla kaikki näppäimistön, lataat että tiedot Joidenkin palvelimelle, tai oikeastaan ​​mitään. Ja mitä Ken Thompson jatkuu tehdä hänen puhua on osoittaa, että vaikka voit käyttää lähde koodi kääntäjä, joka Haitallisen voisi tehdä tätä, sillä ei ole väliä, koska on tämä kana ja muna todellisuus menneisyyden monet vuotta jolloin kerääjiä käytetään koota itse. Toisin sanoen, paluumatkalla kun joku oli kirjoittaneen ensimmäinen kääntäjä. Ja tämän jälkeen, milloin he ovat päivitetty kääntäjä muuttamalla sen lähdekoodia, lisäämällä ominaisuuksia ja kääntää uudelleen sen ihmisiä kuin voimme käyttää, hyvin, he käyttävät vanhaa versio kääntäjä koota uuteen versio kääntäjä. Ja jos olet katsomaan klo puhua että hän antoi, näet, että koska Tämän kierron voit itse olla vikoja tai Troijan hevoset upotettu ohjelmisto käytämme. Ja vaikka jos tarkastellaan lähdekoodi näiden ohjelmien, se ei ehkä ole edes ilmeistä koska huijaukseen on todella Joissakin vanhempi versio kääntäjä, joka siitä lähtien on ollut ruiskuttamalla uhka meidän ohjelmisto. Joka on vain sanoa, me todellakaan voi ja pitäisi Trust Software käynnissä meidän läppäreissä tai puhelimia tai useita paikkoja. Ja itse asiassa myöhemmin tämän lukukauden kun alamme puhua web ohjelmointi ja todella alkaa rakentaa web-sovelluksia itse, me puhumme näistä uhkia ja muut. Nyt, olet ehkä miettinyt ja huomasin että oli pikku Darth Vaderin leikkeet että Verge näytti siellä noin Volkswagen. Jos et ole koskaan nähnyt, minä ajattelin meidän pitäisi keventää mieliala koska tämä on kaikki erittäin masentava ja pelottavaa. Aion katsoa taaksepäin Super Bowl 2011 kun kaupallinen mukaan Volkswagen-- ja tämä melkein tekee niistä sympaattinen again-- esitettiin ensimmäistä kertaa televisiossa. Se on 60 sekunnin leike mielestäni voit nauttia. [VIDEOTOISTOSTA] [MUSIC - Theme from "Star Wars"] [DOG KUORII] [Auto alkaa] [Lopeta toisto] DAVID J. MALAN: Joo. Olin juuri tarkkailun. Tämä auto on rikkomusten luettelo. Selvä. Joten me tarkastelemme joitakin pseudokoodi hetki sitten. Ja tässä on isompi pätkä pseudokoodina koodi että olemme nähneet muutaman kerran toistaiseksi. Ja nyt käyttää tätä on tilaisuus nyt ottaa käyttöön uuden ohjelmakauden tekniikka että teimme katso algoritmisesti viime viikolla, kun me katsoimme yhdistämisen lajitella. Mutta katsotaanpa virallistaa se ja miten voisimme käyttää sitä itse koodi, ja sitten me aiomme käyttää tätä tekniikka tiellä eniten todennäköisesti ratkaisemaan tiettyjä muita ongelmia. Joten tämä oli yksi ensimmäisistä ohjelmat me koskaan kirjoitti, vaikkakin pseudokoodilla koodi. Ja mitä tämä ohjelma pystyimme tekemään kurssi oli löytää Mike Smith puhelinluettelosta. Ja huomaa erityisesti linjat kahdeksan ja 11, jotka oli tämän siirry julkilausuman. Ja itse asiassa, tietyissä kielet, C joukossa, itse tehdä on ilmoitus, että on kirjaimellisesti Siirry jonka avulla voit hypätä tietylle riville. On yleisesti paheksuttavaa, koska se voidaan helposti käyttää väärin ja voit aloittaa hyppääminen teidän Ohjelman koko paikka vastakohtana käyttämään sellaista logiikka ja ohjausvuo että olemme käyttäneet tähän mennessä vain silmukat ja olosuhteet ja vastaavat. Mutta voimme yksinkertaistaa tämä algoritmi pseudokoodilla koodi seuraavasti. Sen sijaan tämän iteratiivisen tai looping lähestymistapa jossa pidämme menossa takaisin ja takaisin ja takaisin linja kolme, miksi emme juuri sellainen punt ja lisää yleensä sanoa linjassa seitsemän ja 10, vain korvata nämä kaksi paria linjat, if Smith on aikaisempi kirjan me will etsi Mike vasen puoli kirjan. If Smith on myöhemmin kirja, etsiä Mike oikeaan puolet kirja. Ja huomaa jo kiertomuuttoa. Oikea? Etsin Mike puhelinluettelosta ja sitten Olen lopulta osuma ehkä line seitsemän tai ehkä linja 10 ja minun opetus itselleni on haku Mike puolessa puhelinluettelosta. No, miten voin etsiä Mike? Olen keskellä etsivät Mike, miksi sinä tavallaan lähettää minulle ympyrän? Mutta se on OK, koska mitä on tapahtuu koko ongelman, kuten kirjoitettu rivillä 7 ja 10? Emme vain sano haku Mike, etsi Mike. Me nimenomaan sanoa mitä? Etsi hänet vasemmalla puolella oikea puoli, joka on tehokkaasti puolet koko ongelman. Niin se on OK, että olemme tavallaan harjoittaa tämän kierron tämä kehäpäätelmä, koska ainakin olemme jolloin ongelma pienempiä. Ja lopulta me aiomme päästä että ns pohja tapauksessa meillä on vain yksi sivu left-- meidän vapaaehtoinen viime viikolla did-- meillä oli yksi sivu vasemmalle ja sitten emme on pidettävä etsivät Mike Smith koska hän on joko sivun tai hän ei ole. Joten kuinka voimme toteuttaa tätä ajatusta, tämä eräänlainen kehämäisyys todellisessa koodi? No, voimme hyödyntää tekniikkaa joka on yleisesti kutsutaan rekursio. Ja olemme nähneet tämän pseudokoodi yhdistäminen lajitella viime viikolla. Muista, että tämä oli pseudokoodi yhdistäminen lajitella. Se on todennäköisesti jopa helpompaa kuin kupla tai valinta tai lisäyslajittelun pelkästään ehtojen yksinkertaisuuden jolla voit ilmaista se. Mutta se johtuu olemme tavallaan circularly sanomalla, etsi jotain etsimällä se uudelleen. Mutta me hakuja joko vasen puoli tai oikea puoli ja sitten lopulta olemme sulautuvat tässä tapauksessa. Mutta täällä, liian kanssa nämä kaksi lajitella riviä, ei meillä on jälleen tämä Ajatus rekursio. Ja konkreettisesti, mitä tämä tarkoittaa, yhteydessä algoritmi, on, että algoritmi on rekursiivinen jos se käyttää tai kutsuu itseään. Tai kannalta C, toiminto on recursive-- toiminto nimeltään foo on rekursiivinen jos foo, jossain sen lähdekoodi, kehottaa toiminto foo itse. Ja se on paha, jos kaikki foo koskaan ei on kutsua itseään uudelleen ja uudelleen. Se on OK, jos foo lopulta pysähtyy, samoin yhdistää lajitella, sanomalla, odota minuutti, jos tämä ongelma on super pieni, esimerkiksi, tai löysin minä, jota minä olen etsivät, vain palata. Älä rekursiivisesti, älä syklisesti itseäni uudelleen. Ja niin katsotaanpa katsomaan miten tämä voisi todella toimivat. Joten aion mennä eteenpäin ja avoin kaksi koodiesimerkkejä täällä. Joista yksi on nimeltään Sigma 0. Ja tämä ei ole ollenkaan rekursiivinen, mutta sallikaa katsokaa mitä tämä ohjelma tekee. Olen riisuttu pois kaikki huomautuksia siitä, mutta kaikki lähteen koodi CS50: n sivusto on kommentteja, jos olet halua lukea läpi uudelleen myöhemmin. Ja tehkäämme pari mielenterveyden tarkistaa täältä. Joten yläreunassa tämän koodin, meillä ovat CS50.h. Mitä tämä tekee? Miksi se on täällä? Kohtuullisessa Maallikon termein. Mitä se tekee? Joo. Yleisö: Jotta GetInt toiminto toimii. DAVID J. MALAN: Jotta GetInt toiminto toimii. Koska sisällä tämän tiedosto, CS50.h, joka näemme ennen pitkää ehdot sen lähdekoodi, on joukko toimintoja declared-- GetInt, GetString, ja joukko others-- ja ellei meillä on todellakin että Sisällytä linja, kääntäjä kalahtaa ei ole menossa tietää, että se on olemassa. Ja sama pätee linja kaksi jossa int määritellään printf, joka on funktio pidämme käyttäen melko vähän. Nyt linja neljä tuntuu hieman outoja koska se on vain yksi linjaliikennettä. Se sai puolipiste, ei kihara henkselit, ei koodia sen sisälle. Mutta mitä me kutsumme tämä asia viikkoa aikaisemmin? Joo. Niin prototyyppi. Ja miksi meillä prototyyppi joka näyttää olla hieman tarpeeton tyypillisesti koska me yleensä katso toiminto uudelleen myöhemmin tiedoston, eikö? Joten miksi me have-- olet vain naarmuuntumisen pään mutta otan sen. Joo. Yleisö: [äänetön] toiminto jälkeen tärkein. DAVID J. MALAN: Aivan. Niin että kääntäjä tuntee teidät lopulta määrittää tai toteuttaa että toiminto jälkeen tärkein, oletettavasti. Niin Clang ja kaikkein kääntäjät ovat eräänlainen tyhmiä ja he vain tietää mitä kerrot heille. Ja jos haluat käyttää toiminto nimeltään sigma, sinun on parasta opettaa kääntäjä että se on olemassa etukäteen. Nyt tärkein itse, jopa vaikka se on joukko viivoja, on melko tuttu toivottavasti nyt. Se sai tehdä, kun silmukka jonka tarkoitus elämässä tässä ilmeisesti on saada positiivinen kokonaisluku käyttäjältä. Ja vain pitää kiusanneet häntä tai hänen kunnes ne tekevät yhteistyötä. Sitten linja 16 Minulla mielenkiintoinen puhelu. IntAnswer. Joka vasemmalla puoli antaa minulle Int joka voi store-- kutsutaan Answer-- joka tulee tallentaa, ilmeisesti palauttaa arvon sigma. Joten sigma on vain mielivaltainen mutta kuvaava nimi että olen antanut toiminto jonka tarkoitus elämässä on otettava yksi argument-- me kutsumme sitä N tässä case-- ja vain ottaa summa, että määrä plus jokainen positiivinen luku, joka on pienempi kuin se. Jos siis kulkea numero 2 sigma, haluan lisätä 2 plus 1 plus 0-- ei 0-- niin että antaa minulle 3. Jos välitän 3 Sigma, haluan on 3 plus 2 plus 1, joka antaa minulle 6. Ja niin edelleen. Niin se vain lisää jopa kaikki numerot vähemmän kuin tai yhtä suuri kuin se. Nyt, täällä olen juuri menossa tulostaa vastaus. Niin nopeasti järki tarkistaa, katsotaanpa tehdä sigma 0-- piste slash sigma 0-- ja haluan kirjoittaa 2. Ja minä todellakin saada 3. Saanen tyypin 3. Olen todellakin saat 6. Ja jos joku voi tehdä matematiikka nopeasti, jos teen 50 mitä olen menossa saada? Yleisö: [äänetön]. DAVID J. MALAN: No, ei. Mutta 1275 joka on melko lähellä. Joten tämä on tulos tehdä 50 plus 49 plus 48 plus 47 plus 46 kaikki alas 1. Niin, että kaikki Sigma tekee. Mutta katsotaanpa kuinka olemme toteutetaan se nyt. Joten täällä on toiminto itse. Ja tämä ei näytä olevan mitään tekemistä rekursion vielä. Itse asiassa käytämme vanhan koulun tekniikka. Olen alustetaan muuttuja nimeltä summa nollaan, niin minulla on foreloop täällä, ja olen julistamisesta Int nimeltään I, jossa se vastaa 1-- vaikka voisin asettaa sen yhtä nolla, mutta koska olen tekemässä Lisäksi Ketä kiinnostaa, jos se on nolla tai yksi. Se tulee ole vaikutusta. Joten olen iteroimalla niin kauan kuin minä on vähemmän kuin tai yhtä suuri kuin m, mikä on väite, että hyväksyttiin. Ja sitten vain pitää lisäävä I ja oivalluksia silmukan kaikkien Mulla tekee summa plus vastaa I. Ja se on tahallista. En halua tehdä, tässä tapauksessa, kuten summa plus plus. Haluan todella lisätä nykyinen arvo, joka pitää saada isompi ja isompi ja isompi käynnissä vastaavuuden. Ja sitten palaan summa. Ja niin vastaus saa arvon summa. Ja sitten tulostaa sen. Joten ei tilaisuus täällä, kuitenkin sellaista yksinkertaistaa tämä koodi käsitteellisesti ja sellainen isku oman mielessä kannalta yksinkertaisuus vaikka se vie aikaa lajitella on ymmärtää, miksi tämä on voimakas nämä pienet esimerkeissä. Tässä on sigma one-- niin toinen versio tämän koodin. Kaikki ylös on sama niin että sama juttu pätee kuin ennen. Mutta nyt katsokaamme täytäntöönpano sigma joka Olen supistettu vain nämä lines-- neljä riviä koodia, todella, plus joitakin kihara henkselit ja valkoinen tila. Mutta mitä teen? Jos m on pienempi kuin tai yhtä suuri kuin nolla, minun täytyy sellainen käsitellä että Super yksinkertainen asia. Ja jos käsi minulle nolla tai mitään negatiivinen joka on vain outo, Olen juuri menossa mielivaltaisesti mutta johdonmukaisesti palaa nolla. En halua tätä asia päästä outoja ääretön silmukka koska negatiivinen arvo. Joten Sanon vain, jos annat minulle nolla tai vähemmän, olen palaamassa nolla. Mutta se on hyvä, koska se on että yhden sivun puhelinluettelosta on jäljellä. Olen puree pois hyvin erityinen ongelma ja emme vaadi jotain rekursiivisesti. Mutta linjassa 31, mitä voin näyttää tekevän? Suluissa ovat vain pitämällä asioita, toivottavasti, hieman selkeämpi. Mutta kaikki Mulla on minä olen palaavat m-- riippumatta annat me-- plus arvo m-- pahoillani, plus arvo sigma m miinus 1. Mitä tämä tarkoittaa? Jos annat minulle numero 3 syötteenä vastaus Haluan saada lopulta on 6, koska 3 plus 2 plus 1 antaa minulle 6. Mutta miten voin ajatella miten tämä koodi on käynnissä? Ensimmäistä kertaa kutsun sigma ja välitän arvon 3, Se on kuin sanoisi pala paperin, tässä on arvo 3 ja olen kulkenut tätä sigma. 3 ei tietenkään ole pienempi kuin 0 niin Jos ehto ei koske. Muu ei. Joten mitä teen? Haluan palata m, joka on 3, sekä sigma m miinus 1. Joten haluan seurata tätä. Aion laittaa tämän paperille alas. Ja mitä arvo, on kirkas, olen menossa ohi osaksi sigma tässä vaiheessa tarina? Mikä numero? 2, eikö? 3 miinus 1 on 2. Joten Tarvitsen vain vähän romu paperi tähän. Joten nyt sigma on tulossa kutsutaan uudelleen. Ja olen tietoisesti tämä alas, koska se on ikään kuin keskeyttämällä että versio tarinasta koska nyt olen keskittynyt signaalin m miinus 1. Joten m oli 3, m miinus 1 on 2. Joten tässä on 2 että olen kulkenut. 2 ei tietenkään vähintään 0 jotta asia ei koske. Else palaan m, mikä on tämän asia, plus Sigma mitä arvo? Joten jos sigma on 1-- koska m on nyt 2 niin 2 miinus 1 on 1. Joten nyt minulla on vain arvo 1. Olen ohimennen vain numero 1 toiminto sigma-- tai itse here-- joten 1 ei tietenkään ole pienempi kuin nolla, ei vieläkään sovelleta. Else paluu 1 plus sigma mitä? 0. Joten haluan vain muistaa, että. Palaan tähän myöhemmin. Nyt aion mennä eteenpäin ja JOT alas numero 0, koska se on minun argumentti tai parametrin. Olen läpäissyt numero 0 ja lopulta tämä prosessi vain toistan itseäni ilmoitus nauseum ei lakkaa sillä mitä voin heti tehdä, kun näen tämän 0? Palaan nolla. Joten nyt sinun täytyy kelata tarina. Jos minä nyt mennä ajassa taaksepäin, mikä oli viimeisin asia Tein jos olisit kirjaimellisesti kelaus video? Aion poimia viimeisimmän 1 ja joka antaa minulle 1 plus 0 on 1. Jos pidän kelaus tarina, joka on menossa antaa minulle 2 plus tämä käynnissä arvo, joka on 1. Niin, että 3. Ja sitten aion pitää uudelleenkelaus. Kun ensimmäisen kerran laittaa alas numero 3-- joten 3 + 3 antaa minulle 6. Ja nyt, jos olet uudelleenkelattua video tähän saakka, tämä oli hyvin Ensimmäinen kysymys kysyin. Kun kulunut 3, mikä on sigma 3? Se on itse asiassa 6, summa kaikki nämä paperille. Joten jos joka vie vähän aikaa kääri mieltäsi ympärille, se käy hyvin. Mutta pitävät sitä oli little-- se oli hyvin tahallinen että olen pinottu nämä numerot päällekkäin. Se on tavallaan kuin ottaa memory-- ennätys aikaa, kuten pesuri on video, että voin todellakin kelata sisään. Ja aiomme palata että metafora vain vähän. Mutta ensin, käy ilmi, että on olemassa paljon geeks ja hauskoja ihmisiä, Oletan, Google. Olisiko joku on hyvin hyvä Googling mieli tulossa vain hetken ja auttaa minua etsiä jotain? Hyvin, hyvin pieni avain. Joku, joka ei ole koskaan keksiä ennen, ehkä. OK. Joo? Tule. Tule alas. Mikä on nimesi? SAM: Sam. DAVID J. MALAN: Sam, tule alas. Tämä on sama. Kiva tavata. Hei. Tule tänne. Joten kaikki mitä tarvitsemme sinua tekemään, jos voisit, Sam, tässä on Google. Voitteko etsiä termin rekursio? Älä pilaa. Ja nyt let's-- joo. OK Valitse että. Parempi klikkaa sitä. Ahh, saat sen. Ei? OK. Joten tehdä pari toiset. Ei niin paljon liittyvä akateemisesti täällä, mutta oletko koskaan etsinyt Googlen anagram? SAM: Ei. DAVID J. MALAN: OK. Etsi anagram sijasta rekursion. Entä vinossa. Oletko etsinyt vinossa? Nyt, tämä on hieman vaikea nähdä, mutta toivottavasti everything's-- OK. Se on vain sinä ja minä nauttia tästä. OK. Joten lopuksi, tämä one's-- se on vähän vinossa. Nyt tehdä tynnyri roll. Ihana. Selvä. Suuri kiitos Sam. Ole hyvä. Kiitos. Joten mitä tapahtuu kaikissa Näiden typerä esimerkkejä? Siis todella, alla huppu Googlen miljoonia rivejä koodia ilmeisesti on muutama typerä IF ehdot, jotka ovat olennaisesti tarkistaa, jos käyttäjä on kirjoitettu tämän lauseen, tehdä jotain, joka luultavasti otti triviaali aikaa toteuttaa vain olla huvittavaa tällä tavalla. Mutta siinä kaikki se kiehuu alas alla huppu. Mutta tietenkin, rekursio on enemmän geekier Esimerkiksi joukossa erikoistemppuja. Ja varmasti siellä muut siellä myös, että meillä ehkä ole edes löydetty vielä. Joten katsomaan, tai harkita nyt seuraava ohjelma, ja varmasti napata kaikki Näiden matkalla ulos. Aion mennä eteenpäin ja avata ohjelma, joka on yrittävät vaihtaa kahden arvon. Mutta ennen kuin menemme sinne, tehdään tämä. Voisimmeko saada yhden vapaaehtoinen, luulen? Haluatko tehdä vapaaehtoistyötä? Ei? Tule ylös. Tule ylös. Selvä. Joten nimi on mitä? LAUREN: Lauren. DAVID J. MALAN: Lauren. Tule ylös, Lauren. Joten Lauren ollaan haastoi täällä seuraavasti. Kiva tavata. Joten Lauren tässä on edessä hänen kaksi tyhjää kuppia. Ja meillä on joitakin oranssi mehua ja maitoa ja aiomme mennä eteenpäin ja toimi seuraavasti. Olemme juuri menossa täyttämään tämän. Muutama unssia maitoa tänne ja lähdetään Täytä hieman appelsiinimehua tänne. Ja edessä kaikki Näiden yleisön jäsenet, vaihtaa kaksi arvoa näiden kupit. Laita appelsiinimehu maitoon kuppi ja maidon appelsiinimehua kuppi. Miten teet tämän, jos olit kotiin ja oli pääsy muita tarvikkeita? LAUREN: Laita se toisen kupin. DAVID J. MALAN: OK. Joten on väliaikainen muuttuja, jos me. Ja mennä eteenpäin nyt ja toteuttaa tämä sama vaihtamalla menettelyä. Niin hyvä. Laitoimme EYVL tilapäiseen muuttuja, maitoa EYVL muuttuja, ja nyt väliaikainen muuttuja maitoon muuttuja. OK. Joten hyvin tehty toistaiseksi. Joten se kääntyy out-- katsonut, että Vaikka vain hetken. Täällä vain pelle sitä hieman, tämä olisi vastaava C-koodia että me vain täytäntöön. Meillä oli kaksi tuloa, a ja b, sekä joka meidän täytyy vain sanoa yksinkertaisuuden ovat int n. Ja huomaa täällä, jos haluan vaihtaa arvot kaksi muuttujaa, a ja b, me todellakin tarvitsemme välikäsi, väliaikainen muuttuja, väliaikainen kuppi, johon kaada yksi arvoista niin että meillä on paikkamerkki sen. Mutta sitten koodi on täsmälleen kuten Lauren täällä täytäntöön. Nyt vain saada pikku hullumpi, osoittautuu että voit tehdä tämän ilman väliaikainen muuttuja. Voit tehdä tämän oikein, vaikka aiomme on huijata joidenkin kemia. Meillä on joitakin ylimääräisiä kupit täällä. Joten lähinnä asia, joka näyttää kuten maito ja vesi perhaps-- tai maitoa ja OJ-- on meillä on joitakin vesi, joten me täyttää tämä ylös muutaman unssia puhdasta vettä. Se on luultavasti liikaa. Joo. Se on ehdottomasti liikaa. Odota yksi sekuntia. Ja nyt meillä on öljyä, joka, muistaakseni alkaen yläasteella kemian luokka, toivottavasti se ei sekoitu veteen. Mutta se tavallaan eräänlainen näyttää maitoa ja lehdessä. Joten nyt, ilman väliaikainen muuttuja, voit vaihtaa näitä kahta arvoa? Joten öljyt menee veteen cup, vesi menee öljykuppiin. LAUREN: Ei muita kupit? DAVID J. MALAN: Ei muita kupit. Ja en ole oikeastaan testannut tätä ennen tämän vuoden joten en tiedä, jos tämä todella toimivat kemiallisesti. Tämä ei pitänyt tapahtua. Toimiiko se? Selvä. Joten erottaa? Hyvä. Nyt täytyy saada vettä toiseen kuppiin. Fiksumpia kemia keskittimien voisi luultavasti tehdä tämän paremmin kuin minä. LAUREN: vesi on pohjassa. David J. MALAN: water--, joka oli Mikä avain viimeksi teimme tämän. Sinun täytyy tehdä se oikeassa järjestyksessä. Joo. Se on ok. Joten nyt meillä on kaksi kuppia öljyä. OK. Se on ok. Mutta kemiallisesti jos tämä toimi kuin I-- LAUREN: Tämä on vesi. DAVID J. MALAN: Se on enimmäkseen vettä. Selvä. Mutta se on silti sama kuppi kuin ennen. Joten kaada it-- kokeile sitä tuolla. OK. Tämä on hyvä käyttää luokan aikaa tänään. OK. Joten nyt we-- mukavaa. Tavallaan. Selvä. Niin erittäin hyvä. Kiitos Lauren. Erittäin hyvin tehty. Joten vain räjäyttää mielenne, ja tämä on ehkä jotain pelata jos pidät CS50 tunnus, voit itse asiassa vaihtaa kahden muuttujan ilman väliaikaista kokonaisluku. Ja tämä on vastaava C-koodia. Ja jos muistaa viime Keskiviikkona esittelimme, jos lyhyesti, joitakin uusia toimijoita C. eikä kukaan muistaa, mitä pikku porkkana symboli on, että pieni kolmiomainen symboli näppäimistö edustaa? Mikä bittioperaattori? Yleisö: EXOR. DAVID J. MALAN: EXOR. Exclusive Or. Joten jos haluat, vain hauskaa kotiin, antaa ja b kaksi mielivaltaista arvot kuten kaikki eight-- ja minä valitsisin kahdeksan bitin arvo. Jos teet tämän kanssa 32 bittiä, voit hyvin nopeasti kyllästy. Mutta vain antaa kahdeksan bitin arvo, joka on mitä tahansa, yksi tai kaksi, ja antaa b samanlainen arvo. Ja sitten käyttämällä määritelmän XOR viime keskiviikkona sovelletaan, että pala palalta, kukin nämä kahdeksan bittiä kussakin a ja b, ja sitten tehdä se juuri kohti tämän koodin. Ja se ei ole virheellinen mitä näet täällä ruudulla. Se todellakin kuihtuu kolme XOR toimintaa ja jotenkin maagisesti ja b vaihtavat kannat menettämättä mitään tietoja. Niin öljy ja vesi temppu on lähimpänä reaalimaailman inkarnaatio Voisin ajatella matkia että. Mutta se on varmasti helpompi käyttää väliaikainen muuttuja, kuten tässä tapauksessa täällä. Ja tämäkin on mahdollisuus sanoa, Myös tällainen mikro optimointi, kuten tietojenkäsittelytieteessä sanoisi, vaikka tavallaan hauskaa kehuskella miten teit tämän ilman kuten vaihtamalla ylimääräinen muuttuja, se ei ole kaikki, että pakottavia. Koska tallentaa 32 bittiä, kuten jos kyseessä todellinen int, ei ole kovin pakottavia järjestelmään, jossa saatat käyttää kymmeniä megatavuja tai jopa enemmän kuten muistia näinä päivinä. Ja itse asiassa, kun saamme myöhempään Harjoitus ja käytät oikeinkirjoituksen ruudullinen ja sinun haastetaan tekemään niin tämä niin vähän muistia ja niin vähän aika kuin mahdollista computer-- silti on viikko toteuttaa it-- sinun have-- voit olla haastoi minimoimiseksi näitä resursseja. Ja se on oikeastaan ​​ainoa tilaisuus tämä lukukausi jossa voit kannustettava ajella pois pienimmätkin suorituskyky maksaa muuten. Joten what-- kuinka voimme nähdä tämän itse koodi? Anna minun mennä eteenpäin nyt ja avata esimerkki että tarkoituksella kutsutaan Ei Swap koska se ei itse asiassa vaihtaa muuttujat kuten itse voisi odottaa. Joten katsomaan. Tässä ohjelma, joka ei ole CS50 kirjasto tekeillä, vain vakio I / O. Nyt meillä on prototyyppi swap ylös joka vain tarkoittaa se sai määriteltävä myöhemmin. Ja tässä on tärkein. En mielivaltaisesti x ja y, vastaavasti, arvot yksi ja kaksi vain koska he pieni ja helppo ajatella. Ja sitten vain on nippu printfs jossa minulla on järki tarkistaa. x on 1 ja y on 2 on oletettavasti mitä nämä printfs sanovat. Joten mitään maagista toistaiseksi. Sitten aion vaatia kanssa tulostaa def, vaihtamalla piste piste piste. Aion soittaa swap toiminto, kulkee x ja y. Ja Oletetaan nyt, että swap on toteutettu täsmälleen koska se oli hetki sitten tilapäinen muuttuja. Ja niin Väitän rohkeasti, vaihtuneet. X on nyt tämä, ja y on nyt. Mutta tiedoston, tietenkin, kutsutaan Ei Vaihda. Joten itse nähdä mitä tapahtuu. Jos minä koota ei swap ja sitten do ./noswap, x on 1, y on 2. Vaihtaminen vaihtuneet. x on 1, y on 2. Joten se todella näyttää olevan virheellinen jopa vaikka swap-- katsotaanpa selaa now-- toteutetaan täsmälleen kohti koodi Ehdotin hetki sitten. Joten emme aio saada fancy kanssa XOR juttuja nyt. Tämäkin pitäisi toimia vain kuten maidon ja EYVL, mutta se ei tunnu toimivan. Joten tehdä tätä uudelleen. Ehkä en vain ollut käynnissä oikein. Joten ajaa Ei Swap uudelleen. Ehkä I-- ei. Niin se vain ei toimi. Joten tehdä vähän järki tarkistaa. Anna minun mennä eteenpäin täällä Swap ja vain lisätä, odota minuutti, on% i / n ja lähdetään plug-arvon. Koska en todellakaan halua nähdä, mitä tapahtuu. Ja itse asiassa tämä on virheenkorjaus tekniikka että saatat olla käyttämästä virka tai kotona jo, muistuttaa alkupuoliskolla Dan Armendariz n video PSET3 jossa esittelimme tulostaa def kuin suositeltava tekniikka, ainakin yksinkertaisia ​​tapauksia. Anna minun mennä eteenpäin ja suorita make ei swap uudelleen, ./noswap. Mielenkiintoinen. Joten huomaa, mitä näyttää pitävän paikkansa. X on 1, y on 2, mutta on 2, kun b on 1. Joten nämä kaksi jotenkin vaihtoivat mutta x ja y eivät saa vaihdettu. Joten tehdä selväksi, mitä tapahtuu on, täällä minulla on x ja y ja ne ovat muuttujia paikallisia laajuus tärkein, olen ohimennen x- ja y- vaihtaa. Nyt, swap, erillisenä toiminto, on vapaasti soittaa sen perustelut tai sen parametrien mitään se haluaa. Foo baariin vai X tai Y tai tai b. Vain tehdä selväksi, että he ole sama kuin x ja y sinänsä, Olen sanonut ja b. Mutta voisimme kutsua heille mitään haluamme. Ja niin se näyttää swap on siirrellään x-- AKA a-- ja se on siirrellään y-- AKA b. Jotenkin nämä kolme riviä ovat vaihtamalla nämä arvot tarkalleen kuten Lauren teki maidon ja OJ. Mutta kun me tulostaa arvot, a ja b ovat todellakin vaihtaa mutta X ja y ei ole muutosta niihin. Muista, että x ja y ovat täällä. Jotta voimme nähdä tämän kautta toinen tekniikka samoin. Ja tämäkin on tekniikka upotettu ongelma asettaa kolme. Mennään eteenpäin ja tehdä tämän CS50 ID jos et ole jo. Oikealla puolella me on tämä Debugger välilehti. Ja jos avaat tämän ylös, siellä on mystistä tietoa joka on heittänyt sinua aluksi. Mutta katsotaanpa tease tämä toisistaan ​​todella nopeasti. Joten, näet paikallisia muuttujia. Osoittautuu, että rakentaa osaksi CS50 IDE, ja paljon ohjelmointiympäristöjä lisää yleensä, on debuggeri. Työkalu, jonka avulla voit visuaalisesti nähdä mitä tapahtuu sisällä oman ohjelman tarvitsematta turvautua lisäämällä printfs ja kokoaminen ja käynnissä ja lisäämällä printf ja koota ja käynnissä, joka jo vuonna virka tai koti, on luultavasti tulossa melko tylsiä. Joten tässä, vain hetken, olemme menossa nähdä reaaliajassa arvoja paikallisia muuttujia. Olemme myös menossa voitava asettaa mitä kutsutaan breakpoints joka mahdollisuuksia omassa ohjelmassa tauko suoritus tietyllä koodiriviä että olen utelias. Oikea? Nämä ohjelmat toimivat sekunnin murto-osassa. Se on tavallaan mukavaa meille hitaammin ihmisille pystyä keskeyttää, hetki, katso mitä tapahtuu noin tietty koodiriviä ilman ohjelma auraus sen läpi ja viimeistely kokonaan. Joten raja-arvot menee jotta voimme tauko ja tauko tietyssä vaiheessa. Kutsupino on hieno tapa sanomalla mitkä toiminnot ovat tällä hetkellä kutsutaan tällä hetkellä. Tärkein on aina kutsutaan ensin. Mutta jos Main kutsuu toiminto nimeltään Swap, olemme todella menossa nähdä tämän torni toimintoja, jotka ovat olleet nimeltään käänteisessä kronologisessa järjestyksessä. Joten nähdä, että. Aion loitontaa. Aion mennä takaisin minun koodi. Ja vain koska haluan olla pikkutarkka täällä, Aion mennä eteenpäin ja valitse vain vasemmalla linjan viisi. Ja joka luo punainen piste. Ja huomaa oikealla puolella että debuggeri tietää, hei, Sanoin vain keskeytyskohdan noswap.c linja viisi, erityisesti Tämän koodiriviä. Joten debuggeri tietää, että minä ovat pyytäneet, että seuraavan kerran Juoksen minun ohjelma se tauko suorittamisen siellä eikä vain käynnissä koko juttu huippunopea. Joten nyt aion klikkaa Debug -painiketta hyvin alkuun IDE ja että menee toimi seuraavasti. Se tulee avata ensin hieman pelottavan näköinen toinen napa window-- etävianmääritystä alkaen isäntänä ja such-- ja me palaamme mitä kaikki tämä tarkoittaa ennen pitkää. Mutta mikä on tärkeää nyt on, että punainen piste osui, debuggeri on tahallisesti keskeytetty execution-- ei radalla sinänsä vaan ensimmäisenä rivi itse koodi tähän toimintaan. Ja siksi linja seitsemän on nyt on korostettu keltaisella. Ja Nyt katsomaan oikealla puolella. Näyttää siltä, ​​oletuksena, kauniisti tarpeeksi, x on mitä arvo? 0. Ja y on mitä arvo? Nolla. Ja se on odotettavissa mielessä että x ja y-- että keltainen line-- on ei toteutettu vielä. Joten X ei pitäisi olla arvoa 1. Se voi olla jokin muu arvo, ns roskat arvo. Ja me onnekas, että se on nolla tässä vaiheessa lähinnä. Joten nyt on vain muutama painikkeet meidän tarvitse välittää noin kun virheenkorjaus tällä tavalla. Huomata täällä, meillä toistopainiketta. Ja jos me pelata tai lyödä jatkaa, se on vain menossa ajaa läpi loput ohjelman tai kunnes se osuu toiseen murtuessa. Mutta en ole asettanut mitään muuta raja-arvot niin se on vain menossa läpi loppuun. Tällainen tappioita tarkoituksena tönäisi ympäri. Joten sen sijaan, välitän nämä kuvakkeet oikealle. Ja jos minä hääriä ne, kuin pitäisi liian, näet vähän tips-- työkalu vinkkejä. Tämä on askel yli. Nyt se ei tarkoita Ohita seuraava rivi koodia. Se vain tarkoittaa toteuttaa sitä ja siirtyä seuraavalle, siirry seuraavaan, siirtyä seuraavaan. Toisin sanoen, kautta että painike, voin kävellä kautta minun koodi yksi askel kerrallaan. Rivi riviltä, ​​kirjaimellisesti. Nyt, oikealle että siellä toinen että näemme vain hetken. Tämä on ns Astu ikoni, joka on aio sallia minulle sukellus toiseen toiminto. Mutta katsotaanpa tämä vain hetken. Joten aion klikkaa askel yli. Ja nyt huomaa, koska olen klikkaa tätä painiketta oikeassa yläkulmassa, pitää silmät suunnilleen alle Paikallinen Muuttujat ja katso mitä tapahtuu x. X on nyt 1, koska keltainen viiva on nyt suoritettu ja olemme siirtyneet rivillä 8. Ja vain hetken y olisi toivottavasti tulee 2. Nyt, ei mitään kiinnostavaa tapahtuu hieman. Kaikki tämä on on printf. Ja huomaa, minun toissijainen terminaali ikkuna, näen tuotos tulostaa def. Ja nyt minun täytyy tehdä Päätös sellaisena kuin ohjelmoija. Voin astua yli tämän linjan koodi, sen suorittamista mutta ei saada tietää, mitä sisällä. Tai voin itse astua se ja mennä sisälle swap itse. Tehdäänpä jälkimmäinen. Anna minun mennä eteenpäin ja valitse ei askel yli vaan Step Into. Ilmoitus, yhtäkkiä ikkuna muutokset Korosta ensimmäinen koodirivin Vaihda. Se on linja 21. Ja nyt, mikä on tavallaan funky on että, jos tarkastellaan tänne, odotetusti, pilkku b on 1 ja 2, vastaavasti. Miksi temp 32767? Muistuttaa, että lämpötila, aivan kuten tyhjä kuppi hetki sitten, julistetaan täällä line 21. Miksi 32,000- Tarkoitan, miksi se vain outoja arvo? Joo? Yleisö: Se ei ole alustettu. DAVID J. MALAN: Se ei ole alustettu. Joten meidän tietokone aina on fyysistä muistia. Se on aina keskusmuistia. Ja siellä on aina Zeron ja yksi on siellä, eikö? Koska käytämme meidän tietokone koko päivän, käytät CS50 IDE tai palvelimet koko päivän. Jotta RAM joko on joitakin nollia tai jotkut oman tai jonkin nollia ja ykkösiä. Ei ole väliä onko tai ei käytät niitä. Et voi vain olla tyhjä tiloissa, joissa haluat bittiä. He joko nollia ja ykkösiä. Joten käy ilmi, että lämpötila, koska olemme ole alustettu sitä vielä, meillä on ne 32 bittiä mutta he eivät ole alustettu tahansa tunnettuja arvoja. Joten mitä he olivat eniten viimeksi käytetyt for-- ne 32 bits-- me vain nähdä esineitä joidenkin aiemmasta käytöstä kyseisiä 32 bittiä. Heti kun klikkaa askel yli kuitenkin, huh huh, lämpötila on menossa arvoon 1. Ja jos teen sen uudelleen, on Menossa annetaan arvo 2 ja sitten b aikoo annetaan arvo 1. Ja niin mitä mukavaa nyt tässä vaiheessa tarina on, että debuggeri on osoittaa minulle, Super hitaasti minun omaan tahtiin, mitä tila Swap on. Mutta huomaa huipulla täällä, ilmoitus että kutsupino todella on kaksi kerrosta siihen. Nyt yksi, joka on korostettu Swap, jos napsautan Main sijaan, huomaa kuinka paikalliset muuttujat muuttuvat koska kehittäjä voi vain hypätä ympäri ja mennä mihin tahansa eri soveltamisala. Joten vaikka me teemme kaiken tämän toimivat ja oikein vaihtamalla ja b, jos menen edestakaisin Swap jossa on 2 ja b on 1 ja Main, on Main vaikuttanut lainkaan? Ei. Niin mitä takeaway täällä? No, käy ilmi, että aina soitat toimivat kuten Swap, ja ohitat sen argumentteja, mitä olet ohimennen Swap toiminto tässä tapauksessa on kopio näistä perusteluista. Joten jos x ja y ovat kukin vastaavasti 32 bittiä, mikä vaihto on tulossa on kaksi uutta paikallista muuttujia, tai väitteitä, kutsutaan ja b-- mutta ne ovat mielivaltaisia names-- mutta kuvio nollia ja ne sisällä a ja b ovat rivissä olevan identtinen x ja y mutta ne eivät ole sama asia kuin x ja y. Se on ikään kuin Main on sen pala paperi numero 1 ja 2 x ja y, ja sitten kun se kädet että paperinpala Swap, Swap hyvin nopeasti saa oma kynä, kirjoittaa alas 1 ja 2 omasta paperiarkille, kädet takaisin alkuperäisen xy Main ja sitten tekee omat juttu ja b. Ja tämä on nyt erittäin tärkeää, koska tämä on triviaali vaikutuksia sillä todella kirjoittamista oikea koodi koska vaikuttaa siltä, ​​emme voi vaihtaa kaksi muuttujaa. Olen kirjoittanut oikean Swap toiminto. Olemme toteutettu sen Lauren kuin oikea swap toiminto todellisuudessa, mutta ilmeisesti mikään että asiat jos et voi itse vaihtaa kaksi arvoa pysyvästi. Joten tarvitsemme toisella tavalla todella saada tämän, ja meidän on pystyttävä itse asiassa tämän ongelman ratkaisemiseksi. Ja se kääntyy out-- ja tulemme takaisin tähän nimenomaiseen kuva ennen long-- tämä on yksi tapa, että saatat kiinnittää tietokoneen muistiin. Se on vain suorakulmion. Voisit piirtää se mitään monin tavoin, mutta se on kätevä tehdä sitä suorakulmio seuraavasta syystä. Aiomme aloittaa tänään ja sen jälkeen puhutaan ns pino. Ja pino on vain murikka of RAM-- kimpale memory-- että toiminnot on pääsy milloin niitä kutsutaan. Ja niin se kääntyy pois, että hyvin alareunassa tämän pinon on, jos kaikki Mainin paikallisia muuttujia ja Org C ja org V ja kaikki jutut eivät mene oletuksena. Ja jos Main kehottaa muuna kuten Vaihto, hyvin, Swap on menossa toiseen kerros muistia jopa sen yläpuolella. Ja niin vain antaa sinulle nopeasti pintapuolinen kuva tästä, jos menen yli here-- ja haluan heijastavat tätä piirtoheitin kuten well-- mitä todella olen, jos välitämme vain pohjassa tätä kuvaa nyt, on että kun olen suorittanut ohjelman ja Main saa kutsutaan, Tärkein annetaan kimpale RAM minun tietokone, joka on alareunassa tämän ns pino. Ja aion tehdä sitä tarkoituksella kuten neliö. Joten se on kuin 32 bittiä tai neljä tavua. Ja jos tämä päätehtävä on muuttuja nimeltä x arvo on 1 ja se on muuttuja nimeltä Y arvo 2, joka on kuin ottaa tämä suikale muistin Main on antanut toiminta järjestelmä ja jakamalla sen niin, että ensimmäinen paikallinen muuttuja menee täällä, toinen menee täällä, ja se on siinä. Kun Main kehottaa Swap, Vaihda saa oman siivu muisti että me tehdä näin käyttöjärjestelmästä, ja se tulee olla sen oma paikalliset muuttujat perustuvat meidän täytäntöönpanosta aiemmin paikallisten muuttujien ja b, että aluksi saada arvoja 1 ja 2. Mutta sitten, heti kun Swap koodi suorittaa, ja Lauren todella swap OJ ja maito, mitä tapahtuu? No, tämä 2 on tulossa 1, tämä 1 on tulossa 2, ja, muuten, on temp muuttuja, joka on on käytetty että koko sen ajan, lopulta menee pois. Mutta se ei ole väliä kuinka paljon työtä teet tämän linjan of-- tässä muistia, x ja y ovat täysin koskematon. Joten tarvitsemme tapa antaa Swap ja toimintoja, kuten se salainen yhteys, jos haluatte, että toiminnot like-- muistiin, kuten x ja y. Joten katsomaan esimerkki, joka auttaa meitä nähdä, mitä on ollut käynnissä koko tämän ajan. Aion mennä eteenpäin ja avata Vertaa Zero. Ja aion sulkea meidän debuggeri, aion sulkea tämän pelottavan näköinen viesti vain sanoo, odota minuutti, olet keskellä virheenkorjaus. Aion piilottaa tämän välilehden täällä vain palata yksinkertaisuus. Joten älä huolestu, jos GDB kuolee. Se vain tarkoittaa, että ohjelma on on lopettaa, tarkoituksella tässä tapauksessa, minun. Ja nyt Vertaa Zero tekee tämän. Olen käyttäen CS50 kirjasto vakio I / O. Minulla päätehtävä, että ensin sanoo, sanoa jotain, ja saa merkkijono. Sanoo sitten uudelleen ja saa toisen merkkijono. Ja huomaa, että nämä kaksi merkkijonoa kutsutaan s ja t, vastaavasti. Ja nyt tämä ohjelma, Vertaa Nolla, sen elämän tarkoitus, sen pitäisi kertoa minulle, minä kirjoita sama asia? Ja niin aion takaisin viikko yksi. Olen käyttäen yhtä suuri yhtä suuri operaattori joka on laatu operaattori. Ei Sijoitusoperaattori, yhtäsuuruusoperaattorin. Olen vain vertaamalla s ja t. Joten itse mennä eteenpäin ja tehdä tämän. Ja aion mennä eteenpäin ja tehdä Vertaa Zero. Aion tehdä ./comparezero. Ja aion mennä eteenpäin ja sanoa jotain kuten, tehdään äiti pienillä kirjaimilla ja miten äiti isoja kirjaimia. Ja tietenkin kirjoitan eri asioita. Selvä. Se on odotettavissa. Katsotaanpa ajaa se uudelleen. Molemmilla kerroilla tehdä pieniä, pieniä. Joka näyttää Super sama minulle. Anna. OK. Ehkä se on vain outoa, koska se ei miellytä minun kielioppia. Tehdäänpä pääoman MOM, pääoman MOM, identtiset. Eri asiat. Niin miksi? No, mitä todella tapahtuu on alla huppu täällä? Joten mennään takaisin yli täällä vain hetken ja miettiä, mitä GetString todella tekee. Kun soitat GetString, se funktio me itse kirjoitti ja se jotenkin saa merkkijono käyttäjältä. Ja oletetaan, että ensimmäinen aika Pyydän GetString, joka antaa minulle kimpale muisti, joka näyttää tältä. Ja jos olen kirjoittanut pienillä m-o-m-- ja mitä tapahtuu sen jälkeen? Vain nopeasti järki tarkistaa. Backslash nolla. Tiedämme, että. Ja muistuttaa, että me pelasimme ympäriinsä Zamila nimi ja joukko muita nimiä kun Rob oli täällä etsimässä mitä tapahtuu sisällä muistia. Niin, että tarina on täsmälleen sama. Tämä on mitä GetString palaa minulle. Nyt minun koodi hetki sitten tallennettu palauttaa arvon GetString muuttujaan nimeltä s. Ja sitten toisen kerran kutsuin sitä, se tallennetaan se muuttujaan nimeltä t. Joten jos menen tänne, tarvitsen tehdä tämä paikallinen variable-- ja olen yleensä menossa piirtää merkkijonon just-- me will kutsuvat sitä s-- kuin pienen aukion täällä. Ja nyt, somehow-- miten äiti mennä sisälle tämän muuttujan s? No, meidän täytyy mennä takaisin ensin periaatteita täällä. Mikä on GetString todella palaamassa? Joten käy ilmi, että M-O-M kenoviiva nolla, ja rajoittamattoman määrän Muiden jousille muisti kuin Zamila ja Rob tai Andy tai muilta, ovat tietenkin meidän tietokoneen RAM tai muistin. Ja RAM on like-- olet keikka RAM, kaksi keikkaa RAM, tai miljardia kaksi miljardia tavua, tai ehkä jopa enemmän näinä päivinä. Joten Oletetaan, päivän tarkoituksiin, että sillä ei ole väliä kuinka me numero heitä, mutta voimme numeroitava näiden miljardia tai kaksi miljardia tai neljä miljardia tavua. Ja haluan vain mielivaltaisesti sanoa, että tämä on ensimmäinen purra, toisen purema, kolmas, neljäs. En tarkoituksella käytä nolla tänään, mutta me palaamme siihen. Eli toisin sanoen, jos tämä on Ensimmäistä kertaa olen käyttäen ohjelmaa, Olen vain saada onnekas ja ensimmäinen purema on sijainti yksi sitten kaksi sitten kolme kuin neljä. Ja jos Pidin piirustus, laatikko numero kaksi miljardia olisi tapa täällä. Mitä mieltä olet, sitten, GetString todella palauttaa? Se ei ole tulossa takaisin M-O-M kenoviiva nolla sinänsä koska selvästi ei mahdu ruutuun että olen laatinut. Mitä muuta voisi GetString todella palaamme kaikki näistä viikoista? Vastaus on aluksella täällä jossain. Ei mahdu M-O-M kenoviiva nolla, joten mitä saattaisi olla järkevää sen sijaan? Jos piti olla erittäin fiksu, laskemisesta on ns engineering hattu, mitä voisit palata? Mikä on vähiten tietoa voisit tuottoa, joka olisi vielä voit löytää M-O-M muistia? Joo? Yleisö: Yksi. DAVID J. MALAN: One. Ja miksi? Yleisö: Koska se kertoisi minne mennä [kuulumattomiin]. DAVID J. MALAN: Aivan. Olen juuri menossa palauttaa osoitteeseen merkkijonon, että olen saanut. Osoite tähän asia on sijainti yksi. Joten mitä todella on tallennettu s-- ja jokainen merkkijono muuttujan näin far-- on juuri osoitteen merkkijono. Samaan aikaan, jos kutsun GetString toisen kerran ja minä kirjoita kirjaimellisesti samassa thing-- M-O-M lowercase-- M-O-M ja toinen kenoviiva nolla, ja nyt ehkä minun ohjelman olleet käynnissä jo jonkin aikaa, joten ehkä tämä on 10, tämä on paikka 11, tämä on 12, tämä on 13. Tietokoneissa muulla muisti jostain syystä. Mitä nyt menee minun toinen muuttuja minun ohjelma t? 10. Aivan. Ja niin kun katsomme lähdekoodi tämän ohjelman missä olen yksinkertaisesti yrittää vertailla kahta arvot, on S yhtä suuri yhtä t, mikä on inhimillisestä vastaus? Vain ei koska 1 ei ole sama 10. Ja niin tässä piilee mahdollisuus meille todella vain mennä takaisin, jälleen, ensimmäinen periaatteet ja miettiä, hyvin, mitä tapahtuu alla huppu? Olemme puhuneet bitit ja tavut ja muisti, mutta se on todella hyödyllistä ymmärtää koska kun soitat GetString, vaikka ajattelemme se on palaavat M-O-M tai merkkijono äiti tai Andy tai Zamila tai kuten, teknisesti se on vain palauttamalla osoite Kyseisen murikka muistia. Mutta se on OK. Koska mistä tiedän jossa merkkijono päättyy? Jos olen vain antanut alkua? No, kenoviiva nolla, eikö? Vain lineaarisessa ajassa voin tulostaa tulostetun def M-O-M. Ja kun näen kenoviiva nolla, en välitä, mistä aloitin, Tiedän jo epäsuorasti jossa minun täytyy lopettaa. Ja niin tänään merkitsee beginning-- ja anna minun tehdä tämä dramaattisesti, koska me meni läpi paljon vaivaa saada nämä täällä koulutus wheels-- joten tänään apupyörät alkaa irrota ja me paljastaa klo least-- [APPLAUSE] Se oli matkan arvoinen Target tänä aamuna, kyllä? Joten now-- on, se kääntyy , mitään sellaista asiaa kuin merkkijono. String ei ole olemassa. Se on synonyymi että meillä on ollut sisällä CS50 kirjaston. Vastedes aiomme aloittaa kutsuvan s ja t ei jouset vaan merkkiä tähteä. Ja nieriä tähti me will tease erilleen ennen pitkää. Mutta tämä on sanottava, että vaikka jatkamme käyttäen GetString nyt, teknisesti minun pitäisi sanovan char tähti ja nieriää tähti. Ja käy ilmi, mitä että tähti on menossa kuvaamaan on jotain kutsutaan osoitin tai osoite. Ja itse asiassa, teaser mitä on edessä on tämä 20 sekunnin klippi meidän ystävä Nick Parlante Stanfordin joka jo jonkin aikaa sitten, viettää naurettava aikaa, kuten parhaiten voin kertoa hänen keittiö tai hänen kellarissa, mikä claymation käyttöön maailmalle hahmo nimeltä Binky jonka kanssa me otetaan käyttöön seuraavan kerran viitteitä. Joten tässä on esikatselu siitä, mitä on tulossa. [VIDEOTOISTOSTA] Hei, Binky. Herää. On aika osoitin hauskaa. -Mikä tuo on? Lisätietoja viitteitä? Voi, Goody. [Lopeta toisto] DAVID J. MALAN: Ja että huomautuksen, näemme sinut keskiviikkona. Selvä. Kuka tanssii? Tule. Kuka tanssii? Haluat minun päästä se alkoi? Haen se alkoi. Woooo! LAUREN: Makea fancy Mooses.