David J. MALAN: Ez CS50 és ez az a hét elején négy. És, fiú, Volkswagen baj minden, mert a szoftver. Vessünk egy pillantást. [Videó lejátszás] -Cars, A legokosabb karakter A Fast and Furious filmeket. Ezen a héten a német autógyártó Volkswagen találta magát a közepén egy botrány potenciálisan bűnügyi arányok. -Volkswagen Üdítő milliárdok A bírságok, esetleges vádemelés annak vezetői, mint A cég bocsánatot kér A kötélzet 11 millió autó segítsen legyőzni kibocsátási vizsgálattal. -Certain Dízel modellek tervezték kifinomult szoftver hogy a használt információ, beleértve a pozíciója a kormánykerék és a jármű gyorsítsák hogy meghatározzák az autó alatt emissziós vizsgálat. E körülmények között a motor csökkentené a mérgező kibocsátást. De az autó manipulálták a bypass hogy amikor vezetik. Kibocsátás nőtt 10-40 szörös elfogadható EPA szinten. [Lejátszás vége] David J. MALAN: Akkor most vessünk egy pillantást ezt és nézd meg pontosan, hogy ez lehet vezetni és ez hogyan érintheti annyi autó, mint ez. Tehát a kezemben itt a sajtó engedje, hogy adott a EPA-- A Környezetvédelmi Protection Agency, amely az amerikai szabályozó ügynökség, amely kezeli a környezetvédelmi érdekeket, majd a tényleges Jogi nyilatkozat volt Levél a Volkswagen csak néhány nappal ezelőtt. Tehát az EPA ír, és közzéteszi most nyilvánosan, egy bonyolult szoftver algoritmus bizonyos Volkswagen gépjárművek érzékeli ha az autó alatt hivatalos kibocsátás vizsgálat és kiderül, a teljes kibocsátás vezérli a csak a vizsgálat alatt. A hatékonysága ezek a járművek szennyezés károsanyag-kibocsátást szabályozó eszközök nagyban alatt csökkent az összes szokásos vezetési helyzetekben. Ez azt eredményezi, autók, amelyek megfelelnek a szabványok a laboratóriumi vizsgálatok, vagy állomást, de a normál működés során bocsátanak nitrogén oxides-- vagy NOx-- akár 40-szer a standard. A szoftver által előállított Volkswagen egy idézet idézet vége, hatástalanító berendezés, által meghatározott Tiszta Levegő Törvény az USA-ban. Mennek tovább mondani, hogy Az EPA és egy másik ügynökség felfedték a hatástalanító berendezés szoftverek után független elemzés a kutatók a Nyugat Virginia Egyetemen. NOx szennyezés hozzájárul nitrogén-dioxid, a talajközeli ózon, és finom részecskékből áll. Expozíció ezen szennyezőanyagok már kapcsolódik széles körű súlyos egészségügyi hatások, beleértve a fokozott asztma támadások és más légúti betegségek súlyosak lehetnek ahhoz, küldeni az embereket a kórházba. Ózonnak és pornak is hozták összefüggésbe korai halála miatt légzési kapcsolódó vagy cardiovascularis hatásokat. Gyermekek, idősek, fogyatékkal már meglévő légúti betegség Különösen veszélyeztetettek a egészségügyi hatásai ezeknek a szennyező anyagoknak. Elég az, hogy azt mondják, ez elég komoly. És menjünk tovább olvasni csak még egy részlet aztán majd megnézzük A mögöttes következményei ennek keretében egy autó. Pontosabban, Volkswagen legyártani és beépíteni szoftver az úgynevezett elektronikus vezérlés module-- vagy ECM-- a ezek a járművek az érzékelt amikor a jármű volt, hogy vizsgáljuk megfelelés EPA kibocsátási előírásoknak. Alapján különböző bemenetek beleértve a helyzetben a kormánykerék, a jármű sebesség, időtartamát a motor működését, és a légköri nyomás, ezek a bemenetek pontosan lánctalpas paraméterek a szövetségi vizsgálati eljárás felhasználhatja kibocsátási vizsgálatot az EPA tanúsítás célra. Alatt EPA kibocsátási vizsgálat, A járművek ECM szoftver futott szoftver, amely előállított kompatibilis kibocsátás eredménye. Minden más időpontban, a gépjármű ECM szoftverek futott egy külön út kalibrációs ami csökkentette a hatékonyságát a az összes kibocsátást szabályozó rendszer, kifejezetten a szelektív katalitikus csökkentését NOx trap-- amely majd meglátjuk, egy pillanat. Ennek eredményeként a NOx-kibocsátás szintje faktorral emelkedett 10 és 40 alkalommal fölé EPA megfelelő szinten attól függően, hogy milyen típusú meghajtó ciklus. Szóval mi ez valójában azt jelenti, valamint a forráskódot a szoftver fut A Volkswagen már nem Még nyilvánosságra hozták, az, hogy hatékonyan, ez a egyenértékű valahol ott belül A Volkswagen kódot. Ha is tesztelik, és ha az autó észlel bizonyos környezeti tényezők mint a kormánykerék pozícióját, illetve a mozgás vagy annak hiányát az autó, vagy tetszőleges számú egyéb tényezők amelyek jelenleg feltételeztük hogy része legyen ez a képlet, egyszerűen kapcsolja be teljes kibocsátás szabályozására. Más szavakkal, elkezdenek kibocsátása kevesebb szennyező anyagok. Else, minden más helyzetben ha ez nem kimutatják, hogy az a laboratóriumban, csak nem. És így leegyszerűsítik ezt a több beton pszeudokódja valami ez tetszik. Ha a kerék fordul, de a kormánykerék nem, szuggesztív hogy az autó egyes fajta forgó henger de valamilyen raktár tesztelnek, akkor úgy viselkednek, mint a Az EPA azt szeretné, ha. Ellenkező esetben nem. Szóval vessünk egy pillantást egy rövid videót, amely vesz egy pillantást milyen következményei jelentős része ebbe a ténylegesen mechanikusan. [Videó lejátszás] -Last Péntek EPA bejelentette, hogy néhány Volkswagen Audi autók között 2009 és ebben az évben is a úgynevezett hatástalanító berendezés bejárható kibocsátás törvényi tervezték, hogy a levegő tiszta. De mit is jelent ez pontosan? Nos, a modern autók tucatjait Számítógépek bennük. És néhány ilyen számítógépek Segítségre működésének összehangolása A motor optimális teljesítményt, miközben ügyelve arra, hogy nincs túl sok szemetet jön ki a kipufogócső. Ők már ténylegesen dolgozik Így immár több évtizede. Alapvetően minden része egy modern autó motorja van egy érzékelő vagy vezérlő rajta, és ezek a számítógépek olvasott az adatok ezer másodpercenként kiigazításokat mint az arány a tüzelőanyag-levegő hogy folyik a hengerekbe. Ezek a csaló Volkswagen és az Audi modellek dízelek, és dízel még egy Nagyon fontos számítógépes ellenőrzött paramétereket, ami az összeget a nem égett üzemanyag folyik a kipufogó. Most, hogy rosszul hangzik. Nem hangzik, amit szeretne elégetlen üzemanyag megy a kipufogó. De abban az esetben egy dízel, van valami úgynevezett NOx-csapda, amely olyan eszköz, amely elnyeli és csapdák a nitrogén-oxidok amelyek szennyező anyag, amely különben megy a légkörbe. És a hatás, hogy a NOx-csapda bővítve elégetlen üzemanyag. Tehát gátlóberendezésnek a különleges program ezekben a számítógépek lehet, hogy néznek ki, mint az autó megfelel-kibocsátás szabványok akkor is, ha nem. Volkswagen volt egy problémával küzdött. A dízelmotorok voltak ismertek szerzés üzemanyag takarékos, de az NOx-csapda csak akkor működik jól ha több üzemanyagot használ. Így az autó érzékeli, Ezzel a hatástalanító berendezés, amikor kapok egy-kibocsátás vizsgálat, akkor több üzemanyagot használnak, hogy az NOx-csapda jól működik, kibocsátás jó lenne. De akkor kap az úton, a készülék kikapcsol, nem írunk kevesebb üzemanyag de te olyan, mint 40-szer több szennyező anyag kerül a légkörbe. De Hogy a fenébe Az autó ismerte fel, hogy tesztelnek kibocsátás betartását? Az EPA azt mondja, hogy ez egy bonyolult rendszer, amely ellenőrzi a dolgokat mint a kormánykerék, sebessége, milyen hosszú a motor volt, és még a légköri nyomás. Más szavakkal, nem volt egyáltalán nem ez volt véletlen mert a szoftver volt tervezték, nagyon óvatosan kimutatására hivatalos kibocsátás teszt. Ez elég komoly megtévesztés és ez Ezért Volkswagen van Ilyen komoly bajban van. Tény, hogy a vezérigazgató, Martin Winterkorn, csak lelépett. Tehát mi történik ezután? Nos, ha te vagy az egyik fél millió dízel Jettas, Beatles, Golfs, Passats, vagy Audi A3s végrehajtani, A jó hír az az, hogy az autó továbbra is biztonságos vezetésére. Nem kell, hogy tegye el amíg Volkswagen kiadja a visszahívás. De egy bizonyos ponton ők valószínűleg megy, hogy frissíteni a szoftvert az autóba. Amikor ez megtörténik, akkor lehet, hogy kevesebbszer mérföld per tank. Az ügyvédek már felkészül fel a csoportos perek így a tulajdonosok lehet, hogy kompenzálja valamikor a jövőben. De ez nem fog történni a közeljövőben. [Lejátszás vége] David J. MALAN: Tehát ez valóban felvet Érdekes nagyobb képet kérdést mint a bizalom. Jobb? Mindannyiunk iPhone vagy az androidok, vagy valamit a zsebünkben legvalószínűbb ezekben a napokban, vagy laptopok ölünkben, amelyek futó szoftver készül az Apple és a Microsoft és csokor más cégek. De honnan tudjuk, hogy mit ezek a szoftverek termékek csinálnak valójában mik ezek a cégek szerint csinálnak? Például, aki a azt mondják, hogy minden alkalommal, amikor hogy egy telefonhívás az iPhone vagy Android telefon vagy hasonló, hogy ez a telefonszám is, nem feltöltés alatt néhány cég szerver mert néhány program, amit írásos, hogy ez az operációs rendszer maga, mint iOS vagy Android, vagy azért, mert már letöltött Egyes harmadik féltől származó alkalmazás hogy valahogy figyel hogy mindent, amit gépel vagy mindent, amit valójában mondani. Honnan tudod, hogy ha srácok fut csenget vagy Győződjön meg lefordítani a saját szoftvert CS50, hogyan ugye, hogy CS50 saját alkalmazottai, útján a CS50 könyvtár, nem naplózás minden húr, amit valaha kaptál vagy minden ízében, amit valaha kaptál? Nos, akkor biztos, hogy A forráskód valamit mint a CS50 könyvtárba, tudta nézd meg a forráskódot A Linux operációs rendszer futó CS50 IDE. De egy csodálatos bemutató került vissza 1984-ben részesült a Turing-díj egy nagyon híres számítógépes tudós ismert as-- elemzi Ken Thompson, aki megkapta a Turing-díjat, amely egyfajta számítógép tudomány Nobel-díj, ha úgy tetszik, A munkáját egy operációs rendszert, a Unix, amely nagyon hasonló a szellem mire használjuk, amely a Linux. És a kérdést tette fel, az ő elfogadó beszédében lényegében megállapításáról szóló keret Évek óta vita mintegy bizalom és a biztonság, az a következő. Milyen mértékben kellene egy bizalmi egy nyilatkozat arról, hogy a program-- egy darab A software-- mentes trójai? Talán ennél is fontosabb, hogy bízik Az ember, aki írta a szoftvert. És valóban, most már kapcsolódik a vita, hogy ő adta elfogadásakor ezt a díjat A '80 -as években a CS50 honlapján alatt Előadások oldal a mai. Mert mit fogsz látni az, hogy ő valóban ad egy viszonylag egyszerű példa arra, hogy még egy fordító, mint csenget, vagy bármi fordítóprogramok mások használják már, mi van, ha beépül a fordító is magunkat használ egy kicsit, ha feltétellel, hogy lényegében azt mondja, ha azt veszi észre, hogy ezt a kódot használ A getString funkció vagy a GetInt funkciót, megy előre, és helyezze egy hátsó ajtó, vagy egy trójai úgy, hogy a program Most van néhány nullát és is, hogy nem valami rosszindulatú. Fakitermelés összes billentyűleütéseket, feltöltésével, hogy az adatok néhány szerver, vagy tényleg semmit. És mi Ken Thompson megy itt a vita annak bemutatása, hogy még ha van hozzáférése a forrás kódot a fordító, hogy rosszindulatúan lehet ezt, ez nem számít, mert itt van ez a tyúk és a tojás valóságban a múltban sok évekhez képest, fordítóprogramok összeállítására használják magukat. Más szóval, vissza, amikor valaki volt, hogy írásos első fordító. És azt követően, bármikor, hogy már frissített egy fordító megváltoztatásával a forráskódja, új funkciók hozzáadásával újrafordítása az emberek, mint mi használható, jól, ők a régi változata a fordító összeállítani az új változata a fordító. És ha megnézed a vita, hogy ő adta, látni fogod, hogy azért, mert Az, hogy a körkörösség akkor valójában a hibákat, illetve Trójai beágyazott szoftverek mi használ. És még ha megnézi az forráskódját e programok ez talán nem is nyilvánvaló, mert a szemfényvesztés valójában régebbi változata fordító, amely azóta már intravénás fenyegetés a mi szoftvert. Amely csak mondani, mi Tényleg nem lehet és nem bizalmat szoftver fut a laptopok vagy telefonoknak, illetve a helyek számát. És valóban, később ebben a félévben, amikor kezdünk beszélni web programozás és valóban kezdjék építeni webes alkalmazások magunkat, fogunk beszélni ezekről fenyegetések és mások. Nos, lehet, hogy vajon, és észrevette, hogy volt egy apró kis Darth Vader a klipeket, hogy A Verge-ben jelenik meg ott mintegy Volkswagen. Ha még soha nem láttam, hittük kell világosítani a hangulat, mert ez minden Nagyon nyomasztó és ijesztő. Megyek nézz vissza Super Bowl 2011 amikor egy kereskedelmi által Volkswagen-- és ez a Szinte teszi őket szerethető again-- sugározta először a tévében. Ez a 60 másodperces klip hogy azt hiszem, élvezni fogja. [Videó lejátszás] [ZENE - témát "Star Wars"] [Kutya ugat] [Autó elindul] [Lejátszás vége] David J. MALAN: Igen. Én csak megnézni. Hogy az autó a listán a jogsértések. Minden rendben. Tehát nézzük meg néhány pszeudókód egy perce. És itt van egy nagyobb részlet a pszeudokódja kód Láttuk, néhányszor eddig. És vegyünk ez egy lehetőség Most, hogy vezessenek be egy új programozási technikát, hogy megcsináltuk lásd algoritmikusan A múlt héten, amikor megnéztük merge sort. De nézzük intézményesíteni azt, és hogyan talán használni a tényleges kódot, majd fogunk használni ezt technika az úton leginkább valószínű, hogy megoldja bizonyos egyéb problémákat. Szóval ez volt az egyik első programok is valaha írtam, bár pszeudokódja kódot. És mi ez a program tette számunkra, hogy ezt természetesen az volt, hogy Mike Smith a telefonkönyvben. És észre különösen vonalak nyolc és 11, amely már ez Go To nyilatkozatot. És valóban, bizonyos nyelvek, C közöttük, valóban van egy nyilatkozat arról, hogy a szó szoros értelmében megy, hogy lehetővé teszi, hogy Ugrás egy adott vonalon. Ez általában elítélik, mert ez is nagyon könnyen visszaélnek és elkezdhetjük ugrott meg programot az egész hely, szemben hogy az a fajta logika és a vezérlési folyam hogy már eddig használt csak hurkok és körülmények és hasonlók. De tudjuk egyszerűsíteni ez az algoritmus pszeudokód kódot a következőképpen. Ahelyett, hogy ezen iteratív vagy hurok megközelítése ahol folyamatosan megy vissza, és vissza, és vissza sorban három, miért nem csak egyfajta punt és több Általában azt mondják, a sorban hét és 10, csak cseréld a két pár vonalak, else if Smith korábbi, A könyv fogunk keresni Mike a bal fele a könyv. Else if Smith később a könyv, keressen Mike a jobb fele a könyv. És észre már a körkörösség. Jobb? Keresem Mike A telefonkönyv majd Én végül hit talán sorban hét, vagy talán 10-es vonal és az én tanításomat, hogy magam is kereső Mike felében a telefonkönyvben. Nos, hogyan tudom keresni Mike? Én vagyok a közepén keres Mike, miért Ön a fajta küldött nekem egy kört? De ez rendben van, mert mi történik, hogy mekkora a probléma, ahogy írva a sorban a 7 és 10? Mi nem csak azt mondom keresés Mike, keressen Mike. Mi pontosan azt mondja, amit? Keresés neki a bal fele a jobb fél, amely hatékonyan fele a méret a problémát. Tehát nem baj, hogy mi vagyunk a fajta attól, hogy e körkörösség ez ördögi kör mert legalább vagyunk így a probléma kisebb és kisebb. És végül fogunk jutni hogy az úgynevezett bázis esetben, ahol mi csak egy oldal left-- mint a mi önkéntes múlt héten did-- volt egy oldalon balra, majd mi nem kell tovább keresni a Mike Smith mert ő sem az oldalon vagy ő nem. Tehát hogyan tudjuk megvalósítani ezt az ötletet, ez a fajta körkörösségét tényleges kódot? Nos, most kihasználhatják a technika, ami általában ismert rekurzív. És láttuk ezt a pszeudokódja a merge sort a múlt héten. Emlékezzünk vissza, hogy ez volt az pszeudokódja a merge sort. Ez vitathatatlanul még egyszerűbb, mint buborék, vagy szelekciós vagy beillesztés sort Csak szempontjából az egyszerűség amellyel ki tudod fejezni. De ez azért van, mert mi vagyunk a fajta körkörösen mondván, keresni valamit keresve újra. De mi keressük akár A bal fele, vagy a jobb fele majd végül vagyunk egyesülő ebben az esetben. De itt is, a E két sort sor, kerültünk ismét ezt ötlete rekurzió. És konkrétan mit jelent ez, keretében egy algoritmus, az, hogy egy algoritmus rekurzív ha a felhasznált, illetve nevezi magát. Vagy szempontjából C, egy funkció recursive-- olyan függvény is ize rekurzív ha az ize, valahol a forráskódja, meghívja a függvényt ize magát. És ez rossz, ha minden ize valaha csinál ez nevezi magát, újra és újra. Nem baj, ha az ize végül megáll, akárcsak merge sort, mondván, várj egy percet, Ha ez a probléma szuper kicsi, például, vagy én találtam, akit én vagyok keres, csak vissza. Ne rekurzív, nem ciklikusan nevezném magam újra. És ezért vessünk egy pillantást hogyan lehet ezt ténylegesen dolgoznak. Így fogok menni előre, és nyitott akár két forráskód példák itt. Amelyek közül az egyik az úgynevezett szigma 0. És ez egyáltalán nem rekurzív, de nézzük Egy pillantás, mi ez a program teszi. Már megfosztották az összes észrevételeit, de minden A forráskód CS50 által website megjegyzéseket, ha szeretnénk olvasni rajta újra később. És lássunk egy pár A legtöbb ellenőrzési itt. Tehát a tetején ezt a kódot, van többek között CS50.h. Mire szolgál ez? Miért van itt? Indokolt laikus szempontból. Mit csinal? Igen. Közönség: Hogy GetInt funkció. David J. MALAN: Szóval, hogy A GetInt funkció. Mivel belsejében ez a fájlt, CS50.h, amely majd meglátjuk nemsokára itt tekintve forráskód, van egy csomó funkciók declared-- GetInt, getString, és egy csomó others-- és hacsak mi valójában, hogy include sor, a fordító nem csenget tudni fogja, hogy létezik. És ugyanez vonatkozik vonalon Két ahol int határozza printf, ami egy függvény tartjuk segítségével egy kicsit. Most, soros, négyhengeres úgy tűnik, egy kicsit funky mert ez csak egy bélés. Van rajta egy pontosvessző, nem göndör nadrágtartó, nincs kód belsejébe. De mit nevezünk ezt a dolgot, de hetekkel? Igen. Tehát egy prototípus. És miért van egy prototípus, amely úgy tűnik hogy egy kicsit redundáns általában azért szoktunk lásd a funkciót, később a fájlt, ugye? Szóval, miért van have-- te csak vakarja a fejét, de én viszem. Igen. Közönség: [hallható] működését, miután a fő. David J. MALAN: Pontosan. Annak érdekében, hogy a fordító tudja, végül meghatározni, illetve annak végrehajtása hogy működését, miután fő, feltehetően. Tehát csenget, és a legtöbb szerkesztők fajta hülye és akkor csak azt tudják, mit mond nekik. És ha szeretné használni olyan függvény szigma, jobb, ha tanítani a fordító hogy létezik előre. Most, fő magát, még bár ez egy csomó sor, nagyon ismerős remélhetőleg már. Van rajta egy do while ciklus amelynek célja az életben Itt nyilvánvalóan az, hogy egy pozitív egész szám, a felhasználó. És csak folyamatosan zaklatnak vele vagy vele, amíg ők együttműködnek. Aztán a sorban 16 van Érdekes hívást. IntAnswer. Mely a bal oldalán ad nekem egy Int amely store-- nevű Answer-- amely a fog tárolni, úgy tűnik, A visszatérési értéke szigma. Szóval szigma csak egy tetszőleges, de értelmes nevet hogy megadtam egy funkciót amelynek célja az életben az, hogy egy argument-- fogjuk nevezni N ezen case-- és csak azért, hogy az összeg, amely számos plusz minden pozitív szám, ami kisebb, mint azt. Tehát, ha átadom a 2-es szám a szigma, azt akarom, hogy adjunk hozzá 2 plusz 1 plusz 0-- nem 0-- úgy, hogy ad nekem 3. Ha elmegyek 3 szigma, azt akarom, hogy Van 3 plusz 2 plusz 1, ami nekem 6. És így tovább. Tehát csak összeadódik az összes szám kisebb vagy egyenlő, mint azt. Most, itt lent Megyek kinyomtatni a választ. Tehát, mint egy gyors józanság csekket, hadd hogy a szigma 0-- dot perjel szigma 0-- és hadd írja be 2. És én valóban kap 3. Hadd írja 3. Én ugyan kap 6. És ha valaki meg tudja csinálni a matek gyorsan, ha én 50 mit fogok kapni? Közönség: [hallható]. David J. MALAN: Hát, nem. De 1275 ami elég közel. Tehát ez az eredménye csinál 50 plusz 49 plusz 48 plusz 47 plusz 46 egészen 1. Szóval ez minden szigma csinál. De lássuk, hogyan voltunk végre most. Szóval itt lent van a funkciót is. És ez nem úgy tűnik, hogy semmi köze a rekurzió még. Sőt, mi használ egy régi iskola technikát. Én iniciali nevű változó összeget nullára, aztán van egy foreloop itt, és én nyilvánító Int nevezett Én, a beállítás, egyenlő 1-- bár tudtam meg azt egyenlő nulla, de mivel én csinálom kívül, kit érdekel, ha ez nulla vagy egy. Ez lesz semmilyen hatással nincs. Úgyhogy ismételve mindaddig, amíg azt az kevesebb vagy egyenlő, mint m, ami az az érv, hogy fogadtak el. És akkor én csak tartani megnő az I. és betekintést A ciklus minden csinálok csinál összege plusz egyenlő I. És ez szándékos. Én nem akarom, ebben a esetében, mint az összeg plusz plusz. Azt akarom, hogy valóban hozzá A jelenlegi értéke I amely megtartja egyre nagyobb és nagyobb és nagyobb a göngyölített. És akkor térek vissza az összeget. És így választ kap az érték összege. És aztán nyomtassa ki. Tehát van egy lehetőség van, de, hogy milyen egyszerűsítése ezt a kódot fogalmilag és az a fajta kifújja az tekintenek az emberek a egyszerűség jóllehet eltart egy ideig, hogy rendezni A értékelem, hogy ez miért erős ezekben a kis példát. Itt szigma one-- így a második változata ezt a kódot. Minden fel tetején azonos, így hogy ugyanazt a történetet vonatkozik, mint korábban. De most nézzük meg a végrehajtása Sigma, amely Már szűkítették le, hogy csak ezek a lines-- négy sornyi kódot, tényleg, plusz néhány kapcsoszárójele és fehér térben. De mit csinálok? Ha m kisebb, vagy egyenlő, mint nulla, azt kell, hogy milyen kezelni hogy szuper egyszerű eset. És ha át nekem nulla vagy semmit negatívak, ami csak furcsa, Csak megyek, hogy önkényesen de következetesen visszatér nulla. Nem akarom ezt a dolgot, hogy bejutni néhány furcsa végtelen hurok miatt negatív értéket. Szóval én csak azt mondom, ha adsz nekem nulla vagy kevesebb, én visszatér nulla. De ez jó, mert ez hogy egyetlen oldalon a telefonkönyv ami maradt. Én leharapta egy nagyon konkrét probléma és nem keresi valamit rekurzív. De a 31. sor, mi tudom úgy tűnik, hogy csinál? A zárójelek csak tartani dolgokat, remélhetőleg, egy kicsit világosabb. De minden, amit csinálok, az én vagyok visszatérő m-- bármi akkor viszont me-- plusz értéke m-- sajnálom, plusz az érték a szigma m mínusz 1. Tehát mit jelent ez? Ha adsz nekem a 3-as szám a bemenet, A válasz akarok végső soron 6, mert 3 plusz 2 plusz 1 ad nekem 6. De hogyan tudom gondolni hogy ez a kód fut? Az első alkalommal hívom szigma és átadom a értéke 3, ez, mintha azt mondanánk egy darab Papír, itt a 3- és én már túlesett a Sigma. 3 nyilvánvalóan nem kevesebb, mint 0, így Az IF feltétel nem vonatkozik. A más. Szóval mit tegyek? Azt akarom, hogy visszatérjen m, ami 3, plusz szigma m mínusz 1. Szóval hadd nyomon követni ezt. Megyek, hogy ezt darab papír lefelé. És milyen értéket, hogy tiszta, megyek át a Sigma ezen a ponton a történet? Mi a szám? 2, ugye? 3 mínusz 1 jelentése 2. Szóval csak kell egy kis papírdarabot itt. Tehát most Sigma kezd megint hívott. És én szándékosan fel ezt le, mert olyan, mint megállva hogy változata a történetnek mert most én vagyok fókuszált A jel m mínusz 1. Tehát m volt 3, m mínusz 1 jelentése 2. Tehát itt van 2, hogy én már elmúlt. 2 nyilvánvalóan nem kevesebb, mint 0 úgy, hogy az esetben nem alkalmazható. Else visszatérek m, ami ebben a dolog, plusz Sigma milyen értékben? Tehát, ha a szigma a 1-- mert m Most 2 SO 2 mínusz 1 1. Szóval most már csak az 1 értéket. Én halad csak a számot 1 A funkció sigma-- vagy magam here-- így 1 nyilvánvalóan nem nullánál kisebb, még nem alkalmazható. Else return 1 plusz Sigma, mi? 0. Szóval hadd emlékszem. Hozom vissza később. Most fogok menni előre, és jot le a 0 szám, mert ez az, érvem vagy paramétert. Én át száma 0 és végül ez a folyamat csak ismételni magam hirdetés nauseum nem szűnik meg azáltal, hogy mi tudom azonnal csinálni, ha látom ezt a 0? Visszatérek nulla. Tehát most kell visszaforgatni a történetet. Ha én most megy vissza az időben, mi volt a legutóbbi dolog Én, ha szó szerint felhúzás a videót? Megyek, hogy vegye fel a legutóbbi 1 és ez ad nekem 1 plusz 0 1 lehet. Ha megtartom felhúzás a történet, hogy fog adni nekem 2 plusz ez fut az értéket, amely 1. Szóval ez 3. És akkor fogok tartani felhúzás. Amikor először letette száma 3-- így 3 plusz 3 ad nekem 6. És most, ha már Visszatekertem A videó eddig a pontig, ez volt a nagyon első kérdés, amit feltett. Amikor eltelt 3, ami a szigma 3? Ez csakugyan 6, összege Mindezen darab papír. Tehát ha ez egy kis idő, hogy tekerje elméd köré, ez rendben van. De úgy, hogy ez egy little-- meg nagyon tudatos, hogy én halmozott Ezeket a számokat egymás tetejére. Ez olyan, mintha egy memory-- rekord idő, mint egy súroló egy videó, hogy én valóban visszatekerés az. És megyünk, hogy jöjjön vissza hogy a metafora csak egy kicsit. De először, kiderül, hogy van Sok geekek és vicces emberek, Azt hiszem, a Google. Vajon valaki, aki nagyon jó Googling elme jön egy pillanatra, és segítsen nekem keresni valamit? Nagyon, nagyon alacsony kulcs. Valaki, aki soha nem felér előtt, talán. OKÉ. Igen? Gyerünk. Gyere le. Mi a neved? SAM: Sam. David J. MALAN: Sam, gyere le. Ez megegyezik. Örvendek. Hé. Gyere át. Tehát minden, amit meg kell tennie, ha akkor, Sam, itt a Google. Tud keressük a rekurzió? Ne rontsd el. És most let's-- igen. OK Kattintson ezt. Jobb kattintson ezt. Ahh, értem. Nem? OKÉ. Tehát lássuk egy pár mások. Nem annyira a kapcsolódó tudományosan itt, de akkor valaha keresett a Google-anagramma? SAM: Nem David J. MALAN: OK. Keresés anagramma helyett rekurziót. Mit szólnál félrecsúszott. Előfordult már keresett ferdén? Nos, ez az ember egy kicsit nehéz lásd de remélhetőleg everything's-- OK. Csak te és én élvezem. OKÉ. Így végül ez one's-- ez egy kicsit félrecsúszott. Most nem egy hordó roll. Csodálatos. Minden rendben. Hatalmas köszönet Sam. Tessék. Kösz. Szóval, mi folyik itt minden Ezen buta példa? Szóval tényleg, a motorháztető alatt a A Google több millió sornyi kódot láthatóan néhány buta IF mellett, amelyek lényegében ellenőrzi, ha a felhasználó rendelkezik gépelt ezt a kifejezést, tenni valamit, hogy talán volt nemtriviális időt hogy végre csak azért, hogy mulatságos ezen a módon. De ez minden, ez csapódik le a motorháztető alatt. De, természetesen, rekurzió több a geekier Például azok között speciális trükkök. És biztosan van más odakinn valamint, hogy talán még nem is felfedezett csak még. Szóval vessünk egy pillantást, vagy fontolja Most a következő programot, és minden bizonnyal megragadni minden Ezeknek a kiutat. Megyek megy előre, és nyit egy program, ami megpróbálom cserélni két érték. De mielőtt megyünk oda, csináljuk ezt. Lehet kapunk még egy önkéntes, azt hiszem? Szeretné, hogy önként? Nem? Gyere fel. Gyere fel. Minden rendben. Szóval a neved, mi? LAUREN: Lauren. David J. MALAN: Lauren. Jöjjön fel, Lauren. Szóval Lauren folyamatban van támadott itt a következők szerint. Örvendek. Szóval Lauren itt van előtte A lány két üres pohár. És van néhány narancs juice és egy kis tej és fogunk menni előre, és tegye a következőket. Mi csak megy, hogy betöltse ezt. Néhány uncia tej ide, és hadd tölteni egy kis narancslevet ide. És előtt minden Ezek a közönség tagjai, cserélni a két érték ilyen poharak. Tegye a narancslé a csésze tej és a tejet a narancslé kupát. Ön hogyan tudjuk ezt, ha voltak otthon és volt hozzáférése a többi kelléket? LAUREN: Tedd egy csésze. David J. MALAN: OK. Szóval van egy ideiglenes változót, ha mi megtesszük. És megy előre, és most végre Ugyanebben csere eljárást. Szóval, jó. Mi már HL be az ideiglenes változó, tejet a HL változó, és most az ideiglenes változó a tejbe változó. OKÉ. Szóval nagyon jól sikerült eddig. Így kiderül out-- állapította meg, hogy elgondolkodott egy pillanatra. Itt, hogy csak a geek meg egy kicsit, ez lenne a megfelelő C-kód hogy most telepített. Volt két bemenet, az A és B, mind a amit csak mondom az egyszerűség int években. És itt megjegyezni, ha azt akarom, hogy a csere a két változó értékét, a és b, hogy igenis szükség van egy közvetítő, a ideiglenes változó, átmeneti csésze, amelybe a öntsük a mért értékek egyike úgy, hogy van egy helykitöltő érte. De aztán a kódot pontosan Lauren itt végre. Most, csak azért, hogy a kicsit őrültebb, kiderül, hogy meg tudod csinálni ezt anélkül, egy átmeneti változó. Ehhez megfelelő, bár, megyünk hogy csalni kémiát. Van egy kis plusz csésze itt. Tehát a legközelebbi dolog, hogy úgy néz ki, mint a tej és a víz perhaps-- vagy tejet és OJ-- van van néhány víz, úgyhogy majd töltse ezt fel néhány uncia tiszta víz. Ez talán túl sokat. Igen. Ez kétségkívül túl sok. Várj egy percet. És most van az olaj, ami, ha jól emlékszem Middle School kémia osztályban, remélhetőleg ez nem keveredik a vízzel. De ez a fajta fajta úgy néz ki, mint a tej és HL. Tehát most, használata nélkül egy átmeneti változó, lehet cserélni a két értéket? Tehát olajok bemegy a víz csésze, víz bemegy az olaj kupát. LAUREN: Nincs más kupák? David J. MALAN: Nincs más kupa. És én már ténylegesen nem Teszteltük ezt megelőzően az idén úgyhogy nem tudom, hogy ez lesz ténylegesen dolgoznak kémiailag. Ennek nem így kellett volna történnie. Működik? Minden rendben. Tehát elválasztó? Jó. Most mi van, hogy a vizet a többi csésze. Okosabb kémia koncentrátorokat lehetett Valószínűleg ezt jobban, mint én. LAUREN: a víz az alján. David J. MALAN: A water-- volt mi kulcsfontosságú az utolsó alkalom, hogy ezt tette. Meg kell csinálni a megfelelő sorrendben. Igen. Rendben. Tehát most van két csésze olaj. OKÉ. Rendben. De kémiailag ha ez működött, mint én-- LAUREN: Ez a víz. David J. MALAN: ez leginkább a víz. Minden rendben. De ez még mindig ugyanazt a poharat, mint korábban. Így öntsük it-- próbálja meg ott. OKÉ. Ez egy jó hasznát órakeret ma. OKÉ. Tehát most we-- szép. Fajta. Minden rendben. Szóval nagyon jó. Köszönjük, hogy Lauren. Nagyon jól sikerült. Tehát csak robbantani a fejében, és ez talán valami játszani, ha úgy tetszik a CS50 ID, akkor valójában csere két változó használata nélkül egy ideiglenes egész szám. És ez a megfelelő C-kódot. És ha visszaemlékeztek a múlt Szerda, bevezettük, ha röviden is, néhány új szereplők C. És nem senkit felidézni, amit a kis sárgarépa szimbólum, az a kis háromszög szimbólumot a billentyűzet jelent? Milyen bitenkénti üzemben? Közönség: EXOR. David J. MALAN: EXOR. Exkluzív Or. Tehát ha azt szeretnénk, csak szórakozás otthon, hogy a és b két tetszőleges értékeket, mint bármely eight-- és én választaná egy nyolc bites érték. Ha ezt a 32 bit, akkor nagyon gyorsan unatkozni. De csak ad egy nyolcbites érték ez bármilyen, egy vagy két, és adja b egy hasonló érték. És akkor használja a definíció XOR múlt szerdán alkalmazni, hogy apránként, minden e nyolc bit az egyes A és B, majd csinálni pontosan per ezt a kódot. És ez nem helytelen, amit itt látsz a képernyőn. Ez valóban csapódik le három XOR műveletek és valahogy mágikusan egy és b cserélnek pozíciók elvesztése nélkül bármilyen információt. Így az olaj és a víz trükk a legközelebb valós megtestesülése Tudtam gondolni, hogy utánozza. De ez biztosan könnyebb használjon egy átmeneti változó, mint ebben az esetben itt. És ez is egy lehetőség, azt mondják, túl, ez a fajta mikro optimalizálás, mint egy számítógép tudós mondanám, míg a fajta szórakozás dicsekedni, hogy csináltad ezt nélkül mint kicserélni egy extra változó, ez nem olyan vonzó. Mivel menteni 32 bit, mint abban az esetben, egy tényleges int, nem olyan vonzó egy olyan rendszer, ahol a lehet, hogy a több tíz megabyte vagy akár több ilyen memória manapság. És valóban, amikor megkapjuk hogy egy későbbi problémát szett és akkor végre varázslat ellenőrző és máris vitatható, hogy ezt a ez olyan kevés RAM és a legkisebb idő alatt a lehető a computer-- még egy hét végrehajtani it-- akkor have-- leszel vitatta, hogy minimalizálja ezeket az erőforrásokat. És ez tényleg az egyetlen alkalmat ebben a félévben ahol neked kell ösztönözni, hogy borotválja ki még a legfinomabb teljesítményű költség másként. Szóval what-- hogyan tudjuk Láthatjuk ezt maga a kód? Hadd menjen előre most és megnyitja példát hogy szándékosan hívják Nem Swap mert nem sőt cserélni a változók ahogy valóban várnánk. Szóval vessünk egy pillantást. Itt egy program, amely nem rendelkezik CS50 könyvtár folyik, csak standard I / O. Most van egy prototípus A swap tetején, amely csak azt jelenti, ez van, hogy később kerül meghatározásra. És itt van a fő. Azt önkényesen hozzárendelt x és y, illetve, az értékeket egy és két csak azért, mert kicsi és könnyen gondolni. És akkor én csak egy rakás printf ahol van egy józan ellenőrzés. x értéke 1 és y értéke 2 feltehetően mik azok a printf fog mondani. Tehát semmi varázslat eddig. Aztán megyek állítják a print def, csere dot dot dot. Én fogom hívni a swap funkciót, átadva x és y. És tegyük fel most, hogy swap végre pontosan mint volt egy perccel ezelőtt egy átmeneti változó. És így azt állítom, bátran, cserélték. X jelenleg ez az y pedig most, hogy. De a fájl, természetesen, az úgynevezett swap nincs. Szóval valóban látni, mi történik. Ha fordítsam swap nincs majd do ./noswap, x értéke 1, y értéke 2. A lapozás cserélték. x értéke 1, y értéke 2. Tehát valóban úgy tűnik, hogy hibás, még bár swap-- nézzük lépjünk le now-- valósul pontosan a per a kód javasoltam az imént. Szóval nem lesz, hogy a képzelet A XOR cucc most. Ez is működnie kell most mint a tej és a HL, de nem úgy tűnik, hogy működik. Úgyhogy ezt újra. Talán csak nem működött jól. Szóval futni Nincs Swap újra. Talán én-- nincs. Szóval ez egyszerűen nem működik. Tehát lássuk egy kicsit józan csekket. Hadd menjen előre itt Swap és csak hozzá, várj egy percet, egy olyan% i / n és nézzük plug-in az értéke egy. Szeretném ha hogy mi folyik itt. És valóban, ez egy hibakereső technika hogy lehet használni a Munkaidőben vagy otthon már, rokon első felében Dan Armendariz a videót PSET3 ahol bevezettük nyomtatási def, mint egy ajánlott technika, legalább egyszerű eseteket. Hadd menjen előre és fuss, hogy swap nincs többé, ./noswap. Érdekes. Tehát észre, mi úgy tűnik, hogy igaz legyen. x értéke 1, y értéke 2, de a értéke 2, ha b = 1. Tehát e két valahogy cserélték de X és Y nem tudnak felcserélődik. Tehát, hogy világos legyen, mi történik van, itt van az x és y és ezek változók helyi a hatálya fő, én halad az x és y cserélni. Most, csere, mint egy külön funkció, szabadon hívja érveit vagy annak paramétereit amit akar. Foo vagy bár, vagy x vagy y vagy a vagy b. Csak, hogy egyértelmű legyen, hogy ők nem azonosak a x és y önmagában, Azt mondtam, a és b. De nevezhetjük őket, amit csak akarunk. És ez így néz ki csereügylet, hogy átadják X- AKA egy-- és ez hárítanak y-- AKA b. Valahogy ez a három vonal csere ezeket az értékeket pontosan Lauren tette a tej és a HL. De amikor ki kell nyomtatni az értékeket, a és b valóban cserélni, de x és y nincs változás nekik. Emlékezzünk, hogy x és y itt. Tehát láthatjuk ezt keresztül Egy másik technika is. És ez is egy olyan technika ágyazott problémát meg három. Menjünk előre, és ezt a CS50 ID ha még nem tetted meg. A jobb oldali mi ezt nyomkövető fület. És ha megnyitjuk ezt fel, van valami misztikus információk ami dobott kezdetben. De nézzük ugratni ezt leszámítva nagyon gyorsan. Tehát az egyik, látod a helyi változókat. Kiderül, hogy építeni CS50 IDE és Sok programozási környezet több Általában, egy debugger. Egy eszköz, amely lehetővé teszi, hogy vizuálisan látni mi folyik odabent a program anélkül, hogy igénybe hozzátéve printf és fordítása és futtatása és hozzá printf és felmérésében és futó, amely már, a hivatali órák vagy otthon, talán kezd nagyon unalmas. Tehát itt, csak egy pillanatra, mi vagyunk fog látni valós időben értékeit, a helyi változókat. Mi is lesz, hogy képes legyen meghatározni, az úgynevezett töréspont, amely vannak lehetőségek a programot, hogy szüneteltesse végrehajtás egy adott kódsort hogy én vagyok kíváncsi. Jobb? Ezek a programok futnak egy szempillantás alatt. Elég szép számunkra lassabb emberek hogy képes legyen szünet, hogy egy pillanatra, lásd mi folyik egy bizonyos kódsor a program nélkül szántás rajta és befejező teljesen. Tehát egy töréspont fog teszi számunkra, hogy szünet és a szünet egy bizonyos ponton. Hívás verem divatos módja mondván milyen funkciókat jelenleg hogy hívják az adott pillanatban. Fő mindig az úgynevezett első. De ha Main hív nevezett funkció Swap, mi történt valójában, hogy ez a tornya funkciók, amelyek már úgynevezett fordított időrendi sorrendben. Nézzük, hogy. Megyek kicsinyíteni. Én megyek vissza a kódot. És csak azért, mert azt akarom, a pedáns itt, Megyek folytassa, és kattintson csak a bal oldalon a vonal öt. És, hogy létrehoz egy piros pont. És észre a jobb oldali hogy a debugger tudja, hé, Csak azt mondtam, törésponti noswap.c ötös vonalon, kifejezetten Ebben a kódsort. Tehát a debugger tudja, hogy én azt kérték, hogy a következő alkalommal Én vezetem a programot, hogy szünet végrehajtás van, nem pedig csak futás az egész dolog szuper gyors. Szóval most megyek kattintson a Debug gombra a legtetején a IDE és hogy fog csinálni a következő. Meg fog nyitni egy kezdetben kissé ijesztő második terminál window-- távoli hibakeresés re befogadására, és such-- és mi jön vissza, amit Mindez azt jelenti, nemsokára. De mi a fontos most az, hogy ez piros pont érte, A debugger szándékosan Elhallgatott execution-- Nem ezen a vonalon önmagában, hanem az első vonal tényleges kódot ezzel a feladattal. És ezért sorban hét van Most sárga színnel. És most vessünk egy pillantást a jobb oldalon. Úgy néz ki, mint alapesetben szépen elég, x-nek van mit értéke? 0. Az y mi az érték? Nulla. És ez várható abban az értelemben, hogy x és y--, hogy a sárga line-- van nem teljesült még. Tehát x nem kellett volna az 1 értéket. Lehet-e más értéket, egy úgynevezett szemetet érték. És szerencsénk volt, hogy ez nulla ennél a pontnál, lényegében. Szóval most már csak egy pár gombok meg kell törődniük mikor hibakeresés ezen a módon. Figyeljük meg itt, van egy Play gombot. És ha játszunk, vagy hit folytatásához, ez csak fog végigmenni a többi a program vagy addig, amíg eléri egy másik töréspont. De én már nem beállítani más töréspontok így csak fog végigmenni a végén. Ez a fajta legyőzi a céljából dugta körül. Tehát ahelyett, engem érdekel Ezek az ikonok a jobb. És ha felett lebeg őket, ahogy te is, látni fogod a kis tips-- elemleírásokat. Ez az egyik átlépni. Most, hogy nem jelenti azt, skip a következő kódsort. Ez csak azt jelenti végrehajtani, és lépjen a következő, lépjen a következő, lépjen a következő. Más szavakkal, via azt a gombot, akkor sétálok az én-kód egy lépéssel egy időben. Sorról sorra, szó szerint. Most, a jogot hogy van még egy hogy majd meglátjuk, csak egy pillanatra. Ez az úgynevezett Step Into ikon, amely fog engedje meg, merülés egy másik funkció. De nézzük ezt csak egy pillanatra. Szóval megyek kattintson átlépni. És most észre, ahogy kattintson ez a gomb a jobb felső sarokban, tartja a szemét, nagyjából a Helyi Változók és meglátjuk, mi történik a x. x jelenleg 1, mert a sárga vonal most végre és mi már tovább haladt a 8-as vonal. És egy pillanat y remélhetőleg lesz 2. Most, hogy semmi érdekes történik egy kicsit. Mindez a printf. És észre, az én középiskolai terminál ablak, látom a kimeneti nyomtatási def. És most, hogy egy döntés a programozó. Tudom átlépni ezt a vonalat kódot, végrehajtó, de nem egyre kíváncsi, mi van benne. Vagy tud fellépni bele és bemenni a csereügylet. Tehát lássuk az utóbbi. Hadd menjen előre, és kattintson Nem átlépni, de Step Into. Figyelmeztetés, hirtelen Az ablak változások jelölje ki az elsõ kódsort a Swap. Ez a 21. sort. És most, mi a fajta funky, hogy, ha megnézi ide, mint az várható volt, vesszővel b értéke 1, és 2, ill. Miért temp 32,767? Emlékeztetve arra, hogy temp, ugyanúgy, mint Az üres poharat egy perce nyilvánítják itt vonalon 21. Miért 32,000- Úgy értem, hogy miért van ez csak valami furcsa érték? Igen? Közönség: Ez nem inicializált. David J. MALAN: Ez nem helyeztük üzembe. Tehát a számítógépünk mindig van fizikai memória. Ez mindig a fizikai RAM. És mindig Zero és egy van benne, ugye? Mert mi a mi számítógép egész nap, Ön használja az CS50 IDE vagy a szerverek egész nap. Annak érdekében, hogy a RAM akár néhány nullát vagy Néhány ember, vagy valamilyen nullák. Nem számít, hogy vagy Nem te használod őket. Nem lehet csak úgy vannak üres terek, ahová bit. Ők sem nullák. Így kiderül, hogy a hőmérséklet, mert mi már nem törlődnek még, van azoknak a 32 bites, de ők már nem inicializálták az ismert értékeket. Tehát bármit is leginkább A legutóbb használt for-- azoknak 32 bits-- mi csak látni a leletek néhány előző használják azokat, különösen 32 bit. Amint kattintson átlépni ellenére, phew, temp fog kapni az értéke 1. És ha újra meg újra, egy olyan fog adni az értéket 2 majd b fog adható értéke 1. És akkor mi szép most Ezen a ponton a történet az, hogy a debugger megmutatta nekem, szuper lassan saját tempómban, mit az állam a swap van. De észre a tetején van, észre hogy a hívás verem ténylegesen rendelkezik a két réteg hozzá. Most az egyik, hogy a feltárt Swap, ha rákattintok Main helyett, észre, hogy a lokális változók módosításához mert a fejlesztő csak hop körül, és megyek bele a különböző terjedelmű. Így, bár csinálunk mindezt dolgozni, és helyesen csere a és b, ha elmegyek oda-vissza a Swap ahol a értéke 2 és b értéke 1, és Main, a Fő érintette egyáltalán? Nem. Szóval mi a elvihető itt? Nos, kiderült, hogy bármikor hívja a funkciót, mint a swap, és akkor adja át az érveket, hogy mi te halad a Swap funkció ebben az esetben egy másolatot Ezen érvek. Tehát, ha X és Y jelentése egymástól rendre 32 bit, mi Swap egyre két új helyi változók, vagy érveket, hívják, és b-- de ezek tetszőleges names-- de a minta nullák és azok, belsejében a és b sorakoznak, hogy azonos a x és y de ezek nem a ugyanaz, mint x és y. Mintha Főoldal van annak a darab papír az 1. számú és 2. x és y, majd amikor kezek, darab papír Swap, Swap nagyon gyorsan jelentkeznek saját toll, írja le 1 és 2 a saját papírlapra, kezét vissza az eredeti xy Main majd saját maga valósítja dolog a és b. És ez most szuper fontos, mert ennek triviális következményei A ténylegesen írásban helyes kódot mert úgy tűnik, nem tudjuk cserélni két változó. Írtam egy helyes Swap funkciót. Már meg is valósították a Lauren helyes swap a valóságban, de úgy tűnik, egyik sem ügyekben, ha valójában nem cserélni a két érték tartósan. Tehát szükségünk van egy másik módja hogy valóban kap ebben, és szükségünk van ahhoz, hogy valójában megoldani ezt a problémát. És kiderül out-- és mi jön vissza az adott képet előtt long-- ez az egyik módja, hogy lehet felhívni a számítógép memóriáját. Ez csak egy téglalapot. Lehet felhívni, hogy minden számos módon, de ez Kényelmes rajzolni, mint egy négyszög a következő ok miatt. Megyünk ma kezdődnek és azon túl beszélünk az úgynevezett verem. És a verem csak egy darab A RAM-- egy darab memory-- hogy feladatokat ellátó hogy ha ők hívják. És így kiderül, hogy a a nagyon alján ezt köteg hely, ahol minden főbb helyi változók org C org V, és minden ilyesmi fognak menni alapból. És ha Főoldal felszólítja néhány más funkciót, mint a swap, Nos, Swap fog kapni egy másik réteg memória akár fölötte. És így csak hogy egy gyors felületes kép ez, ha átmegyek here-- és hadd tükrözi ezt a fölött, ahogy well-- ami igazán én, ha érdekel, csak a alsó kép most, az, hogy mikor fut a program, és a legfontosabb meghívásra kerül, Fő kap egy darab RAM a gépemen, ami alján ezt az úgynevezett verem. És fogok rajzolni Szándékosan mint egy négyzet. Tehát ez olyan, mint a 32 bites vagy négy bájt. És ha ez a fő funkciója van nevű változó x értéke 1 és van egy változó nevű y értéke 2, ez mint szedni ezt a szelet a memória Fő adtak az operációs rendszer és elosztjuk fel úgy, hogy a Az első helyi változó megy itt, A második az egyik megy itt, és ennyi. Ha a fő kéri Swap, Swap megkapja a saját szeletét memória hogy mi lesz felhívni, mint ez az operációs rendszer, és ez megy, hogy a saját helyi változók alapján A végrehajtás korábbi A helyi változók a és b, hogy kezdetben kap az értékeket az 1. és 2.. De aztán, amint A Swap kódot hajt végre, és Lauren valóban elcseréli HL és a tej, mi történik? Nos, ez a 2 egyre 1, ennek 1 egyre 2, és mellesleg, van egy temp változót, amit most használt, hogy egész idő alatt, hogy végül elmúlik. De ez nem számít mennyi munkát csinálni ebben a sorban of-- ebben a memória, x és y értéke teljesen érintetlen. Tehát szükségünk van valamilyen módja, amely Swap és funkciók tetszik titkos hozzáférési, ha úgy tetszik, hogy funkciók általam elvártnál a memória, mint x és y. Szóval vessünk egy pillantást Példaként amely segít lássuk, pontosan mi volt folyik egész idő alatt. Megyek, hogy menjen előre és megnyitja összehasonlítása Zero. És fogok zárja a debugger, megyek zárni ezt ijesztő keres üzenet Az csak azt mondja, várj egy percet, te vagy a közepén hibakeresés. Megyek lap elrejtése itt csak hogy menjen vissza az egyszerűség. Szóval ne aggódj, ha a GDB megölik. Ez csak azt jelenti, hogy a program már leszokni, szándékosan ebben az esetben, általam. És most összehasonlítása Zero teszi ezt. Én vagyok a CS50 könyvtár standard I / O. Van egy fő funkciója, hogy az első mondja, mondjon valamit, és kap egy húr. Aztán azt mondja, hogy újra és kap még egy húr. És észre, hogy ez a két húrok nevezzük s és t, ill. És most ez a program, összehasonlítása Zero, a célja az életben, ez állítólag mondja meg, nem azért írja ugyanezt? És így fogok vissza a héten az egyik. Én a saját egyenlő egyenlő üzemeltető amely a minőség operátor. Nem az értékadó operátor, Az egyenlőség operátor. Én csak összehasonlítjuk s és t. Szóval tényleg megy előre, és erre. És én megyek előre, és hogy összehasonlítása Zero. Azt fogom tenni ./comparezero. És én megyek előre, és mondjon valamit mint, csináljuk anya kisbetűkkel és mi a helyzet anyuka a nagybetűs. És persze írja különböző dolog. Minden rendben. Ez várható volt. Fussunk újra. Mindkét alkalommal nem kisbetű, kisbetűs. Úgy néz ki, szuper azonos velem. Belép. OKÉ. Lehet, hogy csak furcsa, mert ez nem tetszik az én nyelvtani. Tehát lássuk a fővárosban MOM, tőke MOM azonos. Különböző dolgok. Szóval miért van ez? Nos, mi történt valójában A a motorháztető alatt van? Szóval menjünk vissza több Itt egy pillanatra és mérlegelje, milyen getString valójában csinál. Amikor hívja getString, ez egy függvénnyel magunkat írta, és valahogy kap karakterek sorozata a felhasználó. És tegyük fel, hogy az első Mire hívja getString, hogy ad nekem egy darab memóriát úgy néz ki, mint ez. És ha én beírtam csupa kisbetűvel m-o-m-- és mi megy utána? Csak egy gyors józanság csekket. Backslash nulla. Tudjuk, hogy. És emlékszem, hogy mi játszott körül Zamila neve és egy csomó más nevek Rob volt itt keres hogy mi folyik odabent memória. Szóval ez a történet pontosan ugyanaz. Ez az, amit getString visszatér hozzám. Most, a kód egy pillanattal ezelőtt tárolt A visszatérési értéke getString egy változó nevű s. Majd a második alkalommal hívtam, ez tárolni egy változóban nevű t. Tehát ha elmegyek ide, szükségem van felhívni a helyi változó-- és én általában lesz felhívni a karakterláncot csak-- fogunk nevezni s-- mint egy kis térre. És most, somehow-- hogyan működik anyuka bemenni e változó s? Nos, meg kell, hogy menjen vissza az első elvek itt. Mi getString valóban visszatér? Így kiderül, hogy az M-O-M backslash nulla, és bármennyi Más húrok memória, mint Zamila és Rob vagy Andy vagy bármely más, Természetesen a mi számítógép memóriájából vagy a memória. És a RAM általam elvártnál van egy koncert a RAM, két giga RAM, vagy milliárd vagy két milliárd bájt, vagy talán még annál is ezekben a napokban. Tehát tegyük fel, a mai célra, hogy nem számít, mennyire megszámozzuk őket, de lehet számozni egyes e milliárd vagy két milliárd vagy négy milliárd bájt. És nézzük csak önkényesen mondani, hogy ez az első harapás, második harapás, harmadik, negyedik. Én szándékosan nem használja nulla ma, de akkor vissza kell térni. Tehát más szavakkal, ha ez a először én vagyok a programmal, Én csak arra, hogy szerencsés, és az első harapás a helyét egy, majd két majd három, mint négy. És ha én tartott rajz, doboz száma kétmilliárd lenne idefelé. Szóval mit gondolsz, akkor, GetString valóban visszatér? Ez nem visszatérő M-O-M backslash nulla önmagában, mert ez egyértelműen nem fér a dobozban, hogy én már rajzolt. Szóval mi mást lehet getString ténylegesen visszatér minden ezekben a hetekben? A válasz az fórumon itt valahol. Akkor nem fér M-O-M backslash nulla, akkor mi lehet értelme helyett? Ha kellett, hogy szuper okos, amivel A úgynevezett műszaki kalap, mi vissza? Mi a legkevesebb információ tudna visszatérni, amely még hadd találja M-O-M memória? Igen? Közönség: Egy. David J. MALAN: Egy. És miért az? Közönség: Mert lenne megmondani hogy hová megy [hallhatatlan]. David J. MALAN: Pontosan. Én most megyek vissza a címet a húr, hogy már ütött. A cím ebben ügy helyét egy. Tehát valójában mi folyik tárolt s-- és minden stringváltozó így far-- nemrég a címét, hogy a húr. Közben, ha hívom GetString másodszor és én írja be szó szerint ugyanazt thing-- M-O-M lowercase-- M-O-M és a másik backslash nulla, és most talán a program már fut egy ideje, így talán ez 10, ez helyen 11, ez a 12, ez 13. A számítógépek segítségével más memória bármilyen okból. Mi most megy a második változó a programom t? 10. Pontosan. És így ha megnézzük a forráskód a program ahol én egyszerűen megpróbál összehasonlítani a két érték, van s egyenlő egyenlő t, mi Az érthető, emberi válasz? Csak nem azért, mert 1 nem egyenlő 10. És így itt rejlik a lehetőség számunkra nagyon hogy csak menjen vissza, ismét az első elvek és arra gondolok, nos, mi folyik a motorháztető alatt? Mi már beszélünk bitek és bájtok és a memória, de valójában hasznos megérteni mert amikor telefonál getString, még ha azt gondoljuk, hogy ez visszatérő M-O-M vagy string anyuka vagy Andy vagy Zamila vagy hasonlók, technikailag ez csak viszonozta a címet E darab memória. De ez rendben van. Mert honnan tudjam, ahol a húr vége? Ha én csak adni a kezdet? Nos, a backslash nulla, ugye? Csak a lineáris időben tudok nyomtassa ki a nyomtatási def M-O-M. És amint látom backslash nulla, nem érdekel, ahol kezdtem, Azt már tudjuk, implicit ahol be kell fejezni. És így ma jelzi a beginning-- és hadd csináljam ezt a drámai, mert ment keresztül a sok baj, hogy hogy ezek a képzés itt wheels-- Tehát ma a képzés kerekek indul hogy jöjjön le, és feltárjuk a least-- [Taps] Ez volt megéri az utazást Target ma reggel, ugye? Tehát now-- van, kiderül ki, nincs olyan, hogy húr. Karakterlánc nem létezik. Ez a szinonimája, hogy már volt belsejében a CS50 könyvtár. Ezentúl, fogunk kezdeni hív s és t nem húrok de char csillagok. És a char csillagos fogunk ugratni egymástól nemsokára. De ez azt mondani, hogy még ha továbbra is segítségével getString most, technikailag kéne mondjon char * és char csillag. És kiderül, hogy ez mit csillagos fog jelölésére valami úgynevezett pointer vagy címet. És valóban, egy teaser A mi vár ránk ez 20 másodperces klip a mi barátja Nick Parlante a Stanford aki már elég régen, kiad nevetséges mennyiségű időt, a legjobb, amit mondhatok az ő konyhai vagy pincéjében, így claymation bevezetésével a világ a karakter neve Muci akikkel mi bevezetni legközelebb mutatók. Tehát itt van egy képe, hogy mi jön. [Videó lejátszás] -Hé, Muci. Felkelni. Itt az ideje mutató móka. -Az mi? Ismerje meg a mutatók? Ó, szobaasszony. [Lejátszás vége] David J. MALAN: És ez a feljegyzés, fogjuk látni szerdán. Minden rendben. Ki tánc? Gyerünk. Ki tánc? Azt akarja, hogy kap kezdődött? Majd én kezdődött. Woooo! LAUREN: Édes divatos Mózes.