DAVID J. Malan: To je CS50 a to je začiatok štvrtého týždňa. A chlapec, je Volkswagen v ťažkosti všetko kvôli softvéru. Poďme sa pozrieť. [Videoprehrávanie] -Cars, Najmúdrejšie znaky v Rýchlo a zbesilo filmy. Tento týždeň nemecký výrobca automobilov Volkswagen ocitlo v uprostred škandálu potenciálne kriminálnej pomery. -Volkswagen Sa pripravuje o miliardy pokuty, možné obvinenie z trestného činu pre jeho vedenie, as spoločnosť ospravedlňuje pre rigging 11 miliónov vozidiel pomôcť mu poraziť emisných skúšok. -Certain Dieselové modely boli navrhnutý s sofistikovaný softvér že použitá informácie vrátane Postavenie a riadenie vozidla rýchlosť určiť, auto bolo prebieha meranie emisií. Podľa tohto okolností, motor by sa znížiť toxické emisie. Ale auto bolo zmanipulované do bypassu že keď to bolo v prevádzke. Emisie zvýšil 10 až 40 krát nad prijateľnú úroveň EPA. [END Prehrávanie] DAVID J. Malan: Takže poďme sa pozrieť na to a presne vidieť, ako to by mohol byť realizovaný a ako to môže mať vplyv na tak veľa áut, ako je tento. Takže v mojej ruke tu sú lis správe, ktorá bola vydaná v EPA-- Environmental Protection Agency, ktorá je regulačná agentúra USA, že spracováva otázky životného prostredia, a potom aktuálne Právne upozornenie, že bol poslať Volkswagen len pred pár dňami. Takže EPA píše, a zverejňuje teraz verejne, sofistikovaný softvér algoritmus na určitý Volkswagen detekuje keď auto prechádza Testovanie oficiálnych emisií a otáčky Plné emisií Kontroly iba v priebehu testu. Účinnosť Tieto znečistenia vozidlá ovládanie emisie zariadenia je značne znižovať v priebehu celého bežnej prevádzky situácie. To má za následok v autách, ktoré spĺňajú normy v laboratóriu alebo testovanie stanice, ale pri normálnej prevádzke vyžarovať dusíka oxides-- alebo NOx-- rýchlosťou až 40 krát štandardné. Tento softvér produkoval Volkswagen je citácie koniec citátu, separačné zariadenie, ako je definovaný čistého Zákon o ovzduší v USA. Idú na to povedať, že EPA a ďalšie agentúrou odhalil odpojovacie zariadenie Softvér po samostatnej analýzy výskumníkmi na Západ Virginia University. Znečistenie NOx prispieva oxid dusičitý, prízemný ozón, a jemné častice. Vystavenia týmto znečisťujúce látky bola spojená so širokou škálou závažné účinky na zdravie, vrátane väčšej astmy útoky a iné respiračné choroby, ktoré môžu byť natoľko závažné posielať ľudí do nemocnice. Expozícia ozónu a častíc má tiež boli spojené s predčasným úmrtí v dôsledku respiračnej súvisiace alebo kardiovaskulárne súvisiace účinky. Deti, starší ľudia, ľudia s Vopred pripravený respiračné ochorenie sú mimoriadne ohrozené zdravotné účinky týchto znečisťujúcich látok. Postačí teda, že je to veľmi vážne. A poďme k čítať len jeden úryvok a potom sa budeme sa pozrieť na podkladové dôsledky z toho v kontexte automobile. Konkrétne, Volkswagen vyrobené a inštalované softvér v tzv Elektronická riadiaca module-- alebo ECM-- of tieto vozidlá, ktoré snímaných kedy sa skúšané vozidlo pre spĺňajúce emisné normy EPA. Na rôznych vstupov vrátane tých na báze poloha volantu, vozidlo rýchlosť, dĺžka motora prevádzku, a barometrický tlak, tieto vstupy presne sledoval parametre federálneho použitého skúšobného postupu na meranie emisií pre certifikáciu EPA účely. Počas skúšok emisií EPA, softvér vozidlá ECM bežal softvér, ktorý produkoval Výsledky zhody s emisnými limitmi. Vo všetkých ostatných prípadoch sa ECM vozidlo softvér prevádzkoval samostatnú cestu kalibrácia ktorý znížil Účinnosť Celková systému riadenia emisií, konkrétne selektívna katalytická Zníženie NOx trap-- ktorý uvidíme asi za chvíľu. V dôsledku toho sa emisie NOx zvýšená o faktor 10 až 40 krát nad úrovňou vyhovujúce dohodách o hospodárskom partnerstve v závislosti od typu pohonu cyklu. Takže to, čo to naozaj znamená, a Zdrojový kód k softvéru bežiaceho na Volkswagen nemá doteraz zverejnené, je, že účinne, toto ekvivalent je niekde vo vnútri kódu Volkswagen. Ak sú testované, a ak je do auta rozpozná niektoré faktory životného prostredia ako volantu polohy alebo pohyb alebo jeho nedostatok v aute alebo akýkoľvek počet ďalších faktorov ktoré sú v súčasnej dobe predpokladal, byť súčasťou tohto vzorca, jednoducho zapnúť Úplná kontrola emisií. Inými slovami, začnú emitujúce menej znečisťujúcich látok. Inak, v každej inej situácii ak to nie je detekovaný ako bytia v laboratóriu, oni jednoducho nemajú. A tak si môžete zjednodušiť to do viac betón pseudokód s niečím ako toto. Ak kolesá sa otáčajú, ale volantu nie je, sugestívne že auto je na niektorých druh rotačného valca ale v nejakom sklad testuje, potom sa správajú ako EPA by som vám. Inak nie. Takže poďme sa pozrieť v krátkej video, ktoré sa pozrieť na to, čo o dôsledkoch sú to vlastne mechanicky. [Videoprehrávanie] -Last Piatok EPA oznámila, že niektorí Vozy Volkswagen Audi medzi 2009 a tento rok boli pomocou tzv odpojovacie zariadenie obísť zákony o emisiách navrhnuté tak, aby vzduch čistý. Ale čo to presne znamená? No, moderné autá majú desiatky počítačov vnútri nich. A niektoré z týchto počítačov pomoc koordinovať funkcie motora pre optimálnu výkon a zároveň zabezpečiť, že tam nie je príliš veľa odpadkov vychádzajúce z výfuku. Už skutočne pracuje Týmto spôsobom už niekoľko desaťročí. V podstate, každá časť motora moderného automobilu má snímač alebo radič na tom, a tieto počítače číta v dátach tisíce krát za sekundu úprav making ako pomer paliva k vzduchu že to bude do valcov. Tieto podvádzanie Volkswagen a Audi modely sú diesely, a diesely majú ešte jeden naozaj dôležité počítač kontrolované parametre, čo je množstvo nespáleného paliva sa do výfuku. Teraz to znie zle. Neznie to ako by ste chceli nespálené palivo sa do výfuku. Ale v prípade diesel, máte niečo nazýva NOx pást, čo je zariadenie, ktoré absorbuje a pasce na oxidy dusíka že sú znečisťujúce látky, ktoré by v opačnom prípade prejdite do atmosféry. A účinok tohto NOx pasce je obohatený nespáleného paliva. Takže odpojovacie zariadenie je špeciálny program vo vnútri týchto počítačov, ktoré môžu robiť to vyzerať vozidlo spĺňa emisnú normy, aj keď to tak nie je. Volkswagen mal problém so založenými rukami. Jeho dieselové motory boli známe pre získanie veľkú spotrebu paliva, ale NOx pasca funguje len dobre ak sa používa viac paliva. Takže auto by zistiť, pomocou tohto rušiace zariadenie, keď to bolo získanie emisií test, by spotrebovávať viac paliva, aby NOx depeše prácu dobre, Emisie by bolo v poriadku. Ale potom sa dostanete na ceste, zariadení vypne, ste pálenie menej paliva ale ste uvedenie ako veľa ako 40 krát viac znečisťujúcich látok do ovzdušia. Ale ako to sakra urobil auto viem, že to bolo testovaný na dodržiavanie úrovne emisií? EPA hovorí, že to bol dômyselný systém, ktorý kontroluje veci ako polohy volantu, rýchlosť, ako dlho motor bol zapnutý, a dokonca aj atmosférický tlak. Inými slovami, existuje žiadny spôsob, ako to bolo náhodné preto, že softvér bol navrhnutá veľmi opatrne k detekcii oficiálna skúška emisií. To je nejaký docela vážne podvod, a to je Preto je v Volkswagen ako vážny problém. V skutočnosti sa ich CEO, Martin Winterkorn, len odstúpil. Takže čo sa stane ďalej? No, ak ste jeden z pol milióna diesel Jettas, Beatles, podkolienky, Passat, alebo Audi A3S uskutočnili, Dobrou správou je, je že vaše auto je stále bezpečne riadiť. Nemusíte dať to preč kým Volkswagen vydá odvolanie. Ale v určitom okamihu, že sú pravdepodobne bude mať aktualizovať softvér v aute. Keď sa to stane, by mohol dostať menej míľ na nádrž. Právnici sú už chystajú up pre triedu žalôb aby majitelia mohli dostať kompenzované v určitom okamihu v budúcnosti. Ale to nebude čoskoro stať kedykoľvek. [END Prehrávanie] DAVID J. Malan: Takže to vlastne vyvoláva zaujímavá väčší obrázok otázka pokiaľ ide o dôveru. Je to tak? Každý z nás má iPhone alebo androidi alebo niečo, čo v našich vreckách s najväčšou pravdepodobnosťou V týchto dňoch, alebo notebooky na našich bicykloch, ktoré sú beží softvér vyrobený Apple a Microsoft a zväzky iných spoločností. Ale ako vieme, že to, čo Tieto softvérové ​​produkty robia je vlastne to, čo títo spoločnosti tvrdia, že robia? Napríklad, ktorý je na hovoria, že zakaždým, keď uskutočniť telefónny hovor na vašom iPhone alebo Android telefón alebo podobne, že telefónne číslo je tiež nie je nahrávané na server nejakej spoločnosti kvôli nejakej programu, ktorý som napísané, či už je to operačný systém sám o sebe ako je iOS alebo Android, alebo preto, že ste si stiahli niektoré aplikácie tretej strany že nejakým spôsobom je počúvanie na všetko, čo píšete alebo všetko, čo ste vlastne hovoril. Ako viete, že keď vy ste beží Clang alebo Vytvoriť kompilovať vlastný softvér v CS50, ako Máte vlastný personál, ktorý je CS50, pomocou knižnice CS50, nebol prihlásenie každý string ste niekedy dostali alebo každým cólom, aký ste kedy dostal? No, mohli by ste sa rozhodne netvári do zdrojového kódu na niečo ako knižnice CS50, vy sa mohli pozrieť do zdrojového kódu pre operačný systém Linux beží na CS50 IDE. Ale úžasná prezentácia bol daný v roku 1984 v prijatí Turing Zadanie zákazky veľmi slávny počítačový odborník známy as-- menom Ken Thompson, ktorí obdržal Turing cena, ktorá je druh počítačovej vedy je Nobelova cena, ak chcete, za jeho prácu na operačný systém s názvom Unix, ktorý je veľmi podobný ducha toho, čo používame, ktorý je Linux. A otázka opýtal sa jeho prijatie reč, v podstate ktorým sa stanovuje rámec pre roky a roky diskusií o dôvere a bezpečnosti, bola táto. Do akej miery by jedného veriť vyhlásenie, že program-- kus z software-- je bez trójskych koní? Možno je to oveľa dôležitejšie dôverovať ľudia, ktorí písali softvér. A v skutočnosti, sme spojený do reči, že dal pri prijímaní tohto ocenenia v 80. rokoch na internetových stránkach CS50 je pod stránke prednášky pre dnešok. Pretože to, čo uvidíte je to, že on vlastne dáva pomerne jednoduchý príklad, ako aj kompilátor ako je Clang alebo čokoľvek kompilátory iní používané v minulosti, Čo keď vložený v kompilátora my sami používate je málo, pokiaľ podmienka, ktorá v podstate hovorí, ak si všimnete, že tento kód je pomocou Funkcie GetString alebo GetInt funkcie, pokračujte a vložte zadné dvere alebo trójskym koňom tak, že tento program Teraz má nejaké nuly a tie, ktoré robia niečo škodlivého. Prihlasovanie všetky vaše úderov, nahrávanie, že dáta k nejakému serveru, alebo naozaj čokoľvek. A čo Ken Thompson pokračuje robiť v reči je preukázať, že aj v prípade, máte prístup k zdroju kód prekladača, ktorý zlomyselne môže robiť to, to nevadí, pretože Tam je to kurča a vajcia realita minulosti veľa rokov pricom kompilátory sa používajú na zostavovanie sami. Inými slovami, pri ceste späť niekto musel písali prvý kompilátor. A potom, kedykoľvek že som aktualizované kompilátor zmenou jeho zdrojový kód, pridávanie funkcií a překompilování ju Pre ľudí ako my používať, dobre, Používajú starý verzia kompilátora zostaviť nový verzia kompilátora. A ak ste sa pozrieť v rozhovore, ktorý dal, uvidíte, že preto, tohto kruhovitosti, môžete skutočne mať chyby alebo Trójske kone vložené do softvéru sme pomocou. A aj keď sa pozriete na zdrojový kód pre tieto programy, to by mohlo byť ani zrejmé pretože podvod je vlastne v niektorých starších verzií kompilátor, ktorý od tej doby bola vstrekovanie hrozbu do nášho softvéru. Čo je len hovoriť, my naozaj nemôže a nemal by dôvera softvér bežiaci na našich notebookov alebo telefóny alebo akýkoľvek počet miest. A v skutočnosti, ďalej v tomto polroku, kedy začneme hovoriť o programovaní webe a skutočne začať stavať webové aplikácie sami, budeme hovoriť o týchto hrozby a ďalšie. Teraz, možno ste premýšľal a všimol že to tam bolo malinké Darth Vader na klipy, ktoré Krajnici tam ukazovať o Volkswagen. Ak ste nikdy nevideli, ja myslel, že by sme mali uľahčiť nálada, pretože to je všetko veľmi deprimujúce a desivé. Idem sa pozrieť späť na Super Bowl 2011 kedy je obchodná od Volkswagen-- a to Takmer z nich robí sympatický again-- vysielal prvýkrát v televízii. Je tu druhý klip 60 si myslím, že sa vám bude páčiť. [Videoprehrávanie] [MUSIC - tému z "hviezdnej vojny"] [DOG šteká] [CAR ZAČÍNA] [END Prehrávanie] DAVID J. Malan: Jo. Len som kontrolu. To auto je na zozname porušovania ľudských práv. Dobre. Takže sa pozrieme na niektoré pseudokód pred chvíľou. A tu je väčší úryvok pseudokódu kódu že sme videli niekoľkokrát tak ďaleko. A poďme použitie je to príležitosť Teraz zavedenie nového programovania technika, ktorú sme urobili pozri algoritmickým minulý týždeň, kedy sme sa pozreli na zlúčenie druhu. Ale poďme formalizovať a uvidíte, ako sa nám to môže používať v skutočnom kódu, a potom budeme používať túto Technika po ceste najviac pravdepodobné, že na riešenie niektorých ďalších problémov. Takže to bol jeden z prvých programov sme kedy napísal, aj keď v pseudokódu kódu. A to, čo tento program povolená, aby sme robili kurz bolo nájsť Mike Smith v telefónnom zozname. A všimnite si v jednotlivých línií osem a 11, ktoré mal tento výkaz ísť. A v skutočnosti, isté jazyky, C medzi nimi, vlastne robiť majú vyhlásenie, že je doslova prejsť na ktorý vám umožní prejsť na konkrétny linke. To je všeobecne odsudzovaný pretože to môže byť veľmi ľahko zneužité a môžete začať skákať svoj Program všade na rozdiel k používaniu druh logika a riadenie toku že sme použili doteraz len s slučky a podmienky a podobne. Ale môžeme zjednodušiť tento algoritmus v pseudokódu kóde spôsobom. Namiesto toho, aby tento opakovaný či smyčkovací prístup kde sme neustále vracať späť a späť do riadku tri, prečo nie my len trochu punt a viac sa všeobecne povedať, v súlade siedmich a 10, stačí vymeniť tie dva párov liniek s, else if Smith je staršia v knihe budeme hľadať Mike v Ľavá polovica knihy. Else ak Smith neskôr vo kniha, hľadať Mike v práve polovica knihy. A všimnite si už na kruhovitosť. Je to tak? Ja som hľadal Mike v telefónneho zoznamu a potom Nakoniec som hit možná linka sedem alebo možno riadok 10 a moje inštrukcie pre seba, je vyhľadávanie Mike v polovici telefónneho zoznamu. No, ako mám vyhľadať Mike? Som v polovici hľadal Mike, prečo sa mi nejako odoslanie v kruhu? Ale to je v poriadku, pretože to, čo je deje na rozsahu problému, ako je napísané v riadku 7 a 10? Nie sme len hovorím, hľadanie Mike, hľadať mike. My konkrétne hovoriť, čo? Hľadať pre neho v ľavej polovici pravá polovica, ktorá je v skutočnosti polovičnej veľkosti problému. Takže je to v poriadku, že sme trochu zapojenie do tejto kruhovitosti, Tento argument obežníku, pretože aspoň sme čo je problém menšie a menšie. A nakoniec budeme dosiahnuť že takzvané referenčné prípad, kedy Máme len jednu stránku left-- ako náš dobrovoľník minulý týždeň did-- sme mali jednu stránku doľava a potom my nie mať na hľadanie Mike Smith preto, že je to buď na tejto stránke alebo nie je. Tak ako môžeme realizovať túto myšlienku, tento druh kruhovosti pri skutočnom kódu? No, môžeme využiť techniku ktorá je všeobecne známa ako rekurzia. A my sme videli to v pseudokód pre zlučovacie druhu minulý týždeň. Pripomeňme si, že to bolo pseudokód pre zlučovacie druhu. Je to pravdepodobne ešte jednoduchšie ako bublina, alebo výber alebo insertion sort nielen z hľadiska jednoduchosti s ktorou môžete vyjadriť. Ale to je preto, sme nejako kruhovo povediac, hľadať niečo, tým, že hľadá to znova. Ale my sme vyhľadávanie buď na ľavá polovica alebo pravá polovica a nakoniec sme zlučovanie v tomto prípade. Ale aj tu sa tieto dve linky, radenie sme zase sa to idea rekurzia. A konkrétne to, čo znamená, v rámci algoritmu, je, že algoritmus je rekurzívny ak sa používa alebo volá sama seba. Alebo, pokiaľ ide o C, je funkcia recursive-- funkciu nazvanú foo je rekurzívne, ak foo, kdesi v jeho zdrojovom kóde, volá funkciu sám foo. A to je zlé, ak všetko foo niekedy robí je sám znovu a znovu zavolať. Je to OK, ak foo nakoniec prestane, rovnako ako merge sort, tým, že hovorí, počkaj, ak k tomuto problému je super malý, napríklad, alebo som ho našiel, koho, že som hľadáte, jednoducho vráti. Nenechajte rekurzívne, nie sám cyklicky znovu zavolať. A tak sa poďme pozrieť na ako to môže skutočne pracujú. Takže budem pokračovať a otvorený up dvoch príkladoch tu zdrojového kódu. Jedným z nich je nazývaný sigma 0. A to nie je vôbec rekurzívne, ale poďme sa sa pozrieť na to, čo tento program robí. Ja som vyzliekol si všetko pripomienky od nej, ale všetky zdrojového kódu na CS50 je webové stránky má komentáre Ak ste chcieť čítať cez to znova neskôr. A poďme urobiť pár zdravého rozumu kontroluje tu. Takže v hornej časti tohto kódu, máme patrí CS50.h. Čo to robí? Prečo je to tu? Z hľadiska primeraných laicky. Čo to robí? Jo. Divákov: Tak, že funkcia GetInt funguje. DAVID J. Malan: Takže to Funkcie GetInt funguje. Vzhľadom k tomu, vnútornej strane tejto Súbor, CS50.h, ktorý uvidíme onedlho v podmienky jej zdrojového kódu, má veľa funkcií declared-- GetInt, GetString, a veľa others-- a pokiaľ nie je v skutočnosti máme, že Zahrnúť linku, kompilátor Clang nie je bude vedieť, že existuje. A to isté platí pre linky dvoch, kde je definovaná int printf, čo je funkcia budeme naďalej používať celkom dosť. Teraz, linka štyroch zdá málo funky pretože je to len jeden vložka. Má to bodkočiarka, nie kučeravé traky, žiadny kód vnútri nej. Ale to, čo urobil nazývame táto vec v týždňoch minulosti? Jo. Takže prototyp. A prečo máme prototyp, ktorý sa zdá byť trochu nadbytočný zvyčajne preto, že sme sa zvyčajne pozri funkcie znova neskôr v súbore, je to tak? Tak prečo have-- ste len poškriabaniu vašej hlave, ale ja to beriem. Jo. Divákov: [Nepočuteľné] Funkcie po hlavnej. DAVID J. Malan: Presne tak. Tak, že prekladač vás pozná bude nakoniec definovať alebo zaviesť že funkcie po hlavnej, pravdepodobne. Tak Clang a najviac kompilátory sú trochu hlúpy a budú vedieť, len to, čo im poviete. A ak chcete používať funkcia nazvaná sigma, lepšie učiť kompilátor že existuje vopred. Teraz, hlavné sama, dokonca aj aj keď je to banda liniek, je celkom oboznámený snáď teraz. Má to robiť, zatiaľ čo slučky ktorého účel života Tu vraj je dostať kladné celé číslo od užívateľa. A len držať otravovať ho alebo ju, kým sa spolupracovať. Potom v riadku 16, mám zaujímavý hovor. IntAnswer. Ktorý je na ľavej ruke strana dáva mi Int ktorý môže store-- nazýva Answer-- ktorý bude ukladať, zdá sa, návratová hodnota sigma. Takže sigma je len ľubovoľný, ale zmysluplné meno že som dal do funkcie ktorého účel života je vziať jednu argument-- budeme hovoriť N v tomto case-- a len preto, aby súčet tohto čísla a každé kladné číslo, ktoré je menšie, než to. Takže keď som sa prejsť v počte 2 sigma, chcem pridať 2 plus 1 a 0-- nie 0-- tak, že mi dáva 3. Keby som prejsť, počas 3 až sigma, chcem majú 3 + 2 plus 1, čo mi dáva 6. A tak ďalej. Tak to jednoducho spočíta všetky Čísla menšie ako alebo rovná k nemu. A teraz, tu ja som jednoducho ísť vytlačiť odpoveď. Takže ako rýchlu kontrolu sanitačného, ​​poďme aby sigma 0-- bodka lomítko sigma 0-- a dovoľte mi, aby som zadajte 2. A ja naozaj dostať 3. Dovoľte mi, aby som zadajte 3. Ja naozaj dostať 6. A ak niekto môže robiť matematiku rýchlo, keď to urobím 50 čo mám dostať? Divákov: [Nepočuteľné]. DAVID J. Malan: No, no. Ale 1275, čo je dosť blízko. Tak toto je výsledok robí 50 a 49 a 48 a 47 a 46 celú cestu až do 1. Tak to je všetko sigma robí. Ale poďme sa pozrieť, ako máme implementovaná to teraz. Tak sem je samotná funkcia. A to sa nezdá mať niečo do činenia s rekurzia doteraz. V skutočnosti, sme za použitia old school technika. Som inicializáciu premennú s názvom čiastku na nulu, potom mám foreloop tu, a ja som deklarovanie Int názvom Ja, nastavenie je rovná 1-- keď som mohol nastaviť, že sa rovná nula, ale od tej doby robím sčítanie, Koho zaujíma, či to je nula alebo jedna. Bude to mať žiadny vplyv. Takže som iterácie tak dlho, ako som ich menšie ako alebo rovné M, ktorý je argument, ktorý bol odovzdaný v. A potom som sa len udržať zvyšovanie I. a pohľad slučky všetko, čo robím robí súčet a rovná I. A to je úmyselné. Nechcem robiť, v tomto Rovnako tak ako súčet navyše plus. Chcem skutočne pridať aktuálna hodnota I, ktorý je čím ďalej väčšie a väčšie a väčší na priebežný. A potom som sa vrátiť sumu. A tak odpoveď dostane hodnotu sumu. A potom som ho vytlačiť. Takže je tu príležitosť tu, aj keď sa trochu zjednodušiť tento kód koncepčne a druh úderu niečí myseľ v termínoch jednoduchosť, aj keď to chvíľu trvá zoradiť z oceniť, prečo sa to je silný v týchto malých príkladoch. Tu je sigma one--, takže Druhá verzia tohto kódu. Všetko up vrchole je rovnaká, aby že rovnaký príbeh, platí ako predtým. Ale teraz poďme pozrieť na vykonávanie sigma, ktoré Ja som scvrkol na iba týchto lines-- štyri riadky kódu, naozaj, plus niekoľko zložené zátvorky a biely priestor. Ale čo mám robiť? Ak je m je menšia ako alebo sa rovná nula, musím trochu zvládnuť že mimoriadne jednoduchý prípad. A ak sa mi podať nula, alebo nič negatívne, čo je práve divné, Ja som jednoducho ísť ľubovoľne ale konzistentne vrátiť nulu. Nechcem, aby túto vec dostať sa do nejakej podivné nekonečna slučka, pretože so zápornou hodnotou. Takže ja len hovorím, či mi dáš nula alebo menej, Vraciam nula. Ale to je dobre, pretože to je že jednu stránku z telefónneho zoznamu , Čo zostalo. Som odhryzol veľmi špecifický problém, a nie niečo, čo volá rekurzívne. Avšak v rade 31, čo Zdá sa mi to robiť? Zátvorky sú len udržať veci, dúfajme, trochu jasnejšie. Ale všetko, čo robím, je, že som vracať m-- čokoľvek odovzdáte me-- plus Hodnota m-- ľúto, plus hodnota sigma m mínus 1. Takže čo to znamená? Ak by ste mi dať číslo 3 ako vstup, odpoveď Chcem sa dostať nakoniec je 6, pretože 3 plus 2 plus 1 6 mi dáva. Ale ako si myslím, že o ako sa spustením tohto kódu? Prvýkrát som zavolať sigma a ja sa prejsť v hodnote 3, to je ako hovoriť na kuse papiera, tu je hodnota 3 a ja som bol odovzdaný to ako Sigma. 3 je samozrejme menšie ako 0, takže podmienka IF neplatí. Else robí. Tak čo mám robiť? Chcem sa vrátiť m, čo je 3 plus sigma M mínus 1. Dovoľte mi teda sledovať to. Chystám sa dať to kus papiera nadol. A aká hodnota, aby sa jasné, mám ísť prejsť do Sigmy v tejto chvíli v príbehu? Aké číslo? 2, že jo? 3 mínus 1 je 2. Tak som len potrebujete trochu zdrap papiera sem. Takže teraz sigma je stále znovu zavolal. A ja som úmyselne to dole, pretože je to niečo ako pozastavenie že verzia príbehu pretože teraz som sústredený na signál M mínus 1. Tak bola 3 m, m mínus 1 je 2. Takže tu je 2, že som bol odovzdaný. 2 je samozrejme menší než 0 tak, že prípad nevzťahuje. Inak sa vrátim m, čo je to vec, a sigma z aké hodnoty? Takže ak sigma of 1-- pretože m je teraz 2 tak 2 mínus 1 je 1. Takže teraz mám len hodnotu 1. Ja som okolo len číslo 1 do funkcie sigma-- alebo ja here-- tak 1 zjavne nie je menšia ako nula, stále ešte neplatí. Else return 1 plus sigma čoho? 0. Takže mi dovoľte pripomenúť, že. Vrátim sa k tomu neskôr. Teraz budem pokračovať a drobek dole číslo 0, pretože to je môj argument alebo parameter. Ja som prešiel číslo 0 a nakoniec sa tento proces toho len opakujem inzerát najmenších podrobností sa ukončí, pretože to, čo mám hneď robiť, akonáhle vidím túto 0? Aj vrátiť nulu. Takže teraz budete musieť pretočiť príbeh. Keby som teraz ísť späť v čase, čo bola posledná vec, Urobil som, keď ste boli doslova prevíjanie videa? Idem vyzdvihnúť najnovšie 1, a to mi dáva 1 plus 0 je 1. Ak mám držať prevíjanie príbeh, ktorý sa chystá dať mi 2 plus tento beh hodnota, ktorá je 1. Tak to je 3. A potom budem držať prevíjanie. Keď som prvýkrát zapísať číslo 3-- tak 3 plus 3 mi dáva 6. A teraz, ak ste pretočil video až do tohto bodu, toto bolo veľmi Prvá otázka, spýtal som sa. Pri odovzdaní 3, čo je sigma z 3? Je to vskutku 6, súčet všetky tieto kusy papiera. Takže ak to trvá trochu kým na zabaliť svoju myseľ okolo, to je v poriadku. Ale za to bol little-- nej bol veľmi úmyselné, že som naskladané tieto čísla na seba. Je to niečo ako mať memory-- záznam v čase, ako práčke vo videu, že môžem skutočne pretočiť v. A budeme sa vrátiť do že metafora v len trochu. Ale najprv, ukazuje sa, že je tu kopa mágov a ľudia, smiešny, Myslím, že na Googlu. Chceli niekoho, kto je veľmi dobrý na Googling mysli prísť na chvíľku a pomôžte mi niečo hľadať? Veľmi, veľmi nízka kľúč. Niekto, kto je nikdy prísť skôr, možno. OK. Jo? No ták. Poď dole. Ako sa voláš? SAM: Sam. DAVID J. Malan: Sam, poď dole. To je rovnaká. Rád som ťa spoznal. Ahoj. Poď. Takže všetko, čo potrebujem, aby si urobil, ak ste mohli, Same, tu je Google. Môžete hľadať termíne rekurzia? Nikdy nepokazí. A teraz let's-- jo. Kliknite na tlačidlo OK, že. Lepšie kliknite na to. Ach, to chápem. Nie? OK. Takže poďme urobiť pár ďalších. Ani nie tak súvisiace akademicky tu, ale už ste niekedy hľadal Google pre anagram? SAM: Nie. DAVID J. Malan: OK. Hľadať prešmyčka miesto rekurzia. Ako sa o nakrivo. Už ste niekedy hľadali nakrivo? Teraz, toto je trochu ťažké vidieť, ale dúfajme, že everything's-- OK. Je to len ty a ja sa teší to. OK. Takže nakoniec, to one's-- je to trochu nakrivo. Teraz už výkrut. Wonderful. Dobre. Veľké poďakovanie patrí tiež Sam. Nech sa páči. Vďaka. Takže, čo sa deje vo všetkých z týchto príkladov hlúpe? Takže naozaj, pod kapotu Milióny Googlu riadkov kódu vraj je niekoľko hlúpe IF podmienky, ktoré sú v podstate kontrolovať, či má používateľ napísaný v tejto vety, urobiť niečo, čo pravdepodobne vzal netriviálne množstvo času realizovať len preto, aby bolo zábavné týmto spôsobom. Ale to je všetko, to sa varí dolu pod kapotu. Ale, samozrejme, rekurzia je viac z geekier príkladom z týchto špeciálnych trikov. A určite tam iní tam vonku ako aj, že majú možno ani objavil ešte nie. Tak sa pozrite, alebo zvážte Teraz nasledujúci program, a určite chytiť akýkoľvek z nich na svojej ceste von. Chystám sa ísť dopredu a otvoriť program, ktorý je bude snažiť vymeniť dve hodnoty. Ale skôr, než sme sa tam ísť, ideme na to. Mohli by sme získať ešte jeden dobrovoľník, myslím, že? Chceli by ste, aby dobrovoľne? Nie? Poď hore. Poď hore. Dobre. Takže Vaše meno je čo? Lauren: lauren. DAVID J. Malan: Lauren. Poď hore, Lauren. Takže Lauren je byť tu napadla nasledovne. Rád som ťa spoznal. Takže Lauren tu má vpredu z jej dvoch prázdnych šálok. A máme nejaký oranžový šťava a niektoré mlieko a budeme pokračovať vpred a vykonajte nasledujúce. Sme len tak naplniť toto. Niekoľko uncí mlieka sem a poďme vyplniť trochu pomarančovej šťavy tu. A v prednej časti všetkých títo členovia publikum, prehodiť dve hodnoty týchto poháre. Dajte pomarančový džús v sektore mlieka pohár a mlieko v šálke pomarančovej šťavy. Ako by ste to robili, keby ste boli na domov a mal prístup k inej zásoby? LAUREN: Daj to do iného šálky. DAVID J. Malan: OK. Takže poďme sa dočasné premenná, ak budeme chcieť. A do toho teraz a realizovať Rovnaký postup vymieňania. Tak dobré. My sme dali OJ do dočasného premenná, mlieko do premennej OJ, a teraz dočasné premenná do premennej mlieka. OK. Takže veľmi dobre robili doteraz. Tak to dopadá out-- si myslí, že Myslel len na chvíľu. Tu, na len geek to trochu, to by bol zodpovedajúci C kód že sme práve realizovaná. Mali sme dva vstupy, a a b, a to ako z ktorý budeme len povedať, pre jednoduchosť sú int je. A všimnite si tu, keď chcem vymeniť hodnoty dvoch premenných, a a b, my naozaj potrebujeme sprostredkovateľa, je dočasné premenné, dočasné pohár, do ktorého sa naleje jednu z hodnôt takže máme vyhradené miesto pre to. Ale potom je kód je presne ako Lauren tu vykonávané. Teraz, len sa dostať trochu bláznivejšie, dopadá že môžete to urobiť bez toho, aby dočasné premenné. Ak chcete to správne, keď ideme musieť podvádzať s nejakou chémiu. Máme nejaké ďalšie poháre tu. Takže najbližšia vec, ktorá vyzerá ako je mlieko a vodných perhaps-- alebo mlieko a OJ-- je máme nejaký voda, takže budeme naplniť tento nahor s niekoľkými uncí čistou vodou. To je asi moc. Jo. To je rozhodne príliš veľa. Vydržte sec. A teraz máme olej, ktorý, ak si spomínam zo strednej školy chémia triedy, Dúfajme, že to nebude miešať s vodou. Ale je to trochu druh vyzerá ako mlieko a úradnom vestníku. Takže teraz, bez použitia dočasnú premennú, môžete ich presunúť tieto dve hodnoty? Takže oleja ide do vody pohára, voda ide do olejovej šálky. LAUREN: Bez ďalších pohároch? DAVID J. Malan: Žiadne ďalšie poháre. A ja som vlastne skúšať to pred týmto rokom takže si nemyslím, pokiaľ to nebude vedieť skutočne pracujú chemicky. To sa nemalo stať. Funguje to? Dobre. Tak oddeľovanie? Dobre. Teraz musíme získať voda do druhého šálky. Múdrejší chémia koncentrátory mohol Pravdepodobne to malo podariť lepšie ako ja. LAUREN: Voda je na dne. DAVID J. Malan: water--, ktorá bola čo je kľúč v poslednej dobe sme to urobili. Musíte to urobiť v správnom poradí. Jo. To je v poriadku. Takže teraz máme dve šálky oleja. OK. To je v poriadku. Ale chemicky ak to fungovalo ako já-- Lauren: To je voda. DAVID J. Malan: To je väčšinou voda. Dobre. Ale to je stále rovnaký pohár ako predtým. Tak naliať to-- skúste to tam. OK. To je dobré využitie triedy času dnes. OK. Takže teraz we-- pekné. Druh. Dobre. Takže veľmi dobré. Ďakujem Lauren. Veľmi dobre. Takže len vyhodiť svoju myseľ, a to je niečo, čo možno hrať s, ak sa vám páči v CS50 ID, môžete v skutočnosti, vymeniť dve premenné bez použitia dočasného celé číslo. A to je zodpovedajúci C kód. A ak si spomínam z poslednej Streda, sme zaviedli, ak je krátko, niektoré nové operátormi v C a robí niekto spomenúť, čo tú malú mrkvu symbol je, že malá trojuholníková symbol z klávesnice znamená? Čo bitový operátor? Divákov: Exor. DAVID J. Malan: Exor. Exclusive Or. Takže ak chcete, len tak pre zábavu na domov, čím sa získa a a b dva ľubovoľné hodnoty ako akýkoľvek eight-- a I by si vybral osem bitovou hodnotu. Ak to budete robiť s 32 bitmi, budete veľmi rýchlo nudiť. Ale len dať osembitovým Hodnota, ktorá je čo, jedna alebo dva, a dať b podobnú hodnotu. A potom pomocou definície XOR od minulej stredy, platí, že kúsok po kúsku, každý tieto osem bitov v každej z a a b, a potom to urobiť presne to, za týmto kódom. A nie je to nesprávne, čo tu vidíte na obrazovke. Je to naozaj scvrkáva na tri operácie XOR a nejako magicky a a b vymenia pozície bez straty akejkoľvek informácie. Takže olej a voda trik je Najbližší reálny svet inkarnácia Som mohol myslieť, že napodobňovať. Ale je to určite jednoduchšie použite dočasné premenné, ako v tomto prípade tu. A aj toto je príležitosť povedať, Aj tento druh mikro optimalizácie, ako erudovaný by som, zatiaľ čo druh zábavy chváliť, ako ste to urobil, bez ako vymieňať s extra premennú, že to nie je všetko, čo presvedčivé. Vzhľadom k tomu, aby ušetriť 32 bitov, as v prípade skutočného int, nie je všetko, že presvedčivé na systéme, v ktorom môžete používať desiatky megabajtov alebo dokonca viac ako pamäť v týchto dňoch. A v skutočnosti, keď dostaneme na neskoršie Zadanie problému a implementovať kúzlo Kontrola a budete byť vyzvaní, aby tak urobili s to tak málo RAM a tak málo, čas pokiaľ možno na computer-- vám ešte majú za týždeň pre vykonávanie to-- budete have-- budete vyzval k minimalizácii týchto zdrojov. A to je naozaj len OCCASION tento semester kde budete povzbudzovaní k holenie off aj najlepší výkon náklady na inak. Tak what-- ako môžeme vidieť v skutočnej kódu? Nechaj ma ísť napred teraz a otvoriť príklad ktorý zámerne sa nazýva Nie Swap, pretože to nie je v skutočnosti vymeniť premenné ako ste vlastne by sa dalo očakávať. Takže poďme sa pozrieť. Tu je program, ktorý nemá CS50 Knižnica sa deje, len Standard I / O. Teraz máme prototyp ako odkladací priestor do hornej, ktoré práve znamená, že to musí byť definované neskôr. A tu je hlavné. Aj ľubovoľne pridelený X a Y v tomto poradí, jeden hodnoty a dva len preto, že sú malé a ľahko sa premýšľať. A potom som jednoducho veľa printfs kde mám kontrolu zdravý rozum. x je 1 a y je 2, je podľa všetkého čo tieto printfs povie. Takže žiadna mágia tak ďaleko. Potom budem tvrdiť, s tlačiť def, vymieňať dot dot bodky. Chystám sa zavolať swap Funkcie, odovzdávanie v x a y. A predpokladajme, že pre túto chvíľu Swap je implementovaný presne ako to bolo pred chvíľou s dočasné premenné. A tak som sa tvrdiť, smelo, vymenil. x je teraz to, a y je teraz, že. Ale súbor, samozrejme, sa nazýva No Prepnúť. Takže poďme sa skutočne vidieť, čo sa stane. Ak mám zostaviť bez swapu a potom do ./noswap, x je 1, y je 2. Swapping vymenil. x je 1, y je 2. Takže to vlastne sa zdá byť chybný aj hoci swap-- poďme posunúť nadol now-- sa vykonáva presne podľa kód, ktorý som navrhol pred chvíľou. Takže my nebudeme mať fantázie s XOR veci zatiaľ. Aj to by malo fungovať len rovnako ako s mliekom a úradnom vestníku, ale nezdá sa, že funguje. Takže poďme to urobiť znova. Možno som jednoducho nebol v chode vpravo. Takže poďme bežať Bez Prepnúť znova. Možno Já-- nie. Tak to jednoducho nefunguje. Takže poďme urobiť malý kontrolu zdravý rozum. Nechajte ma ísť napred tu v Swap a stačí pridať, počkajte chvíľu, a je% i / n, a poďme plug-in hodnoty a. Pretože naozaj chcem aby videli, čo sa deje. A skutočne, to je ladiace technika že by ste mohli byť použitie v úradné hodiny, alebo doma už, podobný v prvej polovici roka Dan Armendariz je video v PSET3 kde sme predstavili tlač def as odporúčaná technika, aspoň Pre jednoduché prípady. Nechaj ma ísť dopredu a spustite make opäť bez swapu, ./noswap. Zaujímavé. Takže si všimnúť, čo sa zdá byť pravda. x je 1, y je 2, ale je 2, keď b je 1. Takže tí dvaja sa nejako vymenili ale x a y nie sú stále prehodené. Tak aby bolo jasno, čo sa deje sa, tu mám x a y a tie, ktoré sú premenné miestne v Rozsah hlavné, som okolo v x a y vymeniť. Teraz, swapu, ako samostatná funkcia, je zadarmo zavolať svoje argumenty alebo jeho parametre niečo chce. Foo či bar alebo X alebo Y a alebo b. Len aby bolo jasné, že sú nie je totožný s x a y per sa, Povedal som, a a b. Ale my sme im mohli nazvať, čo chceme. A tak to vyzerá, swap odovzdávaný x-- AKA je-- a to je odovzdaním y- AKA b. Nejako sa tieto tri riadky sú vymieňať presne tieto hodnoty ako Lauren urobil s mliekom a vestníku. Ale keď sme vytlačiť Hodnoty, a a b sú síce vymenia, ale aj x y mať žiadnu zmenu k nim. Pripomeňme si, že x a y sú tu. Takže môžeme vidieť cez ďalšia technika tiež. Aj to je technika vložené do problému nastaviť tri. Poďme ďalej a robiť to v CS50 ID ak ste tak už neurobili. Na pravej strane my majú túto kartu debugger. A ak otvoríte toto hore, tam je nejaký tajomný informácie že je hodená na vás spočiatku. Ale poďme podpichovať to od seba naozaj rýchlo. Takže človek, vidíte lokálne premenné. Ukázalo sa, že stavať na CS50 IDE, a mnoho programovacích prostredí viac všeobecne, je debugger. Nástroj, ktorý vám umožní vizuálne vidieť čo sa deje vo vnútri vášho programu aby bolo nutné uchýliť sa k pridanie printfs a kompiláciu a spúšťanie a pridanie printf je a kompiláciu a beh, ktorý už v úradných hodinách alebo doma, je zrejme stále dosť únavné. Tak tu, za chvíľu, my sme bude vidieť v reálnom čase hodnoty našich lokálnych premenných. Sme tiež bude môcť nastaviť čo sa nazýva zarážky, ktoré sú možnosti v mojom programe pre pozastavenie spracovanie od určitého riadku kódu že som zvedavý. Je to tak? Tieto programy beží v zlomku sekundy. Je to celkom pekné pre nás pomalší človeka aby bolo možné pozastaviť, chvíľku, viď čo sa deje okolo určitý riadok kódu bez programu orbe cez to a dokončovacie úplne. Takže zarážky bude nám umožňujú zlomiť a pauza v určitom okamihu. Zásobník volaní je ozdobný spôsob, hovoriť, aké funkcie sú v súčasnej dobe volaná v túto chvíľu. Hlavné je vždy najskôr zavolať. Ale ak Hlavný volá volanie funkcie Swap, my vlastne bude vidieť tower funkcií, ktoré boli volal v obrátenom chronologickom poradí. Takže poďme sa pozrieť, že. Idem oddialiť. Chystám sa vrátiť do svojho kódu. A len preto, že chcem, byť pedantská tu, Chystám sa ísť ďalej a kliknite na tlačidlo len na ľavej strane linky päť. A to vytvára červenú bodku. A všimnite si na pravej strane že ladiaci program vie, hej, Len som povedal, zarážku na noswap.c linka päť, konkrétne v tomto riadku kódu. Takže debugger vie, že požiadali, aby nabudúce Vediem môj program pozastavíte poprava tam skôr než len beží celú vec veľmi rýchle. Takže teraz budem kliknite na Debug Tlačidlo na samom vrchole IDE a to bude robiť nasledujúce. Bude to otvoriť spočiatku trochu desivo vyzerajúci druhý terminál window-- vzdialenej ladenie od hostiť také a such-- a my sa vrátime k tomu, čo všetko to znamená, že onedlho. Ale čo je dôležité pre túto chvíľu je to, že červená bodka bol zasiahnutý, ladiaci má úmyselne pozastavená execution-- nie na tejto linke sám o sebe, ale na prvý riadok aktuálny kód v tejto funkcii. A to je dôvod, prečo je rad siedmych teraz zvýraznený žlto. A teraz poďme sa pozrieť na pravej strane. Vyzerá to, že v predvolenom nastavení, dosť pekne, x má akú hodnotu? 0. A y má akú hodnotu? Zero. A to je potrebné očakávať v tom zmysle, že x a y-, že žltý line-- má nevykoná doteraz. Takže x by nemali mať hodnotu 1. To by mohlo mať inú hodnotu, tzv hodnota odpadky. A máme to šťastie, že je to nulu v tomto okamihu, v podstate. Takže teraz je tu len málo Tlačidlá musíme starať o tom, kedy ladenie týmto spôsobom. Všimnite si, máme tlačidlo Play. A ak budeme hrať, alebo hit pokračovať, to je len sa prejsť zvyšok programu alebo kým nenarazí ďalšie zarážku. Ale ja som to nastaviť ľubovoľný iný Zlomové body, takže je to len bude prevádzkovať až do konca. Tento druh porazí Účelom šťourat. Takže namiesto toho, o čo sa starám tieto ikony doprava. A keď som sa vznášať sa nad je, ako by ste mali taky, uvidíte malé tips-- tipy nástrojov. Tento je prekračovať. Teraz to neznamená, že preskočiť nasledujúci riadok kódu. To len znamená, vykonať ho a presunúť na ďalšie, presunúť na ďalšie, presunúť na ďalšie. Inými slovami, pomocou toto tlačidlo, môžem chodiť cez môj kód jeden krok v čase. Riadok po riadku, a to doslova. Teraz, na pravej strane to, že je tu ešte jeden že uvidíme za chvíľu. Jedná sa o tzv Step Into ikonu, ktorá je bude dovoľte mi ponor do inej funkcie. Ale pozrime sa to za chvíľu. Takže idem na tlačidlo prekročiť. A teraz nevšimol, keď som kliknite Toto tlačidlo v pravom hornom rohu, majte oči zhruba v lokálnej Premenné a uvidíme, čo sa stane s x. x je teraz 1, pretože žltá linka je teraz vykonaný a my sme sa presunul k linke 8. A za chvíľu y by sa snáď stane 2. Teraz, nič, čo by zaujímavé sa stane na chvíľu. To všetko je, je printf. A všimnite si, v mojom sekundárnom termináli okná, vidím výstup tlačového def. A teraz musím urobiť Rozhodnutie ako programátor. Môžem prekročiť túto líniu kód, spustením to, ale nie dostať zvedavý, čo je vo vnútri. Alebo som si skutočne krok do nej a ísť dovnútra Swap sám. Takže poďme urobiť to druhé. Nechaj ma ísť dopredu a kliknite na tlačidlo Nie je Krok cez, ale krok do. Oznámenia, zrazu okenné zmeny zvýraznite prvé riadok kódu v swapu. To je linka 21. A teraz, čo je druh funky je to, keď sa pozriete sem, ako sa očakávalo, čiarka b je 1 a 2, v danom poradí. Prečo je temp 32767? Pripomínajúc, že ​​teplota, podobne ako prázdny šálku pred chvíľou, Tu je deklarovaná na riadku 21. Prečo 32,000- Chcem povedať, prečo je to len nejaký divný hodnota? Jo? Divákov: To nie je inicializovaný. DAVID J. Malan: Je to nebol inicializovaný. Takže náš počítač vždy má fyzickej pamäte. To má vždy fyzickej pamäte RAM. A je tu vždy Zero a jeden je tam, že jo? Vzhľadom k tomu, že sme pomocou nášho počítač po celý deň, používate CS50 IDE alebo servery po celý deň. Tak, že RAM buď má nejaké nuly, alebo niekto je alebo niektoré nuly a jednotky. Bez ohľadu na to, či je alebo nie, že ich máte používať. Nemôžete len tak prázdny priestory, kde chcete bitov. Sú to buď nuly a jednotky. Tak to dopadá, že teplota, pretože sme nie je inicializovaná to ešte, máme tie 32 bitov, ale som nie bol inicializovaný na akejkoľvek známej hodnoty. Takže všetko, čo boli najviac naposledy použitej for-- tých 32 bits-- sme len vidieť artefakty niektorých predchádzajúce použitie týchto osobitných 32 bitov. Akonáhle som kliknite na tlačidlo Krok cez hoci, uf, temp dostane hodnotu 1. A ak by som to znova, a je Chystáte sa mať hodnotu 2 a potom b sa chystá mať hodnotu 1. A tak to, čo je teraz pekná na tento bod v príbehu je to, že je debugger mi ukazoval, super pomaly v mojom vlastnom tempom, aké stav swapu je. Nevšimnúť hore tu, oznámenia že zásobník volania skutočne má dve vrstvy na to. Teraz sa ten, ktorý je označený ako Swap, keď som kliknite na hlavné miesto, Všimnite si, ako miestni premenné zmeniť preto, že autor môže len hop okolo a ísť do akéhokoľvek iného rozsahu. Takže aj keď to robíme toto všetko pracovať a správne vymieňať A a B, keď pôjdem tam a späť medzi Swap kde a je 2 a b je 1 a Main, bol hlavný bol ovplyvnený vôbec? Nie. Takže to, čo je tu stánok s jedlom? No, to ukáže, že kedykoľvek volanie funkcie, ako Swap, a odovzdať ju argumenty, čo budete prechádzať k funkcii Swap V tomto prípade je kópia z týchto argumentov. Takže v prípade, x a y sú každý v tomto poradí 32 bitov, čo Swap je stále je dva nové miestne premenné, alebo argumenty, volal a B- ale tie sú ľubovoľné names-- ale vzor núl a tie vo vnútri A a B sú zoradili že je totožný s x a y ale oni nie sú to isté ako x a y. Je to ako keby Main má na svojom kúsku papier číslo 1 a 2 pre x a y, a potom, keď to ruky, ktoré kus papiera Swap, Swap veľmi rýchlo dostane jeho vlastné pero, zapíše 1 a 2 na vlastnom liste papiera, ruky späť pôvodný XY Hlavné a potom robí jeho vlastný tá vec s a a b. A toto je teraz mimoriadne dôležité, pretože to má netriviálne dôsledky pre skutočne písanie správny kód pretože to by sa zdalo, že nemôžeme vymeniť dve premenné. Napísal som správnu funkciu Zameniť. Vytvorili sme to s Lauren as správna funkcia swapu v skutočnosti, ale zrejme nič z toho záležitosti, ak nemôžete vlastne zameniť dve hodnoty trvalo. Takže potrebujeme iný spôsob sa skutočne dostať na to, a musíme byť schopní tento problém skutočne vyriešiť. A ukazuje out-- a my prídeme späť do tohto konkrétneho obrázku Pred long-- to je jedným zo spôsobov, môžete čerpať pamäte počítača. Je to len obdĺžnik. Mohol by si ho nakresliť akýkoľvek rad spôsobov, ale je to vhodné nakresliť to ako obdĺžnik z nasledujúceho dôvodu. Chystáme sa začať dnes a za hovorí o tzv zásobníka. A stack je len kus z RAM-- kus memory-- že funkcie majú prístup , Keď sa im hovorí. A tak sa ukáže, že na na samé dno tohto zásobníka je miesto, kde všetky hlavné je lokálnych premenných a org C a org V a všetky tie veci sa chystáte ísť v predvolenom nastavení. A ak Main volá nejakú inú funkciu, ako Swap, dobre, Swap sa chystá získať ďalšie Vrstva pamäte až nad ňou. A tak len aby vám rýchle zbežnú obrázok o tom, či som ísť cez here-- a dovoľte mi, aby som zrkadliť to na nad hlavou as well-- čo sa skutočne mám, ak sa staráme len o Spodná časť obrázka pre túto chvíľu, je, že keď som spustení programu a Main sa zavolá, Hlavné je daná kus RAM v mojom počítači, ktorý je v spodnej časti tejto takzvanej zásobníka. A ja budem kresliť zámerne ako štvorec. Takže je to ako 32 bitov alebo štyri byty. A ak je táto hlavná funkcia má premennú s názvom x s hodnotou 1 a to má premennú s názvom y s hodnotou 2, to je ako pri tento plátok pamäti Hlavný bol daný prevádzkovými Systém a rozdelí to tak, aby prvá miestna premenná ide tu, druhá ide tu, a to je všetko. Keď Hlavné volá swap, Swap získa svoju vlastnú krajec pamäte že budeme čerpať takhle z operačného systému, a bude to mať svoje vlastné lokálne premenné na báze Na našej implementácia skôr s lokálnymi premennými a b, ktoré spočiatku získať hodnoty 1 a 2. Ale potom, akonáhle swap kód vykoná, a Lauren vlastne swapov EÚ a mlieko, čo sa deje? No, to 2 sa stáva 1, túto 1 sa stáva 2, a mimochodom, tam je teplota premenná, ktorá je bytia použité, že celú tú dobu, že nakoniec zmizne. Ale to nezáleží na tom, koľko práce robíte v tomto riadku of-- v tejto pamäti, x a y sú úplne nedotknuté. Takže potrebujeme nejaký spôsob, ako dať Swap a funkcie ako to tajný prístup, ak chcete, aby Funkcie jako-- do pamäti ako x a y. Takže poďme sa pozrieť na príklad, ktorá pomáha nám vidieť presne to, čo je to deje na celom tomto období. Chystám sa pokračovať a otvoriť si porovnajte Zero. A ja idem zavrieť naše debugger, idem zatvorte túto desivé vyzerajúce správu spravodlivý hovorí, počkaj, ste v stredu ladenie. Chystám sa tu schovať túto záložku jednoducho sa vrátiť k jednoduchosti. Takže nebojte sa, ak je zabitý GDB. To jednoducho znamená, že program má bolo skončiť, zámerne v tomto prípade, mnou. A teraz si porovnajte Zero to robí. Som pomocou CS50 Knižnica v štandardnom I / O. Mám ten prvý hlavnú funkciu hovorí, niečo povedať, a dostane reťazec. Potom hovorí, že znovu a dostane ďalší reťazec. A všimnite si, že tieto dva reťazce sa nazývajú S a T, v danom poradí. A teraz tento program, Porovnať Zero, jeho účel v živote, to má sa mi povedať, som zadajte to isté? A tak som sa vraciam do týždňa jednu. Ja používam svoj rovný rovného operátor ktorá je prevádzkovateľom kvalita. Nie operátor priradenia, operátor rovnosti. Ja som len porovnaním s a t. Takže poďme skutočne ísť do toho a to urobiť. A budem pokračovať a robiť si porovnajte Zero. Budem robiť ./comparezero. A ja idem vpred a povedať niečo ako, poďme robiť mamu malými písmenami a ako sa o matke veľkými písmenami. A samozrejme som písať rôzne veci. Dobre. To je to, aby sa dalo očakávať. Poďme ho spustiť znova. V oboch prípadoch robiť malé písmená, malé písmená. To vyzerá super totožný so mnou. Enter. OK. Možno je to len trochu divné, pretože to nepáčilo mojej gramatiku. Takže poďme urobiť kapitálu MOM, kapitál MOM, identické. Rozdielne veci. Tak prečo je to? No, čo sa vlastne bude Na pod pokrievku tu? Takže poďme sa cez Tu na chvíľku a zvážiť, čo GetString je v skutočnosti robí. Pri volaní getString, to je funkcia sme Sami písal a to nejako dostane sled charakterov od užívateľa. A predpokladajme, že prvý Tentokrát som zavolať getString, že mi dáva kus pamäte, ktorá vyzerá takto. A keď som napísal v malými m-o-m-- a to, čo ide po ňom? Len rýchly check zdravý rozum. Spätné lomítko nula. Vieme, že. A pripomenul, že sme hrali okolo Zamil menom a veľa ďalších mien keď Rob sa sem pozerá na to, čo sa deje v pamäti. Tak, že príbeh je to presne to isté. To je to, čo GetString sa vracia ku mne. A teraz, môj kód pred chvíľou uložený vrátená hodnota getString v premennej nazvaný s. A potom druhýkrát som volal to, to uložená v premennej s názvom t. Takže keď som ísť sem, potrebujem kresliť tejto miestnej proměnná-- a ja všeobecne ísť do kresliť reťazec ako jenom-- my budeme hovoria S- ako malé námestie tu. A teraz, ako sa mama somehow-- ísť dovnútra tejto premennej s? No, musíme sa vrátiť späť na prvých princípov tu. Čo je to vlastne GetString vracia? Tak to dopadá, že M-O-M backslash nula, a akýkoľvek počet ostatných reťazcov v pamäti, ako je Zamil a Rob alebo Andy, alebo akékoľvek iné, sú samozrejme v našom RAM počítača alebo pamäte. A vaše RAM má jako-- máte koncert pamäte RAM, dva koncerty RAM, alebo miliarda alebo dve miliardy bajtov, alebo možno ešte v týchto dňoch. Takže poďme sa predpokladať, pre dnešné účely, že nezáleží na tom, ako sme sa počítať je, ale môžeme počítať každý z tých miliárd, alebo dve miliardy alebo štyri miliardy bajtov. A nech to len povedať, že svojvoľne toto je prvé sústo, druhým skus, Tretí, štvrtý. Ja zámerne nepoužívajú nula dnes ale vrátime k tomu. Takže inými slovami, či sa jedná o vôbec prvýkrát som pomocou programu, Ja som len na to, šťastie a prvý uhryznutie je v jednom mieste potom dve potom tri ako štyri. A keď som si kreslenie, číslo schránky dvoch miliárd by cesta sem. Tak čo si myslíš, a potom, GetString vlastne vracia? Nie je to vracia M-O-M spätného lomítka zero per sa, pretože to jasne sa nezmestí do poľa, ktoré som natiahnutý. Takže čo iné by mohlo getString vlastne sa vrátia všetky tieto týždne? Odpoveď je na board niekde tu. Môžete nezmestí M-O-M spätné lomítko nula, Takže to, čo by mohlo mať zmysel miesto? Ak by ste mali byť super šikovný, uvedenie na tzv inžinierstva klobúk, čo by ste mohli vrátiť? Čo je to najmenšie množstvo informácií ste mohli vrátiť, že by stále vám umožní nájsť M-O-M v pamäti? Jo? Divákov: One. DAVID J. Malan: One. A prečo jeden? Divákov: Vzhľadom na to, že by sa povedať, vám kam ísť [nepočuteľný]. DAVID J. Malan: Presne tak. Ja som len ísť na spiatočnú adresu reťazce, ktoré som dostala. Adresa v tomto Prípad je lokalita raz. Takže to, čo naozaj je uložený v S- a každý reťazec variabilný tak far-- práve bolo adresa tohto reťazca. Medzitým, keď som volať GetString druhýkrát a ja zadajte doslova rovnaký thing-- M-O-M s lowercase-- M-O-M a ďalšie spätné lomítko nula, a teraz možno môj program je beží už dlhšiu dobu, takže možno to je 10, to je miesto 11, to je 12, to je 13. Počítače používajúce iné pamäť z akéhokoľvek dôvodu. Čo teraz chodí do mojej druhej premenná v mojom program T? 10. Presne tak. A tak, keď sa pozrieme na Zdrojový kód tohto programu kde som proste snaží pre porovnanie dvoch hodnôt, Je to rovná rovná t, čo je zrejmá ľudská odpoveď? Práve preto, že nie 1 sa nerovná 10. A tak tu táboria príležitosť pre nás naozaj jednoducho ísť späť do znovu, najprv princípy a premýšľať o tom, dobre, čo sa deje pod kapotou? Hovorili sme o bity a bajty a pamäť, ale v skutočnosti je to užitočné pre pochopenie preto, že keď zavoláte getString, aj keď si myslíme, že to je vrátenie M-O-M alebo reťazec mama alebo Andy alebo Zamil alebo podobne, technicky je to len vracia adresu tohto kusu pamäti. Ale to je v poriadku. Vzhľadom k tomu, ako mám vedieť kde reťazec končí? Ak som len dal na začiatku? No, spätné lomítko nula, nie? Práve v lineárnom čase môžem vytlačiť s potlačou def M-O-M. A akonáhle vidím spätné lomítko nula, je mi jedno, kde som začal, Ja už viem, implicitne kde musím skončiť. A tak dnes označuje beginning-- a dovoľte mi, aby som to dramaticky, pretože sme prešiel veľa problémov na získať tieto tu školenie wheels-- tak dnes školiace kola začiatok zložiť a my odhaliť na least-- [APPLAUSE] To bolo dobre stojí za výlet k TARGET dnes ráno, áno? Takže now-- existuje, sa ukazuje out, žiadna taká vec ako reťazec. Reťazec neexistuje. Je to synonymum, že sme mali vnútri knižnice CS50. Od tej doby, budeme začať volať s a t nie sú reťazce, ale char hviezdy. A char hviezda my budeme srandista oddelene onedlho. Ale to znamená, že aj keď budeme pokračovať použitie getString teraz, technicky by som mal hovoriť char hviezda a char hviezdu. A ukázalo sa, čo to hviezdu bude pre označenie je niečo nazývaný ukazovateľ alebo adresa. A v skutočnosti, teaser za to, čo je pred nami Je to 20 sekúnd klip z nášho priateľ Nick Parlante na Stanforde kto, pred nejakou dobou, strávi smiešne množstvo času, ako najlepšie môžem povedať vo svojom kuchynské alebo jeho suteréne, Vďaka claymation zavádza do sveta charakter menoval Binky s kým budeme byť zavedené nabudúce na ukazovateli. Takže tu je náhľad na to, čo príde. [Videoprehrávanie] Hej, Binky. Zobudiť sa. Je čas na ukazovateľ zábavu. -Čo je to? Ďalšie informácie o ukazovatele? Oh, dobrota. [END Prehrávanie] DAVID J. Malan: A v takom prípade, Vás budeme vidieť v stredu. Dobre. Kto je tanec? No ták. Kto je tanec? Chceš, aby som si to začalo? Budem si to začalo. Wooo! LAUREN: Sladké fantázie Mojžiš.