>> DAVID J. Malan: Ovo je CS50 i ovo je početak tjedna četiri.
I, dječak je Volkswagen u Problem sve zbog softvera.
Neka nas pogledajte.
[VIDEO PLAYBACK]
-Cars, Najpametniji likovi u Brzi i žestoki filmova.
Ovaj tjedan njemački proizvođač automobila Volkswagen našla
usred skandala od potencijalno kazneni proporcije.
>> -Volkswagen Se pripremaju za milijardama u kazni, moguća kaznena prijava
za svoje rukovoditelji, kao tvrtka ispričava
za namještanje 11 milijuna automobila pomoći da tuku ispitivanja emisija.
>> -Certain Dizel modeli su dizajniran sa sofisticiranim softverom
da korištene informacije uključujući položaj upravljača i vozila
brzina kako bi se utvrdilo je automobil bio prolazi kroz testiranje emisije.
Pod tim okolnostima, motor bi se smanjila emisija otrovnih.
No auto je namještena na obilaznici da kada je potaknuto.
Emisije povećana 10 do 40 puta iznad prihvatljive razine EPA.
>> [END PLAYBACK]
>> DAVID J. Malan: Pa neka je pogledajte ovo
i vidjeti točno kako to može se provoditi
i kako bi to moglo utjecati na toliko automobila kao što je ovaj.
Tako je u ruci ovdje su novinari izdanju koje je izdalo EPA--
zaštite okoliša Agencija za zaštitu koja
je regulatorna agencija SAD da ručke brige za okoliš,
te stvarna Pravna obavijest da je
pošalji Volkswagen je samo nekoliko dana.
>> Dakle EPA piše i objavljuje se sada javno, sofisticirani softver
Algoritam na sigurno Volkswagen vozila detektira
kada je automobil u tijeku Ispitivanje službene emisije
i pretvara pune emisije kontrolira se samo tijekom ispitivanja.
Učinkovitost to zagađenje vozila
kontrole emisije uređaja je uvelike smanjuje vrijeme sve normalne vožnje
situacijama.
To rezultira u automobilima koji zadovoljavaju standardi u laboratoriju ili testiranje
stanica, ali tijekom normalnog rada emitiraju dušika oxides-- ili NOx--
na do 40 puta standarda.
Softver produkciji Volkswagen je citat citat, poraz uređaj,
kao što je definirano Očisti Zakon zraka u SAD-u.
>> Oni idu na to reći da EPA i druge agencije
otkrila Poraz uređaj Softver nakon neovisne analize
istraživača na Zapadu Sveučilište Virginia.
NOx zagađenje doprinosi dušikov dioksid, ozon prizemlju,
i fino čestica.
Izloženost tih zagađivači je povezan
sa širokim rasponom ozbiljne zdravstvene posljedice,
uključujući povećanu astmu napada i drugih respiratornih
bolesti koje mogu biti dovoljno ozbiljne poslati ljude u bolnicu.
Izloženost ozonu i čestica ima također
bio povezan s prerano smrti zbog respiratornih
ili kardiovaskularne učinke vezane.
Djeca, starije osobe, osobe s prethodnih bolesti dišnog sustava
su posebno u opasnosti za zdravstveni učinci tih zagađivača.
>> Dovoljno je reći, to je prilično ozbiljna.
I idemo dalje čitati Samo još jedan izvadak
a onda ćemo pogledati temeljni implikacije
to u kontekstu automobila.
Naime, Volkswagen proizveden i instaliran
Softver u tzv elektroničko upravljanje
module-- ili ECM-- od ta vozila koja osjetili
kada vozilo testira na usklađenost sa standardima emisije EPA.
Na temelju raznih ulaza uključujući Položaj upravljača, vozilo
brzina, trajanje motora rad, a tlak zraka,
ti ulazi upravo pratiti parametre
savezne ispitnom postupku za Ispitivanje emisije za EPA certifikacije
svrhe.
>> Tijekom ispitivanja emisije EPA, softver vozila ECM
ran softver koji proizvedenu Rezultati popustljiv emisija.
U svim drugim vremenima, Softver ECM vozila
vodio poseban cestu kalibracija koja smanjuje
učinkovitost Cjelokupni sustav kontrole emisije,
posebno selektivna katalitička smanjenje Lean NOx trap--
što ćemo vidjeti u jednom trenutku.
Kao rezultat toga, emisije NOx povećan za faktor od 10 do 40 puta
iznad razine EPA popustljiv ovisno o vrsti pogona ciklusa.
>> Dakle, što to zapravo znači, a izvorni kod za softver trčanje
na Volkswagenov nema Još javno objavljeni,
je da učinkovito, ovaj ekvivalent je negdje tamo unutra
Volkswagen koda.
Ako se testira, i ako je automobil otkriva određene okolišni čimbenici
poput upravljača položaj ili pokret
ili nedostatak istih auta ili bilo koji drugi broj čimbenika
koji su trenutno pretpostavili biti dio ove formule,
oni jednostavno uključite kontrolirati puni emisije.
Drugim riječima, oni počnu emitira manje od zagađivača.
>> Inače, u svakoj drugoj situaciji kada to nije otkriven kao
u laboratoriju, oni jednostavno ne.
I tako da možete pojednostaviti ovaj u više beton pseudokod s nečim
kao ovo.
Ako su kotači se okreću, ali volan nije, sugestivna
da je automobil na neke vrsta rotirajući cilindar
ali u nekakvoj Skladište se ispituje,
ponašaju se kao EPA će vam se svidjeti.
Inače ne.
Tako ćemo pogledati na kratkom videu koji
ima pogled na ono što implikacija su to zapravo mehanički.
>> [VIDEO PLAYBACK]
>> -Last Petak EPA je objavila da su neki Volkswagen Audi automobili su između 2009.
a ove godine su pomoću takozvani uređaj za neuspjeh
da se oko zakona emisija osmišljen kako bi zrak čist.
No, što to točno znači?
>> Pa, moderni automobili imaju desetke računala unutar njih.
A neki od tih računala koordinirati pomoć funkcije
motora za optimalno performanse, dok pazeći
da nema previše smeća izlazi iz ispušne cijevi.
Oni su zapravo radili Na taj način za nekoliko desetljeća.
Uglavnom, svaki dio modernog automobila motora
ima senzor ili kontroler na njemu, i tim računalima
čitate u podacima tisuća puta u sekundi prilagodbe čineći
kao omjer goriva u zraku što se događa u cilindre.
>> To varanje Volkswagen i Audi modeli su dizelska,
a dizelska imaju još jedan stvarno važno računala
kontroliranih parametara, što je količina neizgorenog goriva ide
u ispuhu.
Sada to zvuči loše.
Ne zvuči kao da bi htio neizgorenog goriva ide u ispuhu.
No, u slučaju A. dizel, imate nešto
naziva NOx zamka koji je uređaj koji upija i zamke za dušikovih oksida
koji su zagađivači koji bi inače idu u atmosferu.
I učinak tog NOx zamke je pojačan s neizgorenog goriva.
Dakle poraz uređaj poseban program unutar tih računala koji mogu to učiniti
izgleda kao automobil zadovoljava emisije Standardi čak i kad to ne čini.
Volkswagen je imao problema na svojim rukama.
Njegovi dizelski motori bili poznati za dobivanje veliku potrošnju goriva,
ali NOx zamka jedino dobro radi kada se koristi više goriva.
Tako automobil će otkriti, koristeći ovaj poraz uređaja,
kada je dobivanje emisije test, to će koristiti više goriva,
napraviti NOx zamku rade dobro, Emisija će biti u redu.
Ali onda ćete dobiti na putu, uređaj isključuje, ti si gori manje goriva
ali ste stavljajući čak 40 puta više onečišćujućih tvari u atmosferi.
Ali kako je pakao učinio auto zna da je to bilo
se ispituje za poštivanje emisija?
EPA kaže da je sofisticirani sustav koji provjerava stvari
kao i položaj kola upravljača, brzina, koliko je motor bio uključen,
pa čak i atmosferski tlak.
Drugim riječima, bilo je ni na koji način je to bilo slučajno
jer softver je dizajniran vrlo pažljivo otkriti
službena ispitivanja emisije.
To je neke prilično ozbiljne obmana i da je
Zašto Volkswagen je u kao ozbiljan problem.
Naime, njihov izvršni direktor Martin Winterkorn, samo odstupio.
>> Dakle, što se dalje događa?
Pa, ako ste jedan od polovice milijuna dizel jettas, Beatlesi, golfs, Passats,
ili Audi A3s izvršiti, Dobra vijest je je
da je vaš automobil je još uvijek sigurno voziti.
Ne morate ga staviti daleko dok Volkswagen izdaje opoziv.
Ali u nekom trenutku oni Vjerojatno će imati
za ažuriranje softvera unutar vašeg automobila.
Kada se to dogodi što bi moglo dobili manje milja po spremniku.
Odvjetnici su već pripremaju za klasa akcija tužbe
tako da vlasnici mogli dobiti naknadu u nekom trenutku u budućnosti.
Ali to neće dogoditi u skorije vrijeme.
>> [END PLAYBACK]
DAVID J. Malan: Dakle, to je zapravo postavlja zanimljivo veća slika Pitanje
kao povjerenje.
Pravo?
Svatko od nas ima iPhone ili androida ili nešto u našim džepovima najvjerojatnije
ovih dana, ili prijenosna računala na našim krugova koji su
trčanje softver koji je Apple i Microsoft
i grozdovima drugih tvrtki.
Ali kako znamo da je ono što ovi softverski proizvodi rade
je zapravo što je to tvrtke kažu da rade?
>> Na primjer, tko je to kažu da svaki put kada
napraviti telefonski poziv na vašem iPhone ili android telefon ili slično,
da je telefonski broj također nije prijenosa na društvo poslužitelj
zbog nekih programa ste napisano, da li je operativni
Sam sustav kao iOS ili Android, ili zato što ste preuzeli
neke treće strane aplikacija da nekako sluša
za sve što upisujete ili sve što ste zapravo govori.
Kako ćete znati da je, kada je vi radite zveket
ili Napravite sastaviti svoj vlastiti softver u CS50, kako
da li vi da je CS50 vlastiti osoblja, putem u CS50 knjižnici,
nije bila prijavom svaki string ste ikada stečen
ili svaki inch ste ikada stečen?
Pa, svakako bi mogao izgledati na izvorni kod za nečim
kao CS50 knjižnici, što mogao pogledajte izvorni kod
za Linux operativni sustav trčanje na CS50 IDE.
Ali nevjerojatna prezentacija je dobio natrag u 1984
prima Turing Award mehanizmom vrlo poznati računalni znanstvenik poznat
as-- imenu Ken Thompson, koji dobila Turingov nagradu koja
je vrsta računalne znanosti a Nobelova nagrada, ako hoćete,
za svoj rad na operativni sustav pod nazivom
Unix, koji je vrlo sličan u duh ono što mi koristimo što je Linux.
A pitanje je pitao u njegovu govoru, bitno
kojom se utvrđuje okvir za godina i godina rasprave
o povjerenju i sigurnosti, bio je to.
U kojoj mjeri bi jedan veruje Izjava da program-- komad
od softverskoj je bez trojanskih konja?
Možda je važnije povjerenje ljudi koji su pisali softver.
>> A u stvari, mi smo povezani na razgovor koji je
dao prilikom prihvaćanja ovu nagradu u 80 na CS50 web stranici
ispod stranici predavanja za danas.
Jer ono što ćete vidjeti je da je on zapravo daje
prilično jednostavan primjer kako čak prevodilac kao jeka ili što god
Sastavljači drugi su korišteni u prošlosti, što ako ugrađen u prevodilac mi
sami koristite je malo, ako uvjet da u biti, kaže,
Ako primijetite da je ovaj broj koristi GetString funkcija ili GetInt
funkcija, ići naprijed i umetnite stražnja vrata ili trojanski konj
tako da taj program Sada ima neke nule
i one koji rade nešto zlonamjerni.
Prijava sve svoje tipke, prijenos te podatke
na neki server, ili stvarno ništa.
>> A što je Ken Thompson nastavlja raditi u svom govoru
je pokazati da čak i ako imate pristup izvoru
kod prevodilac koji zlonamjerno moglo biti to,
to ne smeta, jer postoji ova kokoš i jaje
stvarnost pored mnogih godine pri čemu se poželjni prevodiocima
koriste se sami sastaviti.
Drugim riječima, put natrag kada netko je da je napisao prvi prevodilac.
A nakon toga, svaki put oni su ažurirani prevodilac promjenom izvornog koda,
dodavanjem značajke i ponovnim za ljude poput nas za korištenje, dobro,
oni koriste stari verzija prevodilac
sastaviti novi verzija prevodilac.
A ako pogledamo na razgovor koji je dao,
vidjet ćete da je zbog toga te cirkularnosti,
zapravo možete imati greške ili Trojanski konji ugrađeni u softver
mi koristimo.
A čak i ako pogledate na izvorni kod za te programe,
ne bi čak moglo biti vidljivo jer je zapravo varanje
u nekom starijem verzija prevodilac koji je tada bio
ubrizgavanje prijetnju u našem softveru.
>> Što je samo reći, da zapravo ne može i ne smije
Povjerenje softver trčanje na našim prijenosnicima ili telefon ili bilo koji broj mjesta.
A u stvari, kasnije u ovom semestru kada možemo početi govoriti o web programiranje
i zapravo početi graditi web aplikacije sebe,
ćemo govoriti o tim prijetnje i drugi.
Sad, možda ste se pitali i primijetio da je maleni malo Darth
Vader u isječaka koje Rubu je pokazivao postoji
O Volkswagen. Ukoliko nikada nisam vidio, ja
mislili smo trebali osvijetliti raspoloženje, jer je to sve
vrlo depresivan i zastrašujuće.
Idem gledati natrag na Super Bowlu 2011. godine
kada komercijalne strane Volkswagen-- i to
gotovo ih čini simpatičan again-- emitiran je prvi put na TV-u.
To je drugi isječak 60 mislim da ćete uživati.
[VIDEO PLAYBACK]
[MUSIC - TEMA IZ "Zvjezdani ratovi"]
[Pas laje]
[CAR POČINJE]
[END PLAYBACK]
DAVID J. Malan: Da.
Samo sam ček.
To auto je na popisu kršenja.
U redu.
Dakle, mi gledamo na neke pseudokod prije trenutak.
I ovdje je veći Isječak koda pseudokod
kako smo vidjeli nekoliko puta do sada.
I neka je koristiti to je prilika sada uvesti novu programiranje
tehnika koja smo učinili vidi algoritamski
prošli tjedan, kada smo pogledali spajanje vrste.
Ali budimo formalizirati i vidjeti kako možemo ga koristiti u stvarnom koda,
a onda ćemo to iskoristiti Tehnika cestom najviše
vjerojatno riješiti neke druge probleme.
>> Dakle, to je bio jedan od prvih programa smo ikada napisao, iako u pseudokod koda.
A ono što ovaj program omogućio nam je činiti tečaj
bio je pronaći Mike Smith u telefonskom imeniku.
I primjetiti u pojedinim linijama osam i 11 koji je imao tu Idi na izjavu.
A u stvari, sigurno jezika, C među njima,
zapravo nemamo izjavu da je doslovno
ići koji vam omogućuje da skok na određenoj liniji.
To je općenito namršti zbog to može biti vrlo lako zlostavljani
i možete početi skakati svoj Program sve više mjesta u odnosu
na korištenje vrste logika i kontrolu protoka
da smo se koristi do sada sa samo petlje i uvjeti i slično.
>> Ali možemo pojednostaviti ovaj algoritam u pseudokod koda kao što slijedi.
Umjesto toga iterativan ili petlje pristup
gdje smo zadržati ide natrag i natrag i vratiti da se postroje tri,
zašto ne bismo samo vrsta čamac i više obično kažu u skladu sedam i 10,
Samo zamijeniti ta dva para linije s,
drugo, ako je ranije Smith u knjizi mi ćemo
tražiti Mikeom u lijeva polovica knjige.
Inače, ako je Smith kasnije u Knjiga, potražite Mike u pravu
pola knjiga.
I primijetiti već zakrivljenosti.
Pravo?
Ja sam u potrazi za Mikea u telefonskog imenika, a zatim
I na kraju, možda pogoditi linije sedam ili možda linije 10
a moja poduka sebi je potraga za Mikea u polovici telefonskom imeniku.
Pa, kako mogu tražiti Mike?
Ja sam u sredini u potrazi za Mike, zašto
ste vrsta me poslati u krug?
No, to je u redu, jer ono što je događa na veličinu problema,
kako piše u liniji 7 i 10?
Mi ne samo da govori pretragu za Mikea, potražite Mike.
Mi izričito kaže što?
Traži za njega u lijevoj polovici pravo na pola što je učinkovito
upola manji od problema.
Tako da je u redu da smo vrsta sudjelovanje u ovom cirkularnosti,
to kružni argument, jer barem smo
što je problem manji i manji.
I na kraju ćemo doći da tzv baze slučaj kada
imamo samo jednu stranicu left-- kao naš volonter prošlog tjedna
did-- imali smo jednu stranicu lijevo i onda mi ne
morate držati u potrazi za Mike Smith zato što je bilo na toj stranici
ili nije.
>> Pa kako možemo provesti tu ideju, taj vrsta cirkularnosti u stvarnom kod?
Pa, možemo utjecati tehniku koji je općenito poznat kao rekurzije.
A vidjeli smo to u pseudokod za spajanje vrsta prošlog tjedna.
Sjetite se da je to bio pseudokod za spajanje vrste.
To je vjerojatno i jednostavnije nego mjehurić ili odabir ili umetanje sortiranje
Samo u smislu jednostavnosti s kojima možete izraziti.
>> Ali to je zato što Mi smo vrsta cirkularno
govoreći, tražiti nešto u potrazi za njim opet.
No, mi smo u potrazi bilo na lijeva polovina ili pravo na pola
i onda na kraju smo spajanje u ovom slučaju.
No, ovdje, previše, s ta dva sortiranje linije,
smo opet imati ovaj ideja rekurzije.
A konkretno što to znači, u kontekstu algoritam,
je da algoritam je rekurzivna ako se koristi ili se poziva.
>> Ili u odnosu na C, funkcija je recursive-- funkciju pod nazivom
foo je rekurzivna ako foo, negdje u svom izvornom kodu,
poziva funkciju sama foo.
I to je loše ako sve foo nikad ne je sama i opet nazvati.
To je u redu ako foo vremenom prestaje, kao što to čini spajanje vrsta, rekavši, čekaj malo,
Ako se taj problem je super male, na primjer,
ili nađoh onoga koga sam u potrazi za, samo se vrati.
Ne rekurzivno, ne ciklički sam opet nazvati.
>> I tako ćemo pogledati kako to može zapravo raditi.
Tako ću ići naprijed i otvoriti do dva izvorni kod primjera ovdje.
Od kojih je naziva sigma 0.
A to uopće nije rekurzivna, ali uzmimo
Pogledajte što ovaj program radi.
Ja sam izvlaciti sve komentari, ali sve
izvornog koda na CS50-a web stranica ima komentare ako
želite pročitati kroz nju ponovno kasnije.
I neka je napraviti par razuma provjerava ovdje.
>> Dakle, na vrhu ovog koda, imamo uključuju CS50.h.
Što učiniti?
Zašto je ovdje?
U razumne laik uvjete.
Što to radi?
Da.
>> PUBLIKA: Tako da GetInt funkcija radi.
>> DAVID J. Malan: Da funkcija GetInt radi.
Zbog toga unutrašnjost datoteka, CS50.h, koji
vidjet ćemo ubrzo u Uvjeti izvornim kodom,
ima hrpa funkcija declared-- GetInt, GetString,
i hrpa others-- i ako smo zapravo da Uključi liniju,
prevodilac zveket nije će znati da ona postoji.
A isto vrijedi i za liniju dva u kojima se definira int
printf, koji je u funkciji držimo pomoću vrlo malo.
Sada, linija četiri čini malo funky jer to je samo jedan brod.
To je dobio zarez, bez kovrčava aparatić, nema kod unutar nje.
No, ono što je učinio mi zovemo ova stvar je u prošlosti tjedna?
Da.
Dakle, prototip.
A zašto imamo prototip koji čini
da se malo suvišan obično, jer mi obično
ponovno vidjeti funkciju kasnije u spisu, zar ne?
Pa zašto mi have-- ste upravo grebanje glavu, ali ja ću ga uzeti.
Da.
>> PUBLIKA: [nečujan] Funkcija nakon što je glavni.
DAVID J. Malan: Točno.
Tako da je prevodilac vas zna na kraju će definirati ili provesti
da funkcija nakon glavna, vjerojatno.
Dakle, zveket i većina Sastavljači su vrsta glupi
i oni će se samo zna ono što im kažem.
A ako želite koristiti funkcija zove Sigma,
bolje naučiti prevodilac da postoji unaprijed.
>> Sada, glavni sama, čak iako je hrpa linija,
je prilično poznato nadamo do sada.
To je dobio do while petlja čija je svrha u životu
Ovdje očito je da biste dobili pozitivni cijeli broj od korisnika.
I samo zadržati ga gnjaviti ili nju dok ne surađuju.
Onda u redu 16 Imam zanimljiv poziv.
IntAnswer.
Koji na lijevoj ruci strana mi daje Int
što može store-- zove Answer-- koja će se pohraniti, očito,
povratak vrijednost sigma.
Dakle, Sigma je samo proizvoljna, ali smisleno ime
da sam dao u funkciji čija je svrha u životu
je da se jedan argument-- ćemo ga nazvati N u ovom case--
i samo da se iznos od tog broja plus svaki pozitivan broj koji je
manji od njega.
>> Dakle, ako sam proći broja 2 do sigma, želim dodati 2 plus 1
plus 0-- ne 0-- tako da mi daje 3.
Ako sam proći 3 do sigma, želim ima 3 plus 2 plus 1, što mi daje 6.
I tako dalje.
Dakle, to je samo zbraja sve brojeve manje od ili jednako tome.
>> Sada, ovdje sam samo idem za ispis odgovor.
Dakle kao brzo provjeriti razum, neka je bi sigma 0-- dot udarac sigma 0--
i neka mi tip u 2.
I doista dobiti 3.
Dopustite mi tip u 3.
Ja doista dobiti 6.
I ako bilo tko može učiniti math brzo, ako radim 50 što ću dobiti?
>> PUBLIKA: [nečujan].
DAVID J. Malan: Pa, ne.
No 1.275 što je prilično blizu.
Dakle, ovo je rezultat rade 50 plus 49 plus 48 plus 47 plus 46
sve do 1.
Tako da je sve sigma radi.
Ali da vidimo kako smo ga provodi sada.
Dakle ovdje je sama funkcija.
I to ne izgleda da je ništa s rekurzije još.
U stvari, mi smo rabeći stara škola tehnika.
Ja sam inicijalizacije varijablu zove suma na nulu, onda imam foreloop ovdje
a ja sam proglašena Int zove Ja, postavljanje je jednaka 1--
iako sam mogao postaviti to jednako nula, ali budući da radim toga,
koga briga ako je nula ili jedan.
To će imati učinka.
>> Tako sam iterating tako dugo kao što sam je manji ili jednak m, koje
je argument da je donesen u.
A onda sam samo zadržati povećavati I. i uvid
petlje sve radim radi sumu plus jednako I. I to je namjerno.
Ne želim to učiniti, u ovom slučaj, kao zbroj plus plus.
Želim zapravo dodati trenutna vrijednost I
koji čuva sve veći i veći a veći za trčanje odbrojavati.
>> A onda sam se vratiti svotu.
I tako je odgovor dobiva vrijednost svotu.
A onda sam ga ispisati.
Dakle, postoji mogućnost ovdje ipak, na neki način pojednostaviti
ovaj kod konceptualno i vrsta udarca jedan je
smeta u smislu jednostavnost iako to
potrebno neko vrijeme za sortiranje od cijeniti zašto je to
je moćan u tim malim primjerima.
Ovdje je Sigma one-- tako Druga verzija ovog koda.
Sve do vrha identičan tako ta ista priča vrijedi kao i prije.
No, sada ćemo pogledati na provedba sigma,
Ja sam reducirane na samo njima lines-- četiri linija koda, zapravo,
plus neke vitičastih zagrada i bijeli prostor.
>> Ali što ja to radim?
Ako m je manji od ili jednak nula, moram vrsta rukovanje
da super jednostavan slučaj.
A ako mi ruku nula ili ništa negativna što je samo čudno,
Samo ću samovoljno ali dosljedno vratiti na nulu.
Ne želim ovo na dobiti u neke čudne beskonačnog
petlje zbog negativne vrijednosti.
Dakle, ja samo kažem, ako mi daju nula ili manje, ja se vraćaju na nulu.
>> No, to je dobro, jer to je da jedna stranica iz telefonskog imenika
što je ostalo.
Ja gristi s vrlo specifičan problem i ne zove nešto rekurzivno.
No, u redu 31, što Ne čini mi se da se radi?
Zagradama su samo čuvanje stvari, nadam se, malo jasnije.
Ali sve radim je sam M- povratka god
što me-- plus ruci vrijednost M- žao,
plus vrijednost sigma od m minus 1.
Dakle, što to znači?
Ako mi date broj 3 kao ulaz, odgovor želim dobiti konačnici
je 6 jer 3 plus 2 plus 1 daje mi 6.
Ali kako ja mislim o tome kako je to kod je trčanje?
Prvi put kad sam nazvati sigma i ja proći u vrijednosti 3,
To je kao da kažete na komad papira, ovdje je vrijednost 3
i ja sam prošao to kao sigma.
3 očito ne manje od 0 do IF uvjet ne primjenjuje.
Drugi ne.
Dakle, što da radim?
Želim se vratiti m, što je 3, plus Sigma m minus 1.
Pa neka me pratiti ovo.
Idem staviti ovo komad papira dolje.
A što vrijednost, da se Jasno, ja sam idući u proći
u sigma u ovom trenutku u priči?
Koji broj?
2, zar ne?
3 minus 1 je 2.
Tako sam samo trebate malo komadić papira ovdje.
Tako sada Sigma je dobivanje zove opet.
I ja sam namjerno stavio ovo dolje jer je
vrsta kao pauziranje da je verzija priče
jer sada sam fokusiran na signal m minus 1.
Tako je m 3, m minus 1 2.
Dakle, ovdje je 2 koje sam prošao.
2 je očito ne manje od 0, tako da slučaj ne primjenjuje.
Inače sam se vratiti m, što je to stvar, plus Sigma onoga što vrijednosti?
Dakle, ako Sigma od 1-- jer je m sad 2 do 2 minus 1 je 1.
Dakle, sada imam samo vrijednost 1.
Ja sam prolazi samo broj 1 do funkcija sigma--
ili osobno here-- tako 1 očito nije manje od nule, i dalje se ne primjenjuje.
>> Inače povratka 1 uz Sigma čega?
0.
Pa neka mi samo zapamtite to.
Ja ću se vratiti na to kasnije.
Sada ću ići naprijed i točkica dolje broja 0, jer je to
moj argument ili parametar.
Ja sam prošli broj 0 i na kraju taj proces
samo ponavlja sebi oglas nauseum ne prestaje, jer što
trebam učiniti odmah nakon što vidim ovu 0?
Sam se vratiti na nulu.
Tako sada imate premotati priču.
>> Ako ja sada ići unatrag u vremenu, što je najnovija stvar
Ja sam, ako ste bili doslovno premotavanja video?
Idem pokupiti najnovije 1 i to mi daje 1 plus 0 1.
Ako sam zadržati premotavanje Priča, koja će mi dati
2 plus to prikazuju vrijednosti, što je 1.
Dakle, to je 3.
A onda ću zadržati premotavanja.
Kad sam prvi put spustio broj 3-- tako 3 plus 3 mi daje 6.
>> A sada, ako ste premota video do ove točke,
to je bio vrlo Prvo pitanje koje sam pitao.
Kada prošlo 3, što je Sigma 3?
To je uistinu 6, suma svi ti komadi papira.
Dakle, ako je to potrebno malo da se wrap your mind oko, to je u redu.
Ali smatram da je bio little-- njega bio je vrlo namjerno da sam naslagani
ovi brojevi na vrhu svake druge.
To je vrsta kao vlasništvo memory-- rekord u vremenu,
kao prikupljani u videu, da ja doista mogu premotati u.
A mi ćemo se vratiti da metafora u samo malo.
>> Ali prvo, ispada da postoji puno geeks i smiješnih ljudi,
Mislim, u Googleu.
Bi li netko tko je vrlo dobro googling uma
dolazi se samo na trenutak i mi pomoći tražiti nešto?
Vrlo, vrlo niska ključ.
Netko tko nikad nije doći prije, možda.
U REDU.
Da?
Ajde.
Dođi dolje.
Kako se zoveš?
>> SAM: Sam.
>> DAVID J. Malan: Sam došao na dolje.
To je isto.
Drago mi je.
Hej.
Dođite.
Dakle, sve što trebate učiniti, ako je mogli, Sam, ovdje je Google.
Možete li tražiti pojam rekurzije?
Nemojte pokvariti.
>> A sada let's-- da.
OK Kliknite to.
Bolje kliknite toga.
Ahh, dobili ga.
Ne?
U REDU.
Tako ćemo napraviti par drugih.
Ne toliko vezani akademski ovdje, ali si
ikada tražili Google za anagram?
>> SAM: Ne
>> DAVID J. Malan: U redu.
Traži anagram umjesto rekurzije.
Kako o iskosa.
Jeste li ikad tražili iskosa?
Sad, ovo je malo teško vidjeti, ali nadamo everything's-- OK.
To je samo ti i ja uživam u ovome.
U REDU.
>> Dakle konačno, to one's-- to je malo iskosa.
Sada napraviti barel role.
Divno.
U redu.
Veliko hvala Sam.
Izvoli.
Hvala.
>> Dakle, što se događa u svim tih glupih primjera?
Pa stvarno, ispod haube Googleovi milijuni linija koda
očito je malo glup AKO uvjeti koji su u biti
provjere da li korisnik ima upisali u ovom izrazu,
učiniti nešto što je vjerojatno uzeo Netrivijalno količina vremena
provesti samo biti zabavno na ovaj način.
No, to je sve što zbroji dolje ispod haube.
Ali, naravno, rekurzija je više od geekier
primjer među one posebne trikove.
A sigurno postoji drugi vani kao i da možda nisu ni
otkrio samo još.
>> Pa pogledajte, ili razmotriti Sada sljedeći program,
i svakako iskoristite bilo od njih na putu van.
Ja ću ići naprijed i otvoriti program koji je
će pokušati da zamijene dvije vrijednosti.
No, prije nego što smo ići tamo, učinimo to.
Možemo li dobiti još jedan volonter, mislim?
Želite volontirati?
Ne?
Dođi gore.
U redu.
Dakle, vaše ime je što?
>> LAUREN: Lauren.
>> DAVID J. Malan: Lauren.
Dođi gore, Lauren.
Tako Lauren je bio izazvao ovdje kako slijedi.
Drago mi je.
Tako Lauren ovdje ima ispred njezine dvije prazne čaše.
I mi imamo neke naranče sok i mlijeko
i mi ćemo ići naprijed i učiniti sljedeće.
Samo ćemo ispuniti to.
Nekoliko unci mlijeka ovamo i neka je ispunite malo soka od naranče ovdje.
>> I pred svima ovi članovi publike,
zamijeniti dvije vrijednosti tih šalica.
Stavite sok od naranče u mlijeku kupu a mlijeko u sok od naranče šalicu.
Kako biste to učinili, ako ste bili na kući i imao pristup drugim pomagala?
LAUREN: Stavite ga u još jednu šalicu.
DAVID J. Malan: U redu.
Tako ćemo imati privremeni promjenjiva, ako će.
I ići naprijed i sada provode taj isti postupak zamjene.
Tako dobro.
Mi smo stavili SL u privremeni promjenjiva, mlijeko u SL varijable,
a sad privremena varijabla u varijablu mlijeka.
U REDU.
Dakle, vrlo dobro do sada učinjeno.
Tako ispada out-- drže da Mislio je samo na trenutak.
Evo, samo to monstrum malo, to će biti odgovarajući broj C
da smo upravo provodi.
Imali smo dva ulaza, A i B, oba koje ćemo samo reći zbog jednostavnosti se
int a.
I obavijest ovdje, ako želim mijenjati vrijednosti dviju varijabli, A i B,
mi doista treba posrednik, A privremena varijabla, privremeni šalice,
u kojem je jedna od izlije vrijednosti tako da imamo rezervirano mjesto za to.
Ali onda kod je točno kao Lauren ovdje provode.
>> Sada, samo da bi dobili malo luđi, ispada
da možete to učiniti bez privremena varijabla.
Da biste to učinili ispravno, iako ćemo imati varati s nekim kemije.
Imamo neke dodatne šalice ovdje.
Dakle, najbliža stvar koja izgleda poput mlijeka i vode perhaps--
ili mlijeko i OJ-- je imamo neke vode, pa ćemo ispuniti ovo gore
s nekoliko unci čistom vodom.
To je vjerojatno previše.
Da.
To je definitivno previše.
Držite na jednom sek.
>> I sada imamo ulje, koje, ako se dobro sjećam od srednje škole satu kemije,
nadam se da se ne miješati s vodom.
Ali to vrsta vrsta izgleda kao mlijeko i SL.
Tako sada, bez korištenja privremena varijabla,
Možete li zamijeniti one dvije vrijednosti?
Dakle ulja ide u čašu vode, voda ide u naftnom šalicu.
LAUREN: Nema druge čaše?
DAVID J. Malan: Nema druge čaše.
I nisam zapravo testirani ovo prije ove godine
tako da ne znam da li će to zapravo rade kemijski.
To nije trebalo dogoditi.
Je li to raditi?
U redu.
Dakle odvajanje?
Dobra.
Sada moramo dobiti Voda u drugu šalicu.
Pametniji kemije concentrators mogla vjerojatno to učiniti bolje od mene.
>> LAUREN: Voda je na dnu.
>> DAVID J. Malan su: water-- da je što je ključ zadnji put mi je to učinio.
Morate to učiniti u pravom redoslijedu.
Da.
To je u redu.
Dakle, sada imamo dvije šalice ulja.
U REDU.
To je u redu.
No, ako je to kemijski radio od I--
>> LAUREN: Ovo je voda.
>> DAVID J. Malan: To je uglavnom voda.
U redu.
No, to je još uvijek isti kao i prije šalicu.
Dakle, prelijte it-- probati tamo.
U REDU.
Ovo je dobro iskoristiti vrijeme predavanja danas.
U REDU.
Tako sada we-- lijepo.
Nekako.
U redu.
Dakle, vrlo dobar.
Hvala Lauren.
Vrlo dobro učinio.
>> Dakle, samo puhati vaš um, i to je možda nešto
da se igraju s, ako vam se sviđa u CS50 ID, možete, zapravo, zamijeniti dvije varijable
bez privremeni cijeli broj.
I ovo je odgovarajući C koda.
A ako se sjećate iz prošlog Srijeda, uveli smo, ako je kratko,
neki novi operatori u C, a ne netko podsjetiti što malo mrkve
Simbol je, da se malo trokutasti Simbol na tipkovnici predstavlja?
Što bitovima operater?
>> PUBLIKA: EXOR.
>> DAVID J. Malan: EXOR.
Ekskluzivni Ili.
Dakle, ako želite, samo za zabavu na dom, dati A i B dva proizvoljna
Vrijednosti poput bilo eight-- i ja će izabrati osam bita vrijednost.
Ako ste to učiniti s 32 bita, ćete vrlo brzo dosadi.
Ali samo dati osam malo vrijednost koja je god, jedan ili dva,
i dati b sličan vrijednosti.
I onda pomoću definicije od XOR od prošle srijede,
prijaviti da malo po malo, svaki od te osam bitova u svakom od A i B,
a zatim ga učiniti upravo po ovom kodu.
I to nije netočno ono vidite ovdje na zaslonu.
To doista svodi tri XOR operacija
i nekako magično A i b razmijeniti stajališta
bez gubitka podataka.
>> Dakle, ulje i voda trik je najbliža stvarnom svijetu utjelovljenje
Nisam mogao zamisliti da oponaša toga.
No, to je sigurno lakše koristite privremenu varijablu,
kao u ovom slučaju ovdje.
A i ovo je prilika kažu, također, ta vrsta mikro optimizacije,
kao računalni znanstvenik bih, dok je vrsta zabave
hvaliti o tome kako je to učinio bez kao zamjene s pomoćnim varijable,
to nije sve što je uvjerljiv.
Budući da se spasi 32 bita, što u slučaju stvarne int,
nije sve što je primamljivo na sustav u kojem
možda koristite desetaka megabajta ili čak i više, kao memorijski ovih dana.
A u stvari, kad smo dobili na kasnije problema set
i implementirati čaroliju provjeru i vi ćete
biti izazvani učiniti s ovo kao malo RAM-a što je manje
Vrijeme je moguće na computer-- vas još
imaju tjedan dana za provedbu it-- ćete have-- ćete biti
izazvan kako bi se smanjila te resurse.
I to je zapravo jedina prigodom ovaj semestar
gdje ćete biti ohrabreni da obrije off čak i najfinije izvedbe
Troškovi drugačije.
>> Dakle what-- kako možemo vidjeti u stvarnoj šifru?
Dopustite mi ići naprijed sada i otvoriti primjer
da namjerno naziva Ne Swap jer ne
u stvari mijenjati varijable kao što ste zapravo mogli očekivati.
Tako ćemo pogledati.
Evo program koji nema CS50 Knjižnica događa, samo standardna I / O.
Sada imamo prototip za zamjenu do vrha koji je upravo
znači to je dobio biti definirani naknadno.
I ovdje je glavni.
>> I proizvoljno pripisana X i Y, odnosno, vrijednosti jednog i dva
samo zato jer su mali i jednostavno razmišljati o tome.
A onda sam samo hrpa printfs gdje sam ček razum. x je 1
i y je 2 vjerojatno što ti printfs će reći.
Dakle, nema magije do sada.
>> Onda ću tvrditi sa ispis def, zamjene dot dot dot.
Idem nazvati swap funkcija, prolaze u x i y.
I pretpostavimo da je za sada Zamjenski se provodi točno
kao što je bio trenutak prije privremenu varijablu.
I tako ja tvrdim hrabro, zamijenili.
X je sada ovo i y je sada da.
Ali datoteka, naravno, zove swap.
Tako ćemo zapravo vidjeti što se događa.
Ako sam sastaviti nikakvu zamjenu, a zatim to ./noswap, x je 1, y je 2.
Zamjene zamijenili.
x je 1, y je 2.
Dakle, to zapravo čini se da je manjkav, čak iako swap-- neka je spustite now--
provodi upravo po broj sam predložio maloprije.
Dakle, nećemo dobiti fancy sa XOR stvari za sada.
To, također, treba raditi samo kao i sa mlijekom i SL,
ali to ne čini da se radi.
>> Tako ćemo to učiniti opet.
Možda sam samo ne to radi u redu.
Tako ćemo pokrenuti Nikakva Swap opet.
Možda I-- br.
Dakle, to je samo ne radi.
Tako ćemo napraviti malo provjeriti razum.
Dopustite mi ići naprijed ovdje Swap i samo dodati, pričekajte minutu,
a je% i / n i neka je plug-in je vrijednost.
Jer ja stvarno želim da vidi što se događa.
I doista, ovo je uklanjanja bugova tehnika
da biste mogli koristiti u radno vrijeme ili kod kuće već,
srodan prvoj polovici Dana Armendariz je videozapis u PSET3
u kojoj smo uveli print def kao preporučena tehnika, barem
za jednostavne slučajeve.
Dopustite mi ići naprijed i pokrenuti napraviti swap opet, ./noswap.
>> Zanimljivo.
Dakle, primijetiti što čini se da je istina. x je 1, y je 2, ali je 2 kada b je 1.
Dakle, ta dva nekako dobio zamijeniti ali X i Y nisu uzimajući zamijenili.
Dakle, da bude jasno, što se događa je, ovdje sam X i Y
a to su varijable lokalni u Opseg glavni, ja sam prolazeći xiy
za swap.
Sada, swap, kao posebna funkcija, slobodno nazvati svoje argumente
ili njegov parametri nešto što želi.
Foo ili bar ili X ili Y ili a ili b.
Samo da je jasno da su oni nije identičan xiy per se,
Ja sam rekao aib.
Ali ih možemo nazvati što god želimo.
>> I tako to izgleda Zamjenski se prošli
x-- AKA A- i to donosi se y-- AKA b.
Nekako ove tri linije zamjene tih vrijednosti je točno
kao Lauren učinio s mlijekom i SL.
No, kad smo ispisati Vrijednosti, a i b
uistinu zamijeniti, ali x i y nemaju promjene na njih.
Sjetite se da su x i y ovdje.
>> Tako možemo vidjeti putem još jedna tehnika kao.
I to je također tehnika ugrađen u problemu postaviti tri.
Idemo naprijed i učiniti u CS50 ID, ako to već niste učinili.
Na desnoj strani mi ima tu karticu Debugger.
A ako otvorite ovaj gore, ima nekih kompliciranih informacija
koja je bačena na vas u početku.
Ali neka se zafrkavati to osim stvaran brz.
>> Dakle, jedan, vidiš lokalne varijable.
Ispada da izgrade u CS50 IDE, i puno programskim okruženjima više
općenito, je ispravljanje pogrešaka.
Alat koji vam omogućuje vizualno vidjeti što se događa unutar vašeg programa
bez posegnuti za dodavanje printfs i sastavljanju i trčanje
i dodavanje printf-a i sastavljanje i trčanje, koji je već u uredovno vrijeme
ili kuće, vjerojatno uzimajući prilično dosadan.
>> Dakle ovdje, u samo trenutak, da smo će se vidjeti u stvarnom vremenu
vrijednosti naših lokalnih varijabli.
Mi također će biti u mogućnosti postaviti ono što se naziva kontrolne točke koje
su prilike u mom programu pauzirati Izvršenje na određenoj liniji koda
da sam znatiželjan o tome.
Pravo?
Ovi programi pokrenuti u djeliću sekunde.
To je vrsta lijepo za nas sporije ljudi da bi mogli zaustaviti, uzeti trenutak, vidjet
što se događa oko određena linija koda
bez programa oranje kroz njega i dorade u cijelosti.
Dakle, kontrolne točke će nam omogućiti da razbiti i pauzirati u određenom trenutku.
>> Poziv stog je fancy način govoreći ono što su funkcije trenutno
se zove u ovom trenutku.
Glavni je uvijek zove na prvom mjestu.
Ali ako Glavni naziva funkcija zove swap,
mi zapravo idemo vidjeti ovo kula funkcija koje su
zove u obrnutom kronološkom redoslijedu.
Tako ćemo vidjeti.
>> Idem za smanjenje.
Idem se vratiti na moj broj.
I samo zato što želim biti pedantan ovdje
Ja ću ići naprijed i kliknite samo s lijeve strane linije pet.
A to stvara crvenu točku.
I obavijest na desnoj strani da debugger zna, hej,
Samo sam rekao je prijelomna točka u noswap.c linija pet, posebno
na ovoj liniji koda.
Dakle debugger znaju da sam zatražio da se sljedećeg puta
Sam pokrenuti moje Program stanku Izvršenje tamo, a ne samo
radi cijelu stvar super brzo.
>> Dakle, sada ću kliknuti debug Gumb na samom vrhu IDE
i da će učiniti sljedeće.
To će otvoriti početku pomalo zastrašujuće izgleda drugi terminal window--
daljinski za ispravljanje pogrešaka iz ugostiti kao i such--
a mi ćemo se vratiti na ono što Sve to znači da prije dugo.
No, ono što je važno za sada je da je crvena točka je udario,
debugger je namjerno Zastao execution--
Ne na toj liniji po sebi, ali na prvi linija stvarnog koda u toj funkciji.
I to je razlog zašto je linija sedam Sada označene žutom bojom.
>> A sada ćemo pogledati na desnoj strani.
Izgleda, po defaultu, dosta lijepo, X ima ono vrijednost?
0.
I Y ima ono vrijednost?
Nula.
I to je za očekivati ​​u smislu da X i y-- da žuta line-- ima
još nije izvršen.
Dakle, x ne bi trebali imati vrijednost 1.
To bi moglo imati neku drugu vrijednost, takozvani vrijednost smeća.
A mi se posrećilo u da je nula u ovom trenutku, u suštini.
>> Dakle, sada postoji samo nekoliko tipke trebamo brinuti
o kada pogrešaka na ovaj način.
Obavijest ovdje, imamo tipku Play.
A ako ćemo igrati ili hit nastaviti, to je samo
će se izvoditi kroz ostatak programa
ili dok ne udari drugi Kontrolna točka.
Ali nisam postaviti bilo koji drugi kontrolne točke, tako da je to samo
će pokrenuti do kraja.
Takva poraza Svrha poking okolo.
>> Dakle, umjesto, mi je stalo Ove ikone desno.
I ako sam lebdjeti iznad ih, kao što bi trebao previše,
vidjet ćete malo tips-- savjete alat.
To je jedan korak više.
Sada to ne znači Skip sljedeći redak koda.
To samo znači izvršiti ga i premjestiti na sljedeći, premjestiti na sljedeći,
premjestiti na sljedeću.
Drugim riječima, putem koji gumb, možete hodam
kroz moj broj jedan korak u isto vrijeme.
Redak po redak, doslovno.
Sada, na desnoj da, postoji još jedna
kako ćemo vidjeti u samo trenutak.
To je tzv Korak u ikonu koja je
će mi dopustiti roniti u drugu funkciju.
Ali da vidimo to u samo trenutak.
Tako ću kliknuti korak više.
I sada primijetiti, kao što sam kliknite ovaj gumb na gornjem desnom kutu,
držati oči otprilike pod lokalnom Varijable i vidjeti što se događa s x.
X je sada 1, jer je žuta linija je sada izvršen
a mi smo se preselili na liniji 8.
I u samo jednom trenutku y treba nadamo postali 2.
>> Sada, ništa što zanimljivo dogoditi za malo.
Sve je to je printf.
I obavijest, u mom sekundarne stezaljke prozor, vidim izlaz ispisa def.
A sada moram napraviti Odluka kao programer.
Mogu korak preko ove linije broj, izvršavanje ga, ali ne
uzimajući znatiželjan o tome što je unutra.
Ili sam zapravo korak u nju i ići unutar same Swap.
Tako ćemo učiniti potonje.
>> Dopustite mi ići naprijed i kliknite Ne korak više, ali korak u.
Obavijest, odjednom prozorski promjene
istaknuti prvi linija koda u razmjenu.
To je linija 21.
A sada, što je vrsta funky je da, ako pogledate ovdje, kako se i očekivalo,
zarez b je 1 i 2, redom.
Zašto je temp 32.767?
Podsjećajući da je temp, baš kao i prazna šalica trenutak prije,
proglašena ovdje na liniji 21.
Zašto 32,000- Mislim, zašto je to samo neki čudan vrijednost?
Da?
>> PUBLIKA: To nije pokrenut.
>> DAVID J. Malan: To je nije pokrenut.
Tako naše računalo uvijek ima fizičke memorije.
Uvijek ima fizički RAM-a.
A tu je uvijek nula-a a jedan je tamo, zar ne?
Budući da smo pomoću naše računalo cijeli dan,
koristite li CS50 IDE ili poslužitelji povazdan.
Tako da RAM ili ima neke nule ili netko je ili neki nula i jedinica.
Bez obzira da li ili Ne ste ih koristite.
Ne možete samo prazna prostori u kojima želite bitova.
Oni su bilo nula i jedinica.
>> Tako ispada da je temp, jer nismo ga još inicijalizira,
imamo one 32 bita, ali oni 'ne inicijaliziranja na bilo poznatim vrijednostima.
Dakle, bez obzira što su bili najviše Nedavno koristiti for-- onih 32 bits--
mi samo gledajući artefakata nekih prethodna primjena tih pojedinih 32
bitova.
Čim sam kliknite korak Tijekom ipak, fuj, temp će dobiti vrijednost 1.
A ako sam to učiniti opet, a je ide se s obzirom na vrijednost 2
a zatim b ide dati vrijednost 1.
>> I tako ono što je lijepo sada ta točka u priči
je da je debugger je mi pokazuje, super polako
na vlastitu tempom, što stanje Swap je.
Ali primijetite na vrhu ovdje, oglasnoj da je snop poziva zapravo
ima dva sloja na njega.
Sada je onaj koji je istaknuo kako je Zamijeni, ako ja kliknite na Glavni umjesto toga,
primijetiti kako su lokalne varijable promijeniti jer programer može samo hop
oko sebe i otići u bilo različitih opsega.
Dakle, iako radimo sve ovo raditi i pravilno zamjene A i B,
ako idem natrag i naprijed između Swap gdje je 2, a b je 1, a glavni,
Glavni je utjecao na sve?
Ne.
Pa što je takeaway ovdje?
Pa, ispada da bilo koje vrijeme vas poziva funkciju kao Swap,
a ti to prođe argumente, što ti prolazi na swap funkciji
u ovom slučaju je kopija od tih argumenata.
Dakle, ako x i y su svaki pojedinačno 32 bita, što je swap je sve
je dva nova lokalna varijable, ili argumenata,
naziva i B-, ali to su proizvoljni names-- ali uzorak nula
i one unutar A i B poredanih biti identična X i Y
ali oni nisu Ista stvar kao i x i y.
>> To je kao da je glavni na svojoj komad Rad broj 1 i 2 za X i Y,
i onda kad se ruke koje komad papira za swap,
Swap vrlo brzo dobiva vlastiti olovka, zapisuje
1 i 2 na vlastitu list papira, ruke natrag izvorni xy na glavni
a zatim se vlastite stvar s a i b.
A ovo sada je super važno jer to ima implikacije Netrivijalno
za pisanje zapravo točan broj jer čini se da ne možemo mijenjati
dvije varijable.
>> Napisao sam ispravnu funkciju swap.
Mi smo ga provoditi s Lauren kao ispravan funkcija zamjena u stvarnosti,
ali očito ništa od toga stvari ako ne mogu zapravo
zamijeniti dvije vrijednosti trajno.
Dakle, trebamo još jedan način zapravo dobiti na to,
i moramo biti u stanju zapravo riješiti ovaj problem.
I ispada out-- i mi ćemo doći natrag na ovaj slici
Prije long-- ovo je jedan od načina da se možda privući memoriju računala.
To je samo pravokutnik.
Možete ga izvući bilo nekoliko načina, ali to je
zgodan ga izvući kao pravokutnik iz razloga.
>> Idemo početi danas i dalje Riječ je o tzv stog.
I stog je samo komad od RAM-- komad memory--
koja funkcionira pristup kad oni zovu.
I tako ispada da je na samom dnu tog dimnjaka
je mjesto gdje sve je glavna lokalnim varijablama i org C i org V i sve to
će ići po defaultu. A ako Main traži neku drugu funkciju kao Swap,
dobro, swap će dobiti još sloj memorije iznad njega.
>> I tako samo da vam dati brz površnog slika toga, ako idem preko here--
i neka mi to ogledalo na iznad glave kao well-- što stvarno imam,
ako mi je stalo samo o Dno ove slike za sada,
je da kad sam pokrenuti program Glavni i dobiva se zove,
Glavni je dao komad RAM u mojem računalo koje je
na dnu ovog tzv stog.
I ja ću ga izvući Namjerno kao trg.
Dakle, to je kao 32 bita ili četiri bajta.
A ako je to glavna funkcija ima varijabla zove x s vrijednošću od 1
i ima varijablu nazvanu y s vrijednošću od 2, to je
kao što je uzimanje ovu luč memorije koja Glavni je dano od strane operativnog
Sustav i podjele, tako da prvi lokalni varijabla ide ovdje,
druga ide ovdje, i to je to.
>> Kada Glavni zove swap, swap dobiva svoj komadić memorije
da ćemo izvući ovako iz operacijskog sustava,
i to će imati svoje vlastite lokalne varijable temelji
na našem provedbu ranije s lokalnim varijable
b da je u početku dobili vrijednosti 1 i 2.
Ali onda, čim je Swap kôd izvršava,
i Lauren zapravo swaps OJ i mlijeko, što se događa?
Pa, to je 2 postaje 1, ovaj 1 postaje 2, i, usput,
tu je promjenjiva temperatura koji je bio koristi tu cijelo vrijeme da na kraju
ide dalje.
Ali to nije važno koliko posla radite
u toj liniji of-- u ovom memorijskog prostora, x i y su potpuno netaknuta.
>> Dakle, trebamo neki način davanja Swap i funkcije kao što je to
Tajna pristup, ako hoćete, kako bi Funkcije volimo-članovima u memoriju kao x i y.
Tako ćemo pogledati primjer koji pomaže
da vidimo točno što je bio događa cijelo ovo vrijeme.
Idem samo naprijed i otvoriti Usporedi Zero.
I ja ću zatvoriti naš program za pronalaženje pogrešaka, idem
zatvoriti ovu zastrašujuće izgleda poruku pravednik kaže, čekaj malo,
ti si u sredini ispravljanje pogrešaka.
Idem sakriti tu karticu ovdje Samo da se vrati jednostavnosti.
Dakle, ne brinite, ako GDB je ubio.
To samo znači da program ima je otkaz, namjerno, u ovom slučaju,
pored mene.
>> A sada usporedite Zero čini.
Ja sam koristeći CS50 knjižnica u standardnoj I / O.
Imam glavnu funkciju koja prva kaže nešto reći, i dobiva niz.
Zatim ga opet i kaže: dobiva još jedan niz.
I primijetite da su ove dvije žice nazivaju S i T, respektivno.
A sada ovaj program, usporedite Nula, njegova svrha u životu,
što je trebao reći, sam upisati istu stvar?
I tako ću natrag u tjednu jednom.
Ja sam koristeći moj jednak jednak operatera što je operator kvalitete.
Ne operator dodjele, operator jednakosti.
Samo uspoređujući s i t.
>> Tako ćemo zapravo ići naprijed i učiniti.
I ja ću ići naprijed i učiniti Usporedi Zero.
Ja ću učiniti ./comparezero.
I ja ću otići naprijed i reći nešto
kao, neka je učiniti mama malim slovima i kako o mama u velika slova.
I naravno da upišete različite stvari.
U redu.
To je i za očekivati.
>> Idemo ponovno pokrenuti.
Oba puta to mala slova, velika slova.
To izgleda super identičan mene.
Unesite.
U REDU.
Možda je to samo čudno jer to ne sviđa moj gramatiku.
Tako ćemo napraviti kapitala MOM, kapital mama, identična.
Različite stvari.
>> Pa zašto je to tako?
Pa, što se zapravo događa na ispod haube ovdje?
Dakle, vratimo se preko ovdje samo na trenutak
i razmislite što GetString zapravo radi.
Kad nazovete GetString, to je funkcija smo
sami pisali i to nekako dobiva niz znakova od korisnika.
I pretpostavimo da je prva Vrijeme zovem GetString, koji mi daje
komad memorije koja izgleda ovako.
A ako sam upisali u svim malim slovima m-o-M- i ono što ide poslije toga?
Samo brzo duševne ček.
>> Backslash nula.
Znamo da.
I podsjetiti da smo igrali s oko Zamila ime
i hrpa drugih imena kada je Rob je ovdje u potrazi
na ono što se događa unutar memorije.
Tako da priča je isti.
To je ono što GetString se vraća u meni.
Sada, moj broj trenutak prije pohranjeni povratak vrijednost GetString
u varijablu naziva s.
A onda drugi put sam ga nazvao, to je pohranjena u varijablu naziva t.
>> Dakle, ako idem ovdje, moram da ovaj lokalni variable--
i ja sam uglavnom ide nacrtati niz kao just-- mi ćemo
ga zovu S- kao mali trg ovdje.
I sada, kako se mama somehow-- ići unutar ovog promjenjivog s?
Pa, moramo se vratiti do prvih načela ovdje.
Što je GetString zapravo vraća?
>> Tako ispada da je M-O-M backslash nula, i bilo koji broj
drugih žice u sjećanju kao Zamila i Rob ili Andy ili bilo koji drugi,
su, naravno, u našem računala RAM ili memoriju.
A tvoj RAM ima volimo-članovima imate koncert RAM-a, dva nastupa RAM,
ili milijardu ili dvije milijarde bajtova, ili možda čak i više ovih dana.
Dakle, pretpostavimo, za današnje potrebe, da nije važno kako se broje
ih, ali možemo nabrojati svaki od onih milijardu ili dvije milijarde
ili četiri milijarde bajtova.
>> I neka je samo reći da je samovoljno ovo je prvi ugriz, drugi zagriz,
treći, četvrti.
Ja sam namjerno ne koristite nula za danas, ali mi ćemo se vratiti na to.
Dakle, drugim riječima, ako je to Prvi put sam koristeći program,
Ja sam samo dobivanje sretan i prvi ugriz je na mjesto jedne zatim dva
zatim tri od četiri.
I ako sam zadržao crtež, kutija broj dvije milijarde će biti put ovdje.
>> Dakle, što misliš, onda, GetString zapravo vraća?
To nije vraćanje M-O-M kosu crtu nula per se, jer to očito
ne stane u okvir koji sam nacrtao.
Pa što bi drugo moglo GetString zapravo se vraćaju svi ovi tjedna?
Odgovor je na odbora tu negdje.
Ne možeš stati M-O-M kosu crtu nula, pa što bi moglo smisla umjesto toga?
Ako ste morali biti super pametan, stavljajući na tzv inženjering šešir,
što bi ste se vratili?
Koji je najmanji iznos podataka možete se vratiti da će i dalje
neka ste pronašli M-O-M u memoriji?
Da?
>> PUBLIKA: Jedan.
>> DAVID J. Malan: Jedan.
I zašto jedan?
PUBLIKA: Jer bi to rekao li gdje otići [nečujan].
DAVID J. Malan: Točno.
Ja sam samo ide da se vrati na adresu od niza koje sam stečen.
Adresa na ovo Slučaj je položaj jedan.
Dakle, ono što je stvarno pohranjene u S- i svaki string varijabla, odnosno far--
upravo bio adresu tog niza.
>> U međuvremenu, ako ja zovem GetString drugi put i ja
upišite doslovce isti stvar-- M-O-M sa lowercase-- M-O-M
i još backslash nula, a sad možda i moj program je
trčanje za neko vrijeme pa možda ovo 10, to je lokacija 11, to je 12,
ovo je 13.
Računala koriste neki drugi memorija za bilo kojeg razloga.
Ono što sada ide u mom sekundi varijabla u mom programu t?
10.
Točno.
>> I tako, kada gledamo izvorni kod ovog programa
gdje sam jednostavno pokušava usporediti dvije vrijednosti,
S jednaka jednaka t, što je očito ljudski odgovor?
Samo ne zato što 1 nije jednak 10.
I tako ovdje leži prilika za nas stvarno
samo se vratiti, opet, prvi načela i razmišljati o, dobro,
što se događa ispod haube?
Razgovarali smo o tome bitova i bajtova i memorije,
ali to je zapravo korisno razumjeti jer kad nazovete GetString,
iako mislimo da je povratak M-O-M ili string mama
ili Andy ili Zamila ili slično, tehnički
to je samo vraćanje adresu tog komad memorije.
>> No, to je u redu.
Jer koliko ja znam gdje je niz završava?
Ako sam samo s obzirom na početak?
Pa, backslash nula, zar ne?
Samo u linearnom vremenu mogu ispis s ispisa def M-O-M.
I čim vidim kosu crtu nula, ne zanima me, gdje sam počeo,
Ja već znam implicitno gdje moram završiti.
>> I tako danas obilježava beginning-- i neka mi to dramatično, jer mi
prošao kroz puno problema na dobili to ovdje trening wheels--
tako da danas trening kotači počnu ispasti, a mi otkriti na least--
>> [PLJESAK]
>> To je dobro vrijedi izleta za Target jutros, zar ne?
Dakle now-- postoji, ispada kako, ne postoji takva stvar kao što je string.
Gudački ne postoji.
To je sinonim koje smo imali unutar CS50 knjižnici.
Ubuduće, idemo početi zvati s i t ne žice, ali char zvijezde.
A char zvijezda mi ćemo zafrkavati osim prije dugo.
No, to će reći, da čak i ako nastavimo
pomoću GetString za sada, tehnički sam trebao
se govori char zvijezdu i char zvijezdu.
>> I ispada da je zvijezda što će označavati nešto
naziva pokazivač ili adresu.
A u stvari, teaser za što je pred nama
je to 20 drugi isječak iz naše prijatelj Nick Parlante na Stanfordu
koji je prije dosta vremena, provesti smiješan iznos od vrijeme,
najbolje što mogu reći u njegovu kuhinje ili njegov podrum,
što claymation uvođenje u svijetu
lik po imenu Binky s kojima ćemo
biti uvedena sljedeći put se upućuje.
Dakle, ovdje je pregled onoga što će doći.
>> [VIDEO PLAYBACK]
>> -Hej, Binky.
Probudi se.
To je vrijeme za zabavu pokazivač.
>> -Što je to?
Saznajte više o pokazivače?
Oh, Goody.
>> [END PLAYBACK]
DAVID J. Malan: I na toj bilješci, ćemo vidjeti u srijedu.
U redu.
Tko je ples?
Ajde.
Tko je ples?
Želiš da biste je počelo?
Ja ću je počelo.
Woooo!
>> LAUREN: Slatka fantazija Mojsije.