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