>> DAVID J. Malan: To je CS50 a to je začátek čtvrtého týdne.
A chlapec, je Volkswagen v potíže všechno kvůli softwaru.
Pojďme se podívat.
[VIDEOPŘEHRÁVÁNÍ]
-Cars, Nejchytřejší znaky v Rychle a zběsile filmy.
Tento týden německý výrobce automobilů Volkswagen ocitlo
v uprostřed skandálu potenciálně kriminální poměry.
>> -Volkswagen Se připravuje o miliardy pokuty, možné obvinění z trestného činu
pro jeho vedení, as společnost omlouvá
pro rigging 11 milionů vozů pomoci mu porazit emisních zkoušek.
>> -Certain Dieselové modely byly navržen s sofistikovaný software
že použitá informace včetně Postavení a řízení vozidla
rychlost určit, auto bylo probíhá měření emisí.
Podle tohoto okolností, motor by se snížit toxické emise.
Ale auto bylo zmanipulované do bypassu že když to bylo v provozu.
Emise zvýšil 10 až 40 krát nad přijatelnou úroveň EPA.
>> [END Přehrávání]
>> DAVID J. Malan: Takže pojďme Podívej se na to
a přesně vidět, jak to by mohl být realizován
a jak to může mít vliv na tak mnoho aut, jako je tento.
Takže v mé ruce tady jsou lis zprávě, která byla vydána v EPA--
Environmental Protection Agency, která
je regulační agentura USA, že zpracovává otázky životního prostředí,
a pak aktuální Právní upozornění, že byl
poslat Volkswagen jen před pár dny.
>> Takže EPA píše, a zveřejňuje nyní veřejně, sofistikovaný software
algoritmus na určitý Vozidla Volkswagen detekuje
když auto prochází Testování oficiálních emisí
a otáčky Plné emisí Kontroly pouze v průběhu zkoušky.
Účinnost Tyto znečištění vozidla
ovládání emise zařízení je značně zmenšován v průběhu celého běžného provozu
situace.
To má za následek v autech, která splňují normy v laboratoři nebo testování
stanice, ale při normálním provozu vyzařovat dusíku oxides-- nebo NOx--
rychlostí až 40 krát standardní.
Tento software produkoval Volkswagen je citace konec citátu, odpojovací zařízení,
jak je definován čistého Zákon o ovzduší v USA.
>> Jdou na to říct, že EPA a další agenturou
odhalil odpojovací zařízení Software po samostatné analýzy
výzkumníky na Západ Virginia University.
Znečištění NOx přispívá oxid dusičitý, přízemní ozon,
a jemné částice.
Vystavení těmto znečišťující látky byla spojena
s širokou škálou závažné účinky na zdraví,
včetně větší astmatu útoky a jiné respirační
nemoci, které mohou být natolik závažné posílat lidi do nemocnice.
Expozice ozonu a částic má také
byly spojeny s předčasným úmrtí v důsledku respirační související
nebo kardiovaskulární související účinky.
Děti, starší lidé, lidé s Předem připravený respirační onemocnění
jsou mimořádně ohrožené zdravotní účinky těchto znečišťujících látek.
>> Postačí tedy, že je to velmi vážné.
A pojďme k číst jen jeden úryvek
a pak se budeme se podívat na podkladové důsledky
z toho v kontextu automobilu.
Konkrétně, Volkswagen vyrobeny a instalovány
software v tzv Elektronická řídicí
module-- nebo ECM-- of tato vozidla, které snímaných
kdy se zkoušené vozidlo pro splňující emisní normy EPA.
Na různých vstupů včetně těch na bázi poloha volantu, vozidlo
rychlost, délka motoru provoz, a barometrický tlak,
tyto vstupy přesně sledoval parametry
federálního použitého zkušebního postupu na měření emisí pro certifikaci EPA
účely.
>> Během zkoušek emisí EPA, software vozidla ECM
běžel software, který produkoval Výsledky shody s emisními limity.
Ve všech ostatních případech se ECM vozidlo software
provozoval samostatnou cestu kalibrace který snížil
Účinnost Celková systému pro regulaci emisí,
konkrétně selektivní katalytická Snížení NOx trap--
který uvidíme asi za chvíli.
V důsledku toho se emise NOx zvýšená o faktor 10 až 40 krát
nad úrovní vyhovující dohodách o hospodářském partnerství v závislosti na typu pohonu cyklu.
>> Takže to, co to opravdu znamená, a Zdrojový kód k softwaru běžícího
na Volkswagen nemá dosud zveřejněny,
je, že účinně, toto ekvivalent je někde uvnitř
kódu Volkswagen.
Pokud jsou testovány, a je-li do auta rozpozná některé faktory životního prostředí
jako volantu polohy nebo pohyb
nebo jeho nedostatek v autě nebo jakýkoliv počet dalších faktorů
které jsou v současné době předpokládal, být součástí tohoto vzorce,
prostě zapnout Úplná kontrola emisí.
Jinými slovy, začnou emitující méně znečišťujících látek.
>> Jinak, v každé jiné situaci pokud to není detekován jako bytí
v laboratoři, oni prostě nemají.
A tak si můžete zjednodušit to do více beton pseudokód s něčím
takhle.
Pokud kola se otáčejí, ale volantu není, sugestivní
že auto je na některých druh rotačního válce
ale v nějakém sklad testuje,
pak se chovají jako EPA bych vám.
Jinak ne.
Takže pojďme se podívat v krátké video, které
se podívat na to, co o důsledcích jsou to vlastně mechanicky.
>> [VIDEOPŘEHRÁVÁNÍ]
>> -Last Pátek EPA oznámila, že někteří Vozy Volkswagen Audi mezi 2009
a tento rok byly pomocí tzv odpojovací zařízení
obejít zákony o emisích navrženy tak, aby vzduch čistý.
Ale co to přesně znamená?
>> No, moderní auta mají desítky počítačů uvnitř nich.
A některé z těchto počítačů pomoc koordinovat funkce
motoru pro optimální výkon a zároveň zajistit,
že tam není příliš mnoho odpadků vycházející z výfuku.
Už skutečně pracuje Tímto způsobem již několik desetiletí.
V podstatě, každá část motoru moderního automobilu
má snímač nebo řadič na tom, a tyto počítače
čte v datech tisíce krát za sekundu úprav making
jako poměr paliva ke vzduchu že to bude do válců.
>> Tyto podvádění Volkswagen a Audi modely jsou diesely,
a diesely mají ještě jeden opravdu důležité počítač
kontrolované parametry, což je množství nespáleného paliva se
do výfuku.
Teď to zní špatně.
Nezní to jako byste chtěli nespálené palivo se do výfuku.
Ale v případě diesel, máte něco
nazývá NOx past, což je zařízení, které absorbuje a pasti na oxidy dusíku
že jsou znečišťující látky, které by v opačném případě přejděte do atmosféry.
A účinek tohoto NOx pasti je obohacen nespáleného paliva.
Takže odpojovací zařízení je speciální program uvnitř těchto počítačů, které mohou dělat to
vypadat vůz splňuje emisní normy, i když tomu tak není.
Volkswagen měl problém se založenýma rukama.
Jeho dieselové motory byly známy pro získání velkou spotřebu paliva,
ale NOx past funguje pouze dobře pokud se používá více paliva.
Takže auto by zjistit, pomocí tohoto odpojovací zařízení,
když to bylo získání emisí test, by spotřebovávat více paliva,
aby NOx depeše práci dobře, Emise by bylo v pořádku.
Ale pak se dostanete na silnici, zařízení vypne, jste pálení méně paliva
ale jste uvedení jak hodně jako 40 krát více znečišťujících látek do ovzduší.
Ale jak to sakra udělal auto vím, že to bylo
testován na dodržování úrovně emisí?
EPA říká, že to byl důmyslný systém, který kontroluje věci
jako polohy volantu, rychlost, jak dlouho motor byl zapnutý,
a dokonce i atmosférický tlak.
Jinými slovy, existuje žádný způsob, jak to bylo náhodné
proto, že software byl navržena velmi opatrně k detekci
oficiální zkouška emisí.
To je nějaký docela vážné podvod, a to je
Proto je v Volkswagen jako vážný problém.
Ve skutečnosti se jejich CEO, Martin Winterkorn, jen odstoupil.
>> Takže co se stane dál?
No, pokud jste jeden z půl milionu diesel Jettas, Beatles, podkolenky, Passat,
nebo Audi A3S uskutečněny, Dobrou zprávou je, je
že vaše auto je stále bezpečně řídit.
Nemusíte dát to pryč dokud Volkswagen vydá odvolání.
Ale v určitém okamžiku, že jsou pravděpodobně bude mít
aktualizovat software v autě.
Když se to stane, by mohl dostat méně mil na nádrž.
Právníci jsou již chystají up pro třídu žalob
aby majitelé mohli dostat kompenzovány v určitém okamžiku v budoucnosti.
Ale to nebude brzy stát kdykoliv.
>> [END Přehrávání]
DAVID J. Malan: Takže to vlastně vyvolává zajímavá větší obrázek otázka
pokud jde o důvěru.
Je to tak?
Každý z nás má iPhone nebo androidi nebo něco, co v našich kapsách s největší pravděpodobností
V těchto dnech, nebo notebooky na našich kolech, která jsou
běží software vyrobený Apple a Microsoft
a svazky jiných společností.
Ale jak víme, že to, co Tyto softwarové produkty dělají
je vlastně to, co tito společnosti tvrdí, že dělají?
>> Například, který je na říkají, že pokaždé, když
uskutečnit telefonní hovor na vašem iPhone nebo Android telefon nebo podobně,
že telefonní číslo je také není nahrávány na server nějaké společnosti
kvůli nějaké programu, který jsem napsáno, ať už je to operační
systém sám o sobě jako je iOS nebo Android, nebo proto, že jste si stáhli
některé aplikace třetí strany že nějakým způsobem je poslech
na vše, co píšete nebo vše, co jste vlastně říkal.
Jak víte, že když vy jste běží Clang
nebo Vytvořit kompilovat vlastní software v CS50, jak
Máte vlastní personál, který je CS50, pomocí knihovny CS50,
nebyl přihlášení každý string jste někdy dostali
nebo každým coulem, jaký jste kdy dostal?
No, mohli byste se rozhodně netváří do zdrojového kódu na něco
jako knihovny CS50, vy se mohli podívat do zdrojového kódu
pro operační systém Linux běží na CS50 IDE.
Ale úžasná prezentace byl dán v roce 1984
v přijetí Turingova Zadání zakázky velmi slavný počítačový odborník známý
as-- jménem Ken Thompson, kteří obdržel Turing cena, která
je druh počítačové vědy je Nobelova cena, chcete-li,
za jeho práci na operační systém s názvem
Unix, který je velmi podobný ducha toho, co používáme, který je Linux.
A otázka zeptal se jeho přijetí řeč, v podstatě
kterým se stanoví rámec pro roky a roky diskusí
o důvěře a bezpečnosti, byla tato.
Do jaké míry by jednoho věřit prohlášení, že program-- kus
z software-- je bez trojských koní?
Možná je to mnohem důležitější důvěřovat lidé, kteří psali software.
>> A ve skutečnosti, jsme spojený do řeči, že
dal při přijímání tohoto ocenění v 80. letech na internetových stránkách CS50 je
pod stránce přednášky pro dnešek.
Protože to, co uvidíte je to, že on vlastně dává
poměrně jednoduchý příklad, jak i kompilátor jako je Clang nebo cokoliv
kompilátory jiní používané v minulosti, Co když vložený v kompilátoru my
sami používáte je málo, pokud podmínka, která v podstatě říká,
pokud si všimnete, že tento kód je pomocí Funkce GetString nebo GetInt
funkce, pokračujte a vložte zadní dveře nebo trojským koněm
tak, že tento program Nyní má nějaké nuly
a ty, které dělají něco škodlivého.
Přihlašování všechny vaše úhozů, nahrávání, že data
k nějakému serveru, nebo opravdu cokoli.
>> A co Ken Thompson pokračuje dělat v řeči
je prokázat, že i v případě, máte přístup ke zdroji
kód překladače, který zlomyslně může dělat to,
to nevadí, protože Tam je to kuře a vejce
realita minulosti mnoho let pricemž kompilátory
se používají k sestavování sami.
Jinými slovy, při cestě zpět někdo musel psali první kompilátor.
A poté, kdykoliv že jsem aktualizováno kompilátor změnou jeho zdrojový kód,
přidávání funkcí a překompilování ji Pro lidi jako my používat, dobře,
Používají starý verze kompilátoru
sestavit nový verze kompilátoru.
A pokud jste se podívat v rozhovoru, který dal,
uvidíte, že proto, tohoto kruhovitosti,
můžete skutečně mít chyby nebo Trojské koně vložené do softwaru
jsme pomocí.
A i když se podíváte na zdrojový kód pro tyto programy,
to by mohlo být ani zřejmé protože podvod je vlastně
v některých starších verzí kompilátor, který od té doby byla
vstřikování hrozbu do našeho softwaru.
>> Což je jen říkat, my opravdu nemůže a neměl by
důvěra software běžící na našich notebooků nebo telefony nebo jakýkoliv počet míst.
A ve skutečnosti, dále v tomto pololetí, kdy začneme mluvit o programování webu
a skutečně začít stavět webové aplikace sami,
budeme mluvit o těchto hrozby a další.
Nyní, možná jste přemýšlel a všiml že to tam bylo malinké Darth
Vader na klipy, které Krajnici tam ukazovat
o Volkswagen. Jestliže jste nikdy neviděli, já
myslel, že bychom měli ulehčit nálada, protože to je vše
velmi deprimující a děsivé.
Jdu se podívat zpět na Super Bowl 2011
kdy je obchodní od Volkswagen-- a to
Téměř z nich dělá sympatický again-- vysílal poprvé v televizi.
Je tu druhý klip 60 si myslím, že se vám bude líbit.
[VIDEOPŘEHRÁVÁNÍ]
[MUSIC - téma z "hvězdné války"]
[DOG štěká]
[CAR ZAČÍNÁ]
[END Přehrávání]
DAVID J. Malan: Jo.
Jen jsem kontrolu.
To auto je na seznamu porušování lidských práv.
Dobře.
Takže se podíváme na některé pseudokód před chvílí.
A tady je větší úryvek pseudokódu kódu
že jsme viděli několikrát tak daleko.
A pojďme použití je to příležitost Nyní zavedení nového programování
technika, kterou jsme udělali viz algoritmicky
minulý týden, kdy jsme se podívali na sloučení druhu.
Ale pojďme formalizovat a uvidíte, jak se nám to může používat ve skutečném kódu,
a pak budeme používat tuto Technika po silnici nejvíce
pravděpodobné, že k řešení některých dalších problémů.
>> Takže to byl jeden z prvních programů jsme kdy napsal, i když v pseudokódu kódu.
A to, co tento program povolena, abychom dělali kurz
bylo najít Mike Smith v telefonním seznamu.
A všimněte si v jednotlivých linií osm a 11, které měl tento výkaz jít.
A ve skutečnosti, jisté jazyky, C mezi nimi,
vlastně dělat mají prohlášení, že je doslova
přejít na který vám umožní přejít na konkrétní lince.
To je obecně odsuzován protože to může být velmi snadno zneužito
a můžete začít skákat svůj Program všude na rozdíl
k používání druh logika a řízení toku
že jsme použili dosud jen s smyčky a podmínky a podobně.
>> Ale můžeme zjednodušit tento algoritmus v pseudokódu kódu způsobem.
Místo toho, aby tento opakovaný či smyčkovací přístup
kde jsme neustále vracet a zpět a zpět do řádku tři,
proč ne my jen trochu punt a více se obecně říci, v souladu sedmi a 10,
stačí vyměnit ty dva párů linek s,
else if Smith je starší v knize my budeme
hledat Mike v Levá polovina knihy.
Else pokud Smith později ve kniha, hledat Mike v právu
polovina knihy.
A všimněte si už na kruhovitost.
Je to tak?
Já jsem hledal Mike v telefonního seznamu a poté
Nakonec jsem hit možná linka sedm nebo možná řádek 10
a moje instrukce pro sebe, je vyhledávání Mike v polovině telefonního seznamu.
No, jak mám vyhledat Mike?
Jsem v polovině hledal Mike, proč
se mi nějak odeslání v kruhu?
Ale to je v pořádku, protože to, co je děje na rozsahu problému,
jak je psáno v řádku 7 a 10?
Nejsme jen říkám, hledání Mike, hledat Mike.
My konkrétně říkat, co?
Hledat pro něj v levé polovině pravá polovina, která je ve skutečnosti
poloviční velikosti problému.
Takže je to v pořádku, že jsme trochu zapojení do této kruhovitosti,
Tento argument oběžníku, protože alespoň jsme
což je problém menší a menší.
A nakonec budeme dosáhnout že takzvané referenční případ, kdy
Máme jen jednu stránku left-- jako náš dobrovolník minulý týden
did-- jsme měli jednu stránku doleva a pak my ne
mít na hledání Mike Smith proto, že je to buď na této stránce
nebo není.
>> Tak jak můžeme realizovat tuto myšlenku, tento druh kruhovosti při skutečném kódu?
No, můžeme využít techniku která je obecně známá jako rekurze.
A my jsme viděli to v pseudokód pro slučovací druhu minulý týden.
Připomeňme si, že to bylo pseudokód pro slučovací druhu.
Je to pravděpodobně ještě jednodušší než bublina, nebo výběr nebo insertion sort
nejen z hlediska jednoduchosti se kterou můžete vyjádřit.
>> Ale to je proto, jsme nějak kruhově
řka, hledat něco, tím, že hledá to znovu.
Ale my jsme vyhledávání buď na levá polovina nebo pravá polovina
a nakonec jsme slučování v tomto případě.
Ale i zde se tyto dvě linky, řazení
jsme zase se to idea rekurze.
A konkrétně to, co znamená, v rámci algoritmu,
je, že algoritmus je rekurzivní pokud se používá nebo volá sama sebe.
>> Nebo, pokud jde o C, je funkce recursive-- funkci nazvanou
foo je rekurzivní, pokud foo, kdesi v jeho zdrojovém kódu,
volá funkci sám foo.
A to je špatné, pokud vše foo někdy dělá je sám znovu a znovu zavolat.
Je to OK, pokud foo nakonec přestane, stejně jako merge sort, tím, že říká, počkej,
pokud k tomuto problému je super malý, například,
nebo jsem ho našel, koho, že jsem hledáte, prostě vrátí.
Nenechte rekurzivně, ne sám cyklicky znovu zavolat.
>> A tak se pojďme podívat na jak to může skutečně pracují.
Takže budu pokračovat a otevřený up dvou příkladech zde zdrojového kódu.
Jedním z nich je nazýván sigma 0.
A to není vůbec rekurzivní, ale pojďme se
se podívat na to, co tento program dělá.
Já jsem svlékl si vše připomínky od ní, ale všechny
zdrojového kódu na CS50 je webové stránky má komentáře Pokud jste
chtít číst přes to znovu později.
A pojďme udělat pár zdravého rozumu kontroluje zde.
>> Takže v horní části tohoto kódu, máme patří CS50.h.
Co to dělá?
Proč je to tady?
Z hlediska přiměřených laicky.
Co to dělá?
To jo.
>> Diváků: Tak, že funkce GetInt funguje.
>> DAVID J. Malan: Takže to Funkce GetInt funguje.
Vzhledem k tomu, vnitřní straně této Soubor, CS50.h, který
uvidíme zanedlouho v podmínky jejího zdrojového kódu,
má spoustu funkcí declared-- GetInt, GetString,
a spoustu others-- a pokud není ve skutečnosti máme, že Zahrnout linku,
kompilátor Clang není bude vědět, že existuje.
A totéž platí pro linky dvou, kde je definována int
printf, což je funkce budeme nadále používat docela dost.
Nyní, linka čtyř zdá málo funky protože je to jen jeden vložka.
Má to středník, ne kudrnaté šle, žádný kód uvnitř ní.
Ale to, co udělal nazýváme tahle věc v týdnech minulosti?
To jo.
Takže prototyp.
A proč máme prototyp, který se zdá
být trochu nadbytečný obvykle proto, že jsme se obvykle
viz funkce znovu později v souboru, je to tak?
Tak proč have-- jste jen poškrábání vaší hlavě, ale já to beru.
To jo.
>> Diváků: [Neslyšitelné] Funkce po hlavní.
DAVID J. Malan: Přesně tak.
Tak, že překladač vás zná bude nakonec definovat nebo zavést
že funkce po hlavní, pravděpodobně.
Tak Clang a nejvíce kompilátory jsou trochu hloupý
a budou vědět, jen to, co jim řeknete.
A pokud chcete používat funkce nazvaná sigma,
lépe učit kompilátor že existuje předem.
>> Nyní, hlavní sama, dokonce i i když je to banda linek,
je docela obeznámen snad nyní.
Má to dělat, zatímco smyčky jehož účel života
Zde prý je dostat kladné celé číslo od uživatele.
A jen držet otravovat ho nebo ji, dokud se spolupracovat.
Pak v řádku 16, mám zajímavý hovor.
IntAnswer.
Který je na levé ruce strana dává mi Int
který může store-- nazývá Answer-- který bude ukládat, zdá se,
návratová hodnota sigma.
Takže sigma je jen libovolný, ale smysluplné jméno
že jsem dal do funkce jehož účel života
je vzít jednu argument-- budeme říkat N v tomto case--
a jen proto, aby součet tohoto čísla a každé kladné číslo, které je
menší, než to.
>> Takže když jsem se projít v počtu 2 sigma, chci přidat 2 plus 1
a 0-- ne 0-- tak, že mi dává 3.
Kdybych projít, během 3 až sigma, chci mají 3 + 2 plus 1, což mi dává 6.
A tak dále.
Tak to prostě sečte všechny Čísla menší než nebo rovna k němu.
>> A teď, tady já jsem prostě jít vytisknout odpověď.
Takže jako rychlou kontrolu sanitačního, pojďme aby sigma 0-- tečka lomítko sigma 0--
a dovolte mi, abych zadejte 2.
A já opravdu dostat 3.
Dovolte mi, abych zadejte 3.
Já opravdu dostat 6.
A pokud někdo může dělat matematiku rychle, když to udělám 50 co mám dostat?
>> Diváků: [Neslyšitelné].
DAVID J. Malan: No, no.
Ale 1275, což je dost blízko.
Tak tohle je výsledek dělá 50 a 49 a 48 a 47 a 46
celou cestu až do 1.
Tak to je všechno sigma dělá.
Ale pojďme se podívat, jak máme implementována to teď.
Tak sem je samotná funkce.
A to se nezdá mít něco do činění s rekurze dosud.
Ve skutečnosti, jsme za použití old school technika.
Jsem inicializaci proměnnou s názvem částku na nulu, pak mám foreloop tady,
a já jsem deklarování Int názvem Já, nastavení je rovna 1--
když jsem mohl nastavit, že se rovná nula, ale od té doby dělám sčítání,
Koho zajímá, jestli to je nula nebo jedna.
Bude to mít žádný vliv.
>> Takže jsem iterace tak dlouho, jak jsem je menší než nebo rovné M, který
je argument, který byl předán v.
A pak jsem se jen udržet zvyšování I. a pohled
smyčky všechno, co dělám dělá součet a rovná I. A to je úmyslné.
Nechci dělat, v tomto Stejně tak jako součet navíc plus.
Chci skutečně přidat aktuální hodnota proudu I,
který je čím dál větší a větší a větší na průběžný.
>> A pak jsem se vrátit částku.
A tak odpověď dostane hodnotu částku.
A pak jsem ho vytisknout.
Takže je tu příležitost tady, i když se trochu zjednodušit
tento kód koncepčně a druh úderu něčí
mysl v termínech jednoduchost, i když to
chvíli trvá seřadit z ocenit, proč se to
je silný v těchto malých příkladech.
Zde je sigma one--, takže Druhá verze tohoto kódu.
Vše up vrcholu je stejná, aby že stejný příběh, platí jako předtím.
Ale teď pojďme podívat na provádění sigma, které
Já jsem smrskl na pouhých těchto lines-- čtyři řádky kódu, opravdu,
plus několik složené závorky a bílý prostor.
>> Ale co mám dělat?
Je-li m je menší než nebo se rovná nula, musím trochu zvládnout
že mimořádně jednoduchý případ.
A pokud se mi podat nula, nebo nic negativní, což je právě divné,
Já jsem prostě jít libovolně ale konzistentně vrátit nulu.
Nechci, aby tuto věc dostat se do nějaké podivné nekonečna
smyčka, protože se zápornou hodnotou.
Takže já jen říkám, jestli mi dáš nula nebo méně, Vracím nula.
>> Ale to je dobře, protože to je že jednu stránku z telefonního seznamu
, co zbylo.
Jsem ukousl velmi specifický problém, a ne něco, co volá rekurzivně.
Avšak v řadě 31, co Zdá se mi to dělat?
Závorky jsou jen udržet věci, doufejme, trochu jasnější.
Ale všechno, co dělám, je, že jsem vracet m-- cokoliv
předáte me-- plus Hodnota m-- líto,
plus hodnota sigma m minus 1.
Takže co to znamená?
Pokud byste mi dát číslo 3 jako vstup, odpověď Chci se dostat nakonec
je 6, protože 3 plus 2 plus 1 6 mi dává.
Ale jak si myslím, že o jak se spuštěním tohoto kódu?
Poprvé jsem zavolat sigma a já se projít v hodnotě 3,
to je jako říkat na kusu papíru, tady je hodnota 3
a já jsem byl předán to jako Sigma.
3 je samozřejmě menší než 0, takže podmínka IF neplatí.
Else dělá.
Tak co mám dělat?
Chci se vrátit m, což je 3 plus sigma M minus 1.
Dovolte mi tedy sledovat to.
Chystám se dát to kus papíru dolů.
A jaká hodnota, aby se jasné, mám jít projít
do Sigmy v tuto chvíli v příběhu?
Jaké číslo?
2, že jo?
3 minus 1 je 2.
Tak jsem jen potřebujete trochu cár papíru sem.
Takže teď sigma je stále znovu zavolal.
A já jsem úmyslně to dolů, protože je to
něco jako pozastavení že verze příběhu
protože teď jsem soustředěný na signál M minus 1.
Tak byla 3 m, m minus 1 je 2.
Takže tady je 2, že jsem byl předán.
2 je samozřejmě menší než 0 tak, že případ nevztahuje.
Jinak se vrátím m, což je to věc, a sigma z jaké hodnoty?
Takže pokud sigma of 1-- protože m je teď 2 tak 2 minus 1 je 1.
Takže teď mám jen hodnotu 1.
Já jsem kolem jen číslo 1 do funkce sigma--
nebo já here-- tak 1 zjevně není menší než nula, stále ještě neplatí.
>> Else return 1 plus sigma čeho?
0.
Takže mi dovolte připomenout, že.
Vrátím se k tomu později.
Teď budu pokračovat a drobek dolů číslo 0, protože to je
můj argument nebo parametr.
Já jsem prošel číslo 0 a nakonec se tento proces
toho jen opakuji inzerát nauseum se ukončí, protože to, co
mám hned dělat, jakmile vidím tuto 0?
I vrátit nulu.
Takže teď budete muset přetočit příběh.
>> Kdybych teď jít zpět v čase, co byla poslední věc,
Udělal jsem, když jste byli doslova převíjení videa?
Jdu vyzvednout nejnovější 1, a to mi dává 1 plus 0 je 1.
Mám-li držet převíjení příběh, který se chystá dát mi
2 plus tento běh hodnota, která je 1.
Tak to je 3.
A pak budu držet převíjení.
Když jsem poprvé zapsat číslo 3-- tak 3 plus 3 mi dává 6.
>> A teď, pokud jste přetočil video až do tohoto bodu,
toto bylo velmi První otázka, zeptal jsem se.
Při předání 3, co je sigma z 3?
Je to vskutku 6, součet všechny tyto kusy papíru.
Takže pokud to trvá trochu zatímco na zabalit svou mysl kolem, to je v pořádku.
Ale za to byl little-- ní byl velmi úmyslné, že jsem naskládané
tato čísla na sebe.
Je to něco jako mít memory-- záznam v čase,
jako pračce ve videu, že mohu skutečně přetočit v.
A budeme se vrátit do že metafora v jen trochu.
>> Ale nejdřív, ukazuje se, že je tu spousta mágů a lidé, legrační,
Myslím, že na Googlu.
Chtěli někoho, kdo je velmi dobrý na Googling mysli
přijít na chvilku a pomozte mi něco hledat?
Velmi, velmi nízká klíč.
Někdo, kdo je nikdy přijít dříve, možná.
DOBŘE.
To jo?
No tak.
Pojď dolů.
Jak se jmenuješ?
>> SAM: Sam.
>> DAVID J. Malan: Sam, pojď dolů.
To je stejná.
Rád tě poznávám.
Ahoj.
Pojď.
Takže vše, co potřebuji, abys udělal, pokud jste mohli, Same, tady je Google.
Můžete hledat termínu rekurze?
Nikdy nezkazí.
>> A teď let's-- jo.
Klepněte na tlačítko OK, že.
Lepší klikněte na to.
Ach, to chápu.
Ne?
DOBŘE.
Takže pojďme udělat pár dalších.
Ani ne tak související akademicky tady, ale už jste
někdy hledal Google pro anagram?
>> SAM: Ne.
>> DAVID J. Malan: OK.
Hledat přesmyčky místo rekurze.
Jak se o nakřivo.
Už jste někdy hledali nakřivo?
Teď, tohle je trochu těžké vidět, ale doufejme, že everything's-- OK.
Je to jen ty a já se těší to.
DOBŘE.
>> Takže nakonec, to one's-- je to trochu nakřivo.
Teď už výkrut.
Wonderful.
Dobře.
Velké poděkování patří také Sam.
Tady máš.
Díky.
>> Takže, co se děje ve všech z těchto příkladů hloupé?
Takže opravdu, pod kapotu Milióny Googlu řádků kódu
prý je několik hloupé IF podmínky, které jsou v podstatě
kontrolovat, zda má uživatel napsaný v této věty,
udělat něco, co pravděpodobně vzal netriviální množství času
realizovat jen proto, aby bylo zábavné tímto způsobem.
Ale to je vše, to se vaří dolů pod kapotu.
Ale, samozřejmě, rekurze je více z geekier
příkladem z těchto speciálních triků.
A určitě tam jiní tam venku jakož i, že mají možná ani
objevil ještě ne.
>> Tak se podívejte, nebo zvažte Nyní následující program,
a určitě chytit jakýkoli z nich na své cestě ven.
Chystám se jít dopředu a otevřít program, který je
bude snažit vyměnit dvě hodnoty.
Ale dříve, než jsme se tam jít, jdeme na to.
Mohli bychom získat ještě jeden dobrovolník, myslím, že?
Chtěli byste, aby dobrovolně?
Ne?
Pojď nahoru.
Dobře.
Takže Vaše jméno je co?
>> Lauren: Lauren.
>> DAVID J. Malan: Lauren.
Pojď nahoru, Lauren.
Takže Lauren je být zde napadla následovně.
Rád tě poznávám.
Takže Lauren zde má vpředu z jejích dvou prázdných šálků.
A máme nějaký oranžový šťáva a některé mléko
a budeme pokračovat vpřed a proveďte následující.
Jsme jen tak naplnit toto.
Několik uncí mléka sem a pojďme vyplnit trochu pomerančové šťávy tady.
>> A v přední části všech tito členové publikum,
prohodit dvě hodnoty těchto poháry.
Dejte pomerančový džus v odvětví mléka pohár a mléko v šálku pomerančové šťávy.
Jak byste to dělali, kdybyste byli na domů a měl přístup k jiné zásoby?
LAUREN: Dej to do jiného šálku.
DAVID J. Malan: OK.
Takže pojďme se dočasné proměnná, pokud budeme chtít.
A do toho teď a realizovat Stejný postup vyměňování.
Tak dobré.
My jsme dali OJ do dočasného proměnná, mléko do proměnné OJ,
a nyní dočasné proměnná do proměnné mléka.
DOBŘE.
Takže velmi dobře dělali doposud.
Tak to dopadá out-- si myslí, že Myslel jen na chvíli.
Zde, na jenom geek to trochu, to by byl odpovídající C kód
že jsme právě realizována.
Měli jsme dva vstupy, a a b, a to jak z který budeme jen říct, pro jednoduchost jsou
int je.
A všimněte si tady, když chci vyměnit hodnoty dvou proměnných, a a b,
my opravdu potřebujeme prostředníka, je dočasné proměnné, dočasné pohár,
do kterého se nalije jednu z hodnot takže máme vyhrazené místo pro to.
Ale pak je kód je přesně jako Lauren zde prováděny.
>> Nyní, jen se dostat trochu bláznivější, dopadá
že můžete to udělat, aniž by dočasné proměnné.
Chcete-li to správně, když jdeme muset podvádět s nějakou chemii.
Máme nějaké další poháry zde.
Takže nejbližší věc, která vypadá jako je mléko a vodních perhaps--
nebo mléko a OJ-- je máme nějaký voda, takže budeme naplnit tenhle nahoru
s několika uncí čistou vodou.
To je asi moc.
To jo.
To je rozhodně příliš mnoho.
Vydržte sec.
>> A teď máme olej, který, pokud si vzpomínám ze střední školy chemie třídy,
Doufejme, že to nebude míchat s vodou.
Ale je to trochu druh vypadá jako mléko a Úředním věstníku.
Takže teď, bez použití dočasnou proměnnou,
můžete je přesunout tyto dvě hodnoty?
Takže oleje jde do vody poháru, voda jde do olejové šálku.
LAUREN: Bez dalších pohárech?
DAVID J. Malan: Žádné další poháry.
A já jsem vlastně zkoušet to před tímto rokem
takže si nemyslím, pokud to nebude vědět skutečně pracují chemicky.
To se nemělo stát.
Funguje to?
Dobře.
Tak oddělování?
Dobrý.
Teď musíme získat voda do druhého šálku.
Chytřejší chemie koncentrátory mohl Pravděpodobně to mělo podařit lépe než já.
>> LAUREN: Voda je na dně.
>> DAVID J. Malan: water--, která byla co je klíč v poslední době jsme to udělali.
Musíte to udělat ve správném pořadí.
To jo.
To je v pohodě.
Takže teď máme dva šálky oleje.
DOBŘE.
To je v pohodě.
Ale chemicky pokud to fungovalo než já--
>> Lauren: To je voda.
>> DAVID J. Malan: To je většinou voda.
Dobře.
Ale to je pořád stejný pohár jako předtím.
Tak nalít to-- zkuste to tam.
DOBŘE.
To je dobré využití třídy času dnes.
DOBŘE.
Takže teď we-- pěkné.
Tak nějak.
Dobře.
Takže velmi dobré.
Děkuji Lauren.
Velmi dobře.
>> Takže jen vyhodit svou mysl, a to je něco, co možná
hrát s, pokud se vám líbí v CS50 ID, můžete ve skutečnosti, vyměnit dvě proměnné
bez použití dočasného celé číslo.
A to je odpovídající C kód.
A pokud si vzpomínám z poslední Středa, jsme zavedli, je-li krátce,
některé nové operátory v C a dělá někdo vzpomenout, co tu malou mrkev
symbol je, že malá trojúhelníková symbol z klávesnice znamená?
Co bitový operátor?
>> Diváků: EXOR.
>> DAVID J. Malan: EXOR.
Exclusive Or.
Takže pokud chcete, jen tak pro zábavu na domů, čímž se získá a a b dva libovolné
hodnoty jako jakýkoli eight-- a I by si vybral osm bitovou hodnotu.
Pokud to budete dělat s 32 bity, budete velmi rychle nudit.
Ale jen dát osmibitovým Hodnota, která je co, jedna nebo dva,
a dát b podobnou hodnotu.
A pak pomocí definice XOR od minulé středy,
platí, že kousek po kousku, každý tyto osm bitů v každé z a a b,
a pak to udělat přesně to, za tímto kódem.
A není to nesprávné, co zde vidíte na obrazovce.
Je to opravdu scvrkává na tři operace XOR
a nějak magicky a a b vymění pozice
bez ztráty jakékoliv informace.
>> Takže olej a voda trik je Nejbližší reálný svět inkarnace
Jsem mohl myslet, že napodobovat.
Ale je to určitě jednodušší použijte dočasné proměnné,
jako v tomto případě zde.
A i toto je příležitost říci, Také tento druh mikro optimalizace,
jako erudovaný bych, zatímco druh zábavy
chlubit, jak jste to udělal, aniž jako vyměňovat s extra proměnnou,
že to není vše, co přesvědčivé.
Vzhledem k tomu, aby ušetřit 32 bitů, as v případě skutečného int,
není všechno, že přesvědčivé na systému, v němž
můžete používat desítky megabajtů nebo dokonce více jako paměť v těchto dnech.
A ve skutečnosti, když dostaneme na pozdější Zadání problému
a implementovat kouzlo Kontrola a budete
být vyzváni, aby tak učinily s to tak málo RAM a tak málo,
čas pokud možno na computer-- vám ještě
mají za týden pro provádění to-- budete have-- budete
vyzval k minimalizaci těchto zdrojů.
A to je opravdu jen OCCASION tento semestr
kde budete povzbuzováni k holení off i nejlepší výkon
náklady na jinak.
>> Tak what-- jak můžeme vidět ve skutečné kódu?
Nech mě jít napřed teď a otevřít příklad
který záměrně se nazývá Ne Swap, protože to není
ve skutečnosti vyměnit proměnné jak jste vlastně by se dalo očekávat.
Takže pojďme se podívat.
Zde je program, který nemá CS50 Knihovna se děje, jen Standard I / O.
Nyní máme prototyp jako odkládací prostor do horní, které právě
znamená, že to musí být definovány později.
A tady je hlavní.
>> I libovolně přidělen X a Y v tomto pořadí, jeden hodnoty a dva
jen proto, že jsou malé a snadno se přemýšlet.
A pak jsem prostě spoustu printfs kde mám kontrolu zdravý rozum. x je 1
a y je 2, je podle všeho co tyto printfs řekne.
Takže žádná magie tak daleko.
>> Pak budu tvrdit, s tisknout def, vyměňovat dot dot tečky.
Chystám se zavolat swap Funkce, předávání v x a y.
A předpokládejme, že pro tuto chvíli Swap je implementován přesně
jak to bylo před chvílí s dočasné proměnné.
A tak jsem se tvrdit, směle, vyměnil.
x je nyní to, a y je nyní, že.
Ale soubor, samozřejmě, se nazývá No Přepnout.
Takže pojďme se skutečně vidět, co se stane.
Mám-li sestavit bez swapu a poté do ./noswap, x je 1, y je 2.
Swapping vyměnil.
x je 1, y je 2.
Takže to vlastně se zdá být chybný i ačkoli swap-- pojďme posunout dolů now--
se provádí přesně dle kód, který jsem navrhl před chvílí.
Takže my nebudeme mít fantazie s XOR věci prozatím.
I to by mělo fungovat jen stejně jako s mlékem a Úředním věstníku,
ale nezdá se, že funguje.
>> Takže pojďme to udělat znovu.
Možná jsem prostě nebyl v chodu vpravo.
Takže pojďme běžet Bez Přepnout znovu.
Možná Já-- ne.
Tak to prostě nefunguje.
Takže pojďme udělat malý kontrolu zdravý rozum.
Nechte mě jít napřed tady v Swap a stačí přidat, počkejte chvíli,
a je% i / n, a pojďme plug-in hodnoty a.
Protože opravdu chci aby viděli, co se děje.
A skutečně, to je ladící technika
že byste mohla být použití v úřední hodiny, nebo doma už,
podobný v první polovině roku Dan Armendariz je video v PSET3
kde jsme představili tisk def as doporučená technika, alespoň
Pro jednoduché případy.
Nech mě jít dopředu a spusťte make opět bez swapu, ./noswap.
>> Zajímavé.
Takže si všimnout, co se zdá být pravda. x je 1, y je 2, ale je 2, když b je 1.
Takže ti dva se nějak vyměnili ale x a y nejsou stále prohozeny.
Tak aby bylo jasno, co se děje se, tady mám x a y
a ty, které jsou proměnné místní v Rozsah hlavní, jsem kolem v x a y
vyměnit.
Nyní, swapu, jako samostatná funkce, je zdarma zavolat své argumenty
nebo jeho parametry něco chce.
Foo či bar nebo X nebo Y a nebo b.
Jen aby bylo jasné, že jsou není totožný s x a y per se,
Řekl jsem, a a b.
Ale my jsme jim mohli nazvat, co chceme.
>> A tak to vypadá, swap předávaný
x-- AKA je-- a to je předáním y- AKA b.
Nějak se tyto tři řádky jsou vyměňovat přesně tyto hodnoty
jako Lauren udělal s mlékem a věstníku.
Ale když jsme vytisknout Hodnoty, a a b
jsou sice vymění, ale i x y mít žádnou změnu k nim.
Připomeňme si, že x a y jsou tady.
>> Takže můžeme vidět přes další technika také.
I to je technika vložené do problému nastavit tři.
Pojďme dál a dělat to v CS50 ID pokud jste tak již neučinili.
Na pravé straně my mají tuto kartu debugger.
A pokud otevřete toto nahoru, tam je nějaký tajemný informace
že je hozen na vás zpočátku.
Ale pojďme škádlit to od sebe opravdu rychle.
>> Takže člověk, vidíte lokální proměnné.
Ukázalo se, že stavět na CS50 IDE, a mnoho programovacích prostředí více
obecně, je debugger.
Nástroj, který vám umožní vizuálně vidět co se děje uvnitř vašeho programu
aniž by bylo nutné uchýlit se k přidání printfs a kompilaci a spouštění
a přidání printf je a kompilaci a běh, který již v úředních hodinách
nebo doma, je zřejmě stále dost únavné.
>> Tak tady, za chvíli, my jsme bude vidět v reálném čase
hodnoty našich lokálních proměnných.
Jsme také bude moci nastavit co se nazývá zarážky, které
jsou možnosti v mém programu pro pozastavení zpracování od určitého řádku kódu
že jsem zvědavý.
Je to tak?
Tyto programy běží ve zlomku vteřiny.
Je to docela hezké pro nás pomalejší člověka aby bylo možné pozastavit, chvilku, viz
co se děje kolem určitý řádek kódu
bez programu orbě přes to a dokončovací úplně.
Takže zarážky bude nám umožňují zlomit a pauza v určitém okamžiku.
>> Zásobník volání je ozdobný způsob, říkat, jaké funkce jsou v současné době
volána v tuto chvíli.
Hlavní je vždy nejdřív zavolat.
Ale pokud Hlavní volá volání funkce Swap,
my vlastně bude vidět tower funkcí, které byly
volal v obráceném chronologickém pořadí.
Takže pojďme se podívat, že.
>> Jdu oddálit.
Chystám se vrátit do svého kódu.
A jen proto, že chci, být pedantský tady,
Chystám se jít dál a klepněte na tlačítko jen na levé straně linky pět.
A to vytváří červenou tečku.
A všimněte si na pravé straně že ladicí program ví, hej,
Jen jsem řekl, zarážku na noswap.c linka pět, konkrétně
v tomto řádku kódu.
Takže debugger ví, že požádaly, aby příště
Vedu můj program pozastavíte poprava tam spíše než jen
běží celou věc velmi rychlé.
>> Takže teď budu klepněte na Debug Tlačítko na samém vrcholu IDE
a to bude dělat následující.
Bude to otevřít zpočátku poněkud děsivě vypadající druhý terminál window--
vzdálené ladění od hostit takové a such--
a my se vrátíme k tomu, co všechno to znamená, že zanedlouho.
Ale co je důležité pro tuto chvíli je to, že červená tečka byl zasažen,
ladicí má úmyslně pozastavena execution--
ne na této lince sám o sobě, ale na první řádek aktuální kód v této funkci.
A to je důvod, proč je řada sedmi nyní zvýrazněn žlutě.
>> A teď pojďme se podívat na pravé straně.
Vypadá to, že ve výchozím nastavení, dost hezky, x má jakou hodnotu?
0.
A y má jakou hodnotu?
Zero.
A to je třeba očekávat v tom smyslu, že x a y-, že žlutý line-- má
neprovede dosud.
Takže x by neměly mít hodnotu 1.
To by mohlo mít jinou hodnotu, tzv hodnota odpadky.
A máme to štěstí, že je to nulu v tomto okamžiku, v podstatě.
>> Takže teď je tu jen málo Tlačítka musíme starat
o tom, kdy ladění tímto způsobem.
Všimněte si, máme tlačítko Play.
A pokud budeme hrát, nebo hit pokračovat, to je jen
se projít zbytek programu
nebo dokud nenarazí další zarážku.
Ale já jsem to nastavit libovolný jiný Zlomové body, takže je to jen
bude provozovat až do konce.
Tento druh porazí Účelem šťourat.
>> Takže místo toho, o co se starám tyto ikony doprava.
A když jsem se vznášet se nad je, jak byste měli taky,
uvidíte malé tips-- tipy nástrojů.
Tenhle je překračovat.
Teď to neznamená, že přeskočit následující řádek kódu.
To jen znamená, provést jej a přesunout na další, přesunout na další,
přesunout na další.
Jinými slovy, pomocí toto tlačítko, můžu chodit
přes můj kód jeden krok v čase.
Řádek po řádku, a to doslova.
Nyní, na pravé straně to, že je tu ještě jeden
že uvidíme za chvíli.
Jedná se o tzv Step Into ikonu, která je
bude dovolte mi ponor do jiné funkce.
Ale podívejme se to za chvíli.
Takže jdu na tlačítko překročit.
A teď nevšiml, když jsem klikněte Toto tlačítko v pravém horním rohu,
mějte oči zhruba v lokální Proměnné a uvidíme, co se stane s x.
x je nyní 1, protože žlutá linka je nyní proveden
a my jsme se přesunul k lince 8.
A za chvíli y by se snad stane 2.
>> Nyní, nic, co by zajímavé se stane na chvíli.
To vše je, je printf.
A všimněte si, v mém sekundárním terminálu okna, vidím výstup tiskového def.
A teď musím udělat Rozhodnutí jako programátor.
Mohu překročit tuto linii kód, spuštěním to, ale ne
dostat zvědavý, co je uvnitř.
Nebo jsem si skutečně krok do ní a jít dovnitř Swap sám.
Takže pojďme udělat to druhé.
>> Nech mě jít dopředu a klepněte na tlačítko Není Krok přes, ale krok do.
Oznámení, najednou okenní změny
zvýrazněte první řádek kódu v swapu.
To je linka 21.
A teď, co je druh funky je to, když se podíváte sem, jak se očekávalo,
čárka b je 1 a 2, v daném pořadí.
Proč je temp 32767?
Připomínajíc, že ​​teplota, podobně jako prázdný šálek před chvílí,
Zde je deklarována na řádku 21.
Proč 32,000- Chci říct, proč je to jen nějaký divný hodnota?
To jo?
>> Diváků: To není inicializován.
>> DAVID J. Malan: Je to nebyl inicializován.
Takže náš počítač vždy má fyzické paměti.
To má vždy fyzické paměti RAM.
A je tu vždy Zero a jeden je tam, že jo?
Vzhledem k tomu, že jsme pomocí našeho počítač po celý den,
používáte CS50 IDE nebo servery po celý den.
Tak, že RAM buď má nějaké nuly, nebo někdo je nebo některé nuly a jedničky.
Bez ohledu na to, zda je či ne, že je máte používat.
Nemůžete jen tak prázdný prostory, kde chcete bitů.
Jsou to buď nuly a jedničky.
>> Tak to dopadá, že teplota, protože jsme není inicializována to ještě,
máme ty 32 bitů, ale jsem ne byl inicializován na jakékoliv známé hodnoty.
Takže všechno, co byli nejvíce naposledy použité for-- těch 32 bits--
jsme jen vidět artefakty některých předchozí použití těchto zvláštních 32
bitů.
Jakmile jsem klepněte na tlačítko Krok přes ačkoli, uf, temp dostane hodnotu 1.
A pokud bych to znovu, a je Chystáte se mít hodnotu 2
a pak b se chystá mít hodnotu 1.
>> A tak to, co je teď pěkná na tento bod v příběhu
je to, že je debugger mi ukazoval, super pomalu
v mém vlastním tempem, jaké stav swapu je.
Nevšimnout nahoře tady, oznámení že zásobník volání skutečně
má dvě vrstvy na to.
Nyní se ten, který je označen jako Swap, když jsem klikněte na hlavní místo,
Všimněte si, jak místní proměnné změnit proto, že vývojář může jen hop
kolem a jít do jakéhokoli jiného rozsahu.
Takže i když to děláme tohle všechno pracovat a správně vyměňovat A a B,
když půjdu tam a zpět mezi Swap kde a je 2 a b je 1 a Main,
byl hlavní byl ovlivněn vůbec?
Ne.
Takže to, co je tady stánek s jídlem?
No, to ukáže, že kdykoliv volání funkce, jako Swap,
a předat ji argumenty, co budete procházet k funkci Swap
V tomto případě je kopie z těchto argumentů.
Takže v případě, x a y jsou každý v tomto pořadí 32 bitů, co Swap je stále
je dva nové místní proměnné, nebo argumenty,
volal a B- ale ty jsou libovolné names-- ale vzor nul
a ty uvnitř A a B jsou seřadili že je totožný s x a y
ale oni nejsou totéž jako x a y.
>> Je to jako kdyby Main má na svém kousku papír číslo 1 a 2 pro x a y,
a pak, když to ruce, které kus papíru Swap,
Swap velmi rychle dostane jeho vlastní pero, zapíše
1 a 2 na vlastním listu papíru, ruce zpět původní XY Hlavní
a pak dělá jeho vlastní ta věc s a a b.
A toto je nyní mimořádně důležité, protože to má netriviální důsledky
pro skutečně psaní správný kód protože to by se zdálo, že nemůžeme vyměnit
dvě proměnné.
>> Napsal jsem správnou funkci Zaměnit.
Vytvořili jsme to s Lauren as správná funkce swapu ve skutečnosti,
ale zřejmě nic z toho záležitosti, pokud nemůžete vlastně
zaměnit dvě hodnoty trvale.
Takže potřebujeme jiný způsob se skutečně dostat na to,
a musíme být schopni tento problém skutečně vyřešit.
A ukazuje out-- a my přijdeme zpět do tohoto konkrétního obrázku
Před long-- to je jedním ze způsobů, můžete čerpat paměti počítače.
Je to jen obdélník.
Mohl bys ho nakreslit jakýkoliv řada způsobů, ale je to
vhodné nakreslit to jak obdélník z následujícího důvodu.
>> Chystáme se začít dnes a za mluví o tzv zásobníku.
A stack je jen kus z RAM-- kus memory--
že funkce mají přístup , když se jim říká.
A tak se ukáže, že na na samé dno tohoto zásobníku
je místo, kde všechny hlavní je lokálních proměnných a org C a org V a všechny ty věci
se chystáte jít ve výchozím nastavení. A pokud Main volá nějakou jinou funkci, jako Swap,
dobře, Swap se chystá získat další Vrstva paměti až nad ní.
>> A tak jen aby vám rychlé zběžnou obrázek o tom, jestli jsem jít přes here--
a dovolte mi, abych zrcadlit to na nad hlavou as well-- co se skutečně mám,
pokud se staráme jen o Spodní část obrázku pro tuto chvíli,
je, že když jsem spuštění programu a Main se zavolá,
Hlavní je dána kus RAM v mém počítači, který je
ve spodní části této takzvané zásobníku.
A já budu kreslit záměrně jako čtverec.
Takže je to jako 32 bitů nebo čtyři byty.
A je-li tato hlavní funkce má proměnnou s názvem x s hodnotou 1
a to má proměnnou s názvem y s hodnotou 2, to je
jako při tento plátek paměti Hlavní byl dán provozními
Systém a rozdělí to tak, aby první místní proměnná jde zde,
druhá jde tady, a to je vše.
>> Když Hlavní volá swap, Swap získá svou vlastní krajíc paměti
že budeme čerpat takhle z operačního systému,
a bude to mít své vlastní lokální proměnné na bázi
Na naší implementace dříve s lokálními proměnnými
a b, které zpočátku získat hodnoty 1 a 2.
Ale pak, jakmile swap kód provede,
a Lauren vlastně swapů Věst a mléko, co se děje?
No, to 2 se stává 1, tuto 1 se stává 2, a mimochodem,
tam je teplota proměnná, která je bytí použity, že celou tu dobu, že nakonec
jde pryč.
Ale to nezáleží na tom, kolik práce děláte
v tomto řádku of-- v této paměti, x a y jsou zcela nedotčené.
>> Takže potřebujeme nějaký způsob, jak dát Swap a funkce jako to
tajný přístup, chcete-li, aby Funkce jako-- do paměti jako x a y.
Takže pojďme se podívat na příklad, která pomáhá
nám vidět přesně to, co je to děje na celém tomto období.
Chystám se pokračovat a otevřít si porovnejte Zero.
A já jdu zavřít naše debugger, jdu
zavřete tuto děsivé vypadající zprávu spravedlivý říká, počkej,
jste ve středu ladění.
Chystám se tu schovat tuto záložku prostě se vrátit k jednoduchosti.
Takže nebojte se, pokud je zabit GDB.
To prostě znamená, že program má bylo skončit, záměrně v tomto případě,
mě.
>> A teď si porovnejte Zero to dělá.
Jsem pomocí CS50 Knihovna ve standardním I / O.
Mám ten první hlavní funkci říká, něco říct, a dostane řetězec.
Pak říká, že znovu a dostane další řetězec.
A všimněte si, že tyto dva řetězce se nazývají S a T, v daném pořadí.
A nyní tento program, Porovnat Zero, jeho účel v životě,
to má se mi říct, jsem zadejte totéž?
A tak jsem se vracím do týdne jednu.
Já používám svůj rovný rovného operátor která je provozovatelem kvalita.
Ne operátor přiřazení, operátor rovnosti.
Já jsem jen porovnáním s a t.
>> Takže pojďme skutečně jít do toho a to udělat.
A budu pokračovat a dělat si porovnejte Zero.
Budu dělat ./comparezero.
A já jdu vpřed a říci něco
jako, pojďme dělat mámu malými písmeny a jak se o matce velkými písmeny.
A samozřejmě jsem psát různé věci.
Dobře.
To je to, aby se dalo očekávat.
>> Pojďme jej spustit znovu.
V obou případech dělat malá písmena, malá písmena.
To vypadá super totožný se mnou.
Enter.
DOBŘE.
Možná je to jen trochu divné, protože to nelíbilo mé gramatiku.
Takže pojďme udělat kapitálu MOM, kapitál MOM, identické.
Různé věci.
>> Tak proč je to?
No, co se vlastně bude Na pod pokličku tady?
Takže pojďme se přes Zde na chvilku
a zvážit, co GetString je ve skutečnosti dělá.
Při volání getString, to je funkce jsme
Sami psal a to nějak dostane sled charakterů od uživatele.
A předpokládejme, že první Tentokrát jsem zavolat getString, že mi dává
kus paměti, která vypadá takto.
A když jsem napsal v malými m-o-m-- a to, co jde po něm?
Jen rychlý check zdravý rozum.
>> Zpětné lomítko nula.
Víme, že.
A připomněl, že jsme hráli kolem Zamila jménem
a spoustu dalších jmen když Rob se sem dívá
na to, co se děje v paměti.
Tak, že příběh je to přesně to samé.
To je to, co GetString se vrací ke mně.
A teď, můj kód před chvílí uložen vrácená hodnota getString
v proměnné nazvaný s.
A pak podruhé jsem volal to, to uložena v proměnné s názvem t.
>> Takže když jsem jít sem, potřebuji kreslit této místní proměnná--
a já obecně jít do kreslit řetězec jako jenom-- my budeme
říkají S- jako malé náměstí zde.
A teď, jak se máma somehow-- jít dovnitř této proměnné s?
No, musíme se vrátit zpět na prvních principů zde.
Co je to vlastně GetString vrací?
>> Tak to dopadá, že M-O-M backslash nula, a jakýkoliv počet
ostatních řetězců v paměti, jako je Zamila a Rob nebo Andy, nebo jakékoli jiné,
jsou samozřejmě v našem RAM počítače nebo paměti.
A vaše RAM má jako-- máte koncert paměti RAM, dva koncerty RAM,
nebo miliarda nebo dvě miliardy bajtů, nebo možná ještě v těchto dnech.
Takže pojďme se předpokládat, pro dnešní účely, že nezáleží na tom, jak jsme se počítat
je, ale můžeme počítat každý z těch miliard, nebo dvě miliardy
nebo čtyři miliardy bajtů.
>> A ať to jen říct, že svévolně toto je první sousto, druhým skus,
Třetí, čtvrtý.
Já záměrně nepoužívají nula dnes ale vrátíme k tomu.
Takže jinými slovy, zda se jedná o vůbec poprvé jsem pomocí programu,
Já jsem jen na to, štěstí a první kousnutí je v jednom místě pak dvě
pak tři než čtyři.
A když jsem si kreslení, číslo schránky dvou miliard by cesta sem.
>> Tak co si myslíš, a pak, GetString vlastně vrací?
Není to vrací M-O-M zpětného lomítka zero per se, protože to jasně
se nevejde do pole, které jsem natažený.
Takže co jiného by mohlo getString vlastně se vrátí všechny tyto týdny?
Odpověď je na board někde tady.
Můžete nevejde M-O-M zpětné lomítko nula, Takže to, co by mohlo mít smysl místo?
Pokud byste měli být super chytrý, uvedení na tzv inženýrství klobouk,
co byste mohli vrátit?
Co je to nejmenší množství informací jste mohli vrátit, že by stále
vám umožní najít M-O-M v paměti?
To jo?
>> Diváků: One.
>> DAVID J. Malan: One.
A proč jeden?
Diváků: Vzhledem k tomu, že by se říct, vám kam jít [neslyšitelný].
DAVID J. Malan: Přesně tak.
Já jsem jen jít na zpáteční adresu řetězce, které jsem dostala.
Adresa v tomto Případ je lokalita jednou.
Takže to, co opravdu je uložen v S- a každý řetězec variabilní tak far--
právě bylo adresa tohoto řetězce.
>> Mezitím, když jsem volat GetString podruhé a já
zadejte doslova stejný thing-- M-O-M s lowercase-- M-O-M
a další zpětné lomítko nula, a teď možná můj program je
běží již delší dobu, takže možná to je 10, to je místo 11, to je 12,
to je 13.
Počítače používající jiné paměť z jakéhokoli důvodu.
Co teď chodí do mé druhé proměnná v mém program T?
10.
Přesně tak.
>> A tak, když se podíváme na Zdrojový kód tohoto programu
kde jsem prostě snaží pro srovnání dvou hodnot,
Je to rovná rovná t, co je zřejmá lidská odpověď?
Právě proto, že ne 1 se nerovná 10.
A tak zde táboří příležitost pro nás opravdu
prostě jít zpátky do znovu, nejprve principy a přemýšlet o tom, dobře,
co se děje pod kapotou?
Mluvili jsme o bity a bajty a paměť,
ale ve skutečnosti je to užitečné pro pochopení proto, že když zavoláte getString,
i když si myslíme, že to je vrácení M-O-M nebo řetězec máma
nebo Andy nebo Zamila nebo podobně, technicky
je to jen vrací adresu tohoto kusu paměti.
>> Ale to je v pořádku.
Vzhledem k tomu, jak mám vědět kde řetězec končí?
Pokud jsem jen dal na začátku?
No, zpětné lomítko nula, ne?
Právě v lineárním čase mohu vytisknout s potiskem def M-O-M.
A jakmile vidím zpětné lomítko nula, je mi jedno, kde jsem začal,
Já už vím, implicitně kde musím skončit.
>> A tak dnes označuje beginning-- a dovolte mi, abych to dramaticky, protože jsme
prošel spoustu problémů na získat tyto zde školení wheels--
tak dnes školicí kola začátek sundat a my odhalit na least--
>> [APPLAUSE]
>> To bylo dobře stojí za výlet k TARGETu dnes ráno, ano?
Takže now-- existuje, se ukazuje out, žádná taková věc jako řetězec.
Řetězec neexistuje.
Je to synonymum, že jsme měli uvnitř knihovny CS50.
Od té doby, budeme začít volat s a t nejsou řetězce, ale char hvězdy.
A char hvězda my budeme šprýmaři odděleně zanedlouho.
Ale to znamená, že i když budeme pokračovat
použití getString teď, technicky bych měl
říkat char hvězda a char hvězdu.
>> A ukázalo se, co to hvězdu bude pro označení je něco
nazýván ukazatel nebo adresa.
A ve skutečnosti, teaser za to, co je před námi
Je to 20 sekund klip z našeho přítel Nick Parlante na Stanfordu
kdo, před nějakou dobou, stráví směšné množství času,
jak nejlépe mohu říct ve svém kuchyňské nebo jeho suterénu,
Díky claymation zavádí do světa
charakter jmenoval Binky s kým budeme
být zavedeny příště na ukazateli.
Takže tady je náhled na to, co přijde.
>> [VIDEOPŘEHRÁVÁNÍ]
>> Hej, Binky.
Probudit.
Je čas na ukazatel zábavu.
>> -Co je to?
Další informace o ukazatele?
Oh, dobrota.
>> [END Přehrávání]
DAVID J. Malan: A v takovém případě, Vás budeme vidět ve středu.
Dobře.
Kdo je tanec?
No tak.
Kdo je tanec?
Chceš, abych si to začalo?
Budu si to začalo.
Woooo!
>> LAUREN: Sladké fantazie Mojžíš.