>> DAVID J. Malan: Tas ir CS50 un šis ir sākums nedēļas četri.
Un, zēns, ir Volkswagen in nepatikšanas visi, jo programmatūru.
Ļaujiet mums to apskatīt.
[Video atskaņošana]
-Cars, Gudrākais rakstzīmes Jo ātri un negants filmas.
Šonedēļ Vācijas autoražotājs Volkswagen atradās
vidū ir skandāls potenciāli noziedzīgi proporcijas.
>> -Volkswagen Ir spirdzinošs miljardiem naudas sodu, iespējamās apsūdzības
tās vadītāji, kā uzņēmums atvainojas
par takelāžas 11 miljonus automašīnu, lai palīdzētu pārspēt emisiju testus.
>> -Certain Dīzeļa modeļi bija paredzēts ar sarežģītu programmatūru
kas izmantota informācija, tostarp nostāja stūres un transportlīdzekļa
ātrums noteikt automašīna bija veikta emisijas testēšanu.
Saskaņā ar šo apstākli, dzinējs samazinātu toksisko izmešu.
Bet automašīna tika savienoti uz apvedceļa ka tad, kad tas tika brauc.
Emisijas pieaudzis 10 līdz 40 reizes virs pieļaujamam līmenim EPN.
>> [Beigtu atskaņošanu]
>> DAVID J. Malan: Tātad pieņemsim ieskatieties šajā
un redzēt, kā tieši tas varētu tikt īstenots
un kā tas varētu ietekmēt tik daudz automašīnu, kā šis.
Tātad manā rokā šeit ir prese atlaišanu, kas tika izsniegts pēc EPA--
Vides Protection Agency, kas
ir ASV regulatīvā aģentūra, kas rokturi vides problēmas,
un pēc tam faktiskā juridisks paziņojums, ka bija
sūtīt uz Volkswagen tikai pirms dažām dienām.
>> Tātad EPA raksta, un atklāj tagad publiski, sarežģītu programmatūras
algoritms par dažu Volkswagen automobiļi atrod
kad automašīna tiek veikta oficiālās emisijas testēšana
un kļūst pilnu emisijas kontrole, tikai testa laikā.
Efektivitātes Šie transportlīdzekļi piesārņojums
emisijas kontroles ierīces ir ļoti samazināts visās normālas braukšanas laikā
situācijām.
Tas rada automašīnas, kas atbilstu standarti laboratorijā vai testēšanas
stacija, bet normālas darbības laikā izstarot slāpekļa oxides-- vai NOx--
līdz pat 40 reizes standartam.
Programmatūra, ko Volkswagen ir citāts likt pēdiņas beigās, pārveidošanas ierīci,
kā noteikts ar Tīru Air aktu ASV.
>> Viņi iet uz saka, ka EPA un citu aģentūra
atklāja izslēgšanas ierīces programmatūra pēc neatkarīgas analīzes
pētniekiem West Virginia University.
NOx piesārņojums veicina slāpekļa dioksīda, piezemes ozons,
un smalkās daļiņas.
Ekspozīcijas šiem piesārņotāji ir saistīta
ar plašu nopietnas sekas uz veselību,
tostarp palielinot astma uzbrukumiem un citiem elpošanas
slimības, kas var būt pietiekami nopietnas nosūtīt cilvēkus uz slimnīcu.
Iedarbība uz ozona un daļiņas ir arī
bijusi saistīta ar priekšlaicīgs nāves dēļ elpošanas saistīto
vai sirds un asinsvadu saistīto ietekmi.
Bērniem, vecākiem cilvēkiem, cilvēkiem ar preexisting elpceļu slimība
ir īpaši riska ietekme uz veselību šo piesārņotāju.
>> Pietiek proti, tas ir diezgan nopietni.
Un iesim tālāk, lai lasītu tikai vēl viens fragments
un tad mēs ņemšu apskatīt pakārtotie sekas
no šī saistībā ar automašīnas.
Konkrēti, Volkswagen izgatavotas un uzstādītas
programmatūra tā saukto elektroniskā vadība
module-- vai ECM-- no šie transportlīdzekļi, kas devējiem
kad transportlīdzeklis tika pārbaudīta atbilstība EPA emisijas standartiem.
Pamatojoties uz dažādām izejvielām ieskaitot stāvoklim, kad stūres rata, transportlīdzeklis
ātrums, ilgums motora darbība, un atmosfēras spiediens,
šīs izejvielas precīzi kāpurķēžu parametrus
no izmantotās federālās testa procedūras emisijas testēšana EPA sertifikāciju
mērķiem.
>> EPA emisijas testēšanas laikā, transportlīdzekļi ECM programmatūra
skrēja programmatūra, kas ražots atbilstošu emisiju rezultātus.
Visos citos laikos, transportlīdzeklis ECM programmatūra
skrēja atsevišķu ceļu kalibrēšana kas samazināja
efektivitāti Kopējais emisiju kontroles sistēma,
īpaši selektīvā katalītiskā samazināšana Lean NOx trap--
ko mēs redzēsim aptuveni pēc brīža.
Tā rezultātā, emisijas NOx palielināts ar koeficientu no 10 līdz 40 reizēm
virs EPN atbilstošu līmeņiem atkarībā no piedziņas cikla veida.
>> Tātad, ko tas īsti nozīmē, un pirmkods ar programmatūru, kas darbojas
uz Volkswagen ir ne vēl nav publiski izpausta,
ir tas, ka, faktiski, šis ekvivalents ir kaut kur tur iekšā
no Volkswagen kodu.
Ja Jums tiek pārbaudīti, un, ja automašīnai atklāj dažus vides faktorus
tāpat stūres rata amats vai kustība
vai tās trūkuma automašīnas vai jebkuru citu faktoru skaits
ka pašlaik hipotēze būt daļa no šo formulu,
viņi vienkārši ieslēgt pilna emisiju kontroli.
Citiem vārdiem sakot, viņi sāk izstaro mazāk piesārņojošo vielu.
>> Else, jebkurā citā situācijā ja tas nav konstatēts kā
laboratorijā, viņi vienkārši nav.
Un lai jūs varētu vienkāršot to vērā vairāk betona pseudocode ar kaut ko
kā šis.
Ja riteņi ir pagrieziena, bet stūre nav, liecina
ka auto ir par dažiem veida rotējošu cilindru
bet sava veida noliktava tiek pārbaudīta,
tad uzvesties kā EPA gribētu, lai jūs.
Pretējā gadījumā nav.
Tātad, pieņemsim to apskatīt pie īsu video, kas
ņem apskatīt, kādas būs sekas ir tas patiesībā mehāniski.
>> [Video atskaņošana]
>> -Last Piektdien EPA paziņoja, ka daži Volkswagen Audi automašīnām veikti laikā no 2009. gada
un šogad tika izmantojot ts pārveidošanas ierīci
lai iegūtu ap emisiju likumus paredzēti, lai saglabātu gaisa tīrības.
Bet ko tas nozīmē tieši tā?
>> Nu, mūsdienu automobiļi ir desmitiem Datoru iekšpusē tiem.
Un daži no šiem datoriem palīdzētu koordinēt funkcijas
Motora optimālai veiktspēju, vienlaikus pārliecinoties
ka nav pārāk daudz atkritumu nāk no izplūdes caurules.
Viņi tiešām strādā Tādā veidā jau vairākus gadu desmitus.
Būtībā, katrs daļa mūsdienīgu auto dzinējs
ir sensors vai kontrolieris par to, kā šie datori
lasa datos tūkstošiem reižu sekundē veicot korekcijas
tāpat proporcijā degvielu gaisā kas notiek uz cilindru.
>> Tie krāpšanos Volkswagen un Audi modeļi ir dīzeļi,
un dīzeļdzinēji ir viens vairāk patiešām svarīgi dators
kontrolēti parametrus, kas ir daudzums nesadegušās degvielas dodas
izplūdes.
Tagad, izklausās slikti.
Neizklausās jūs vēlaties nesadegusi degviela nonākšana izplūdes.
Bet ja runa ir dīzelis, jums ir kaut kas
sauc NOx filtrs, kas ir ierīce, kas absorbē un slazdus slāpekļa oksīdu
ka ir piesārņotājiem, kas citādi iet atmosfērā.
Un ar to ar šo NOx filtrs ir uzlabota ar nesadegušās degvielas.
Tātad izslēgšanas ierīce ir īpaša programma iekšā šiem datoriem, kas var padarīt to
izskatās automašīna atbilst emisijas standarti, pat ja tā nav.
Volkswagen bija problēma uz rokām.
Tās dīzeļdzinēji bija zināms lai iegūtu lielisku degvielas ekonomiju,
bet NOx slazds darbojas tikai labi ja vairāk degviela tiek izmantota.
Tātad auto varētu atklāt, Izmantojot šo izslēgšanas ierīci,
kad tas kļūst par emisijas tests, tas patērē vairāk degvielas,
padarīt NOx filtrs darbu labi, emisijas būtu labi.
Bet tad jums uz ceļa, ierīci izslēdzas, jūs dedzināšana mazāk degvielas
bet jūs liekot tik daudz kā 40 reizes vairāk piesārņojošās vielas atmosfērā.
Bet kā heck darīja auto zinu, ka tas bija
tiek pārbaudīta emisijas atbilstību?
EPA saka, ka tā bija sarežģīta sistēma, kas pārbauda lietas
piemēram, stūres rats, ātrums, cik ilgi motors bija,
un pat atmosfēras spiediens.
Citiem vārdiem sakot, tur bija nekādā veidā tas bija nejauša
jo programmatūra izstrādāts ļoti rūpīgi, lai noteiktu
oficiāls emisiju tests.
Tas ir daži diezgan nopietns maldināšana un tas ir
kāpēc Volkswagen ir piemēram nopietnas nepatikšanas.
Faktiski to CEO, Martin Vinterkorns, vienkārši atkāpās.
>> Tātad, kas notiek tālāk?
Nu, ja jūs esat viens no pusmiljons dīzeļa jettas, Beatles, Golfs, Passats,
vai Audi A3s veikta, Labā ziņa ir tā ir
ka jūsu automašīna ir vēl droši braukt.
Jums nav, lai to prom līdz Volkswagen izdod atsaukšanu.
Bet kādā brīdī viņi iespējams, nāksies
atjaunināt programmatūru iekšpusē jūsu automašīnu.
Kad tas notiek, jūs varētu saņemt mazāk jūdzes uz vienu tvertni.
Advokāti jau gatavojas up klases darbības tiesas prāvas
tā īpašnieki var saņemt kompensāciju kādā brīdī nākotnē.
Bet tas nav gatavojas notikt jebkurā laikā drīz.
>> [Beigtu atskaņošanu]
DAVID J. Malan: Tātad tas faktiski rada interesants lielāks attēla jautājums
kā uzticēties.
Tiesības?
Visi no mums ir iPhone vai Androids vai kaut kas mūsu kabatās, visticamāk,
Šajās dienās, vai laptops mūsu apļus, kas ir
darbojas programmatūra, Apple un Microsoft
un ķekarus citiem uzņēmumiem.
Bet kā mēs zinām, ka tas, ko šie programmatūras produkti darāt
ir tiešām tas, ko šie uzņēmumi atzīst, ka viņi dara?
>> Piemēram, kas ir to saka, ka katru reizi, kad
veiktu zvanu uz jūsu iPhone vai Android tālruni vai tamlīdzīgi,
ka tālruņa numurs arī nav tiek augšupielādēts dažu uzņēmuma serverim
tāpēc, ka daži programmas jūs esat rakstīts, vai tas ir darbības
Sistēma pati, piemēram, iOS vai Android, vai tāpēc, ka esat lejupielādējis
daži trešo personu app ka kaut klausās
lai viss jūs rakstīt vai Viss, jūs faktiski sakot.
Kā jūs zināt, ka, ja jūs puiši darbojas šķindēt
vai Marka sastādīt savu pašu programmatūru CS50, kā
Vai jums, ka CS50 pašas personālu, veidā ar CS50 bibliotēkas,
nav bijis piesakoties ik string esat kādreiz gotten
vai katru collu esat kādreiz gotten?
Nu, jūs, protams, var meklēt pie pirmkodu kaut
kā CS50 bibliotēkā, jūs varēja apskatīt pirmkodu
Linux operētājsistēmu darbojas CS50 IDE.
Bet pārsteidzošs prezentāciju tika dots atpakaļ 1984.gadā
in saņemšanas Tjūringa balvu, ko ļoti slavena datorzinātnieks zināms
as-- nosaukts Ken Thompson, kas saņēma Tjūringa balvu, kas
ir sava veida datorzinātnes s Nobela prēmijas, ja jūs,
par viņa darbu pie operētājsistēmas sauc
Unix, kas ir ļoti līdzīgs gars to, ko mēs izmantojam, kas ir Linux.
Un jautājums viņš jautāja viņa pieņemšana runas, būtībā
ar ko nosaka pamatu gadi un gadu diskusijām
par uzticēšanos un drošību, bija šī.
Cik lielā mērā viens uzticēties apgalvojums, ka program-- gabals
no software-- ir bez Trojas zirgi?
Varbūt tas ir vairāk svarīgi uzticēties cilvēki, kuri rakstīja programmatūru.
>> Un patiesībā, mēs esam saistīti to runāt, ka viņš
sniedza, pieņemot šo balvu '80s par CS50 mājas lapā
zem Lekcijas lapā šodien.
Jo tas, ko jūs redzēsiet ir tas, ka viņš faktiski dod
diezgan vienkāršs piemērs tam, kā pat kompilators piemēram šķindēt vai kāds
sastādītāji citi ir izmantoti pagātnē, Ko darīt, ja iestrādāta kompilators mēs
paši izmanto, ir maz, ja nosacījums, kas būtībā saka:
ja ievērojat, ka šis kods ir, izmantojot GetString funkcija vai GetInt
funkcija, iet uz priekšu un ievietojiet sētas durvīm vai Trojas zirgs
tāds, ka šī programma Tagad ir dažas nullēm
un tie, kas kaut ko darīt ļaunprātīgu.
Mežizstrāde visas jūsu keystrokes, augšupielādējot, ka dati
uz kādu serveri, vai tiešām neko.
>> Un ko Ken Thompson iet uz darīt savā runā
ir parādīt, ka pat tad, ja jums ir piekļuve avota
kods kompilatoru, kas ļaunprātīgi varētu to izdarīt,
tas nav svarīgi, jo tur ir šis vistas un olas
realitāte pēdējo daudzu gadu, kad sastādītāji
tiek izmantoti, lai apkopotu paši.
Citiem vārdiem sakot, ceļu atpakaļ, kad kāds bija, ir uzrakstījis pirmo kompilatoru.
Un pēc tam, jebkurā laikā viņi atjaunināts kompilators mainot tās pirmkodu,
pievienojot funkcijas un recompiling to lai cilvēki, piemēram, mums, lai izmantotu, labi,
viņi izmanto veco versija kompilators
sastādīt jauno versija kompilatoru.
Un, ja jūs to apskatīt tajā runāt, ka Viņš devis,
Jūs redzēsiet, ka, jo Minētās cirkulāro,
jūs faktiski var būt bugs vai Trojas zirgi iestrādāta programmatūru
mēs izmantojam.
Un pat tad, ja paskatās pirmkods šo programmu,
tas varētu pat nebūt skaidrs jo krāpšana ir faktiski
kādā vecāku versiju kompilators ka kopš ir
injicēšanas draudus mūsu programmatūru.
>> Kas ir tikai teikt, mēs tiešām nevar un nedrīkst
uzticēšanās programmatūru, kas darbojas uz mūsu klēpjdatorus vai telefonu vai kādu vietu skaits.
Un patiesībā, vēlāk šajā semestrī, kad mēs sākam runāt par web programmēšanu
un faktiski sākt veidot tīmekļa lietojumprogrammas sevi,
mēs runājam par šiem draudi un citi.
Tagad, iespējams, esat domājuši, un pamanīju ka tur bija niecīga mazliet Darth
Vader in klipus, kas Draudēja rādīja tur
par Volkswagen. Ja jūs nekad neesmu redzējis, es
domāju, mums vajadzētu atvieglot noskaņojums, jo tas ir viss
ļoti nomācoši un biedējošas.
Es esmu gatavojas atskatīties Super Bowl 2011
kad komerciāla ar Volkswagen-- un tas
gandrīz padara tos patīkams again-- aired pirmo reizi televīzijā.
Tas ir 60 sekunžu klips ka es domāju, ka jums patiks.
[Video atskaņošana]
[MUSIC - tēmu no "Star Wars"]
[DOG Barks]
[CAR STARTS]
[Beigtu atskaņošanu]
DAVID J. Malan: Jā.
Man bija tikai pārbaudes.
Šis auto ir sarakstā pārkāpumiem.
Viss kārtībā.
Tātad mēs apskatīt dažus pseudocode brīdi pirms.
Un šeit ir lielāks fragments no pseudocode kodu
ka mēs esam redzējuši vairākas reizes līdz šim.
Un pieņemsim izmantot šī ir iespēja tagad ieviest jaunu programmēšanu
paņēmiens, kas mēs darījām skatīt algoritmiski
pagājušajā nedēļā, kad mēs paskatījās sapludināšanas kārtošanas.
Bet pieņemsim formalizēt to un redzēt, kā mēs varētu izmantot to faktisko kodu,
un tad mēs spēsim izmantot šo paņēmiens pa ceļu visvairāk
iespējams atrisināt atsevišķas citas problēmas.
>> Tātad šī bija viena no pirmajām programmām, mēs kādreiz rakstīja, lai gan pseudocode kodu.
Un ko šī programma mums ļāva darīt kursu
bija atrast Mike Smith tālruņu grāmatā.
Un paziņojuma īpaši līnijām Astoņi un 11, kas bija šo Go To paziņojumu.
Un patiesībā, dažās valodas, C starp tiem,
faktiski darīt ir apgalvojums, ka ir burtiski
iet uz kas ļauj pārlēkt uz noteiktu līniju.
Tas parasti sarauca pieri, jo to var ļoti viegli izmantot ļaunprātīgi
un jūs varat sākt lekt savu programma visas vietas pretstatā
lai, izmantojot veida loģika un vadības plūsma
ka mēs esam izmantojuši līdz šim ar tikko cilpas un nosacījumi un tamlīdzīgi.
>> Bet mēs varam vienkāršot šo algoritmu in pseudocode kodu šādi.
Tā vietā iteratīvs vai looping pieeju
ja mēs turpinām iet uz priekšu un atpakaļ un atpakaļ rindā trīs,
kāpēc nav mēs tikai veida punt un vairāk parasti saka septiņās līnijas un 10,
vienkārši nomainīt šos divus pāri līnijām ar,
cits ja Smith ir agrāk grāmatā mēs
meklēt Mike In kreisā puse no grāmatas.
Cits ja Smith ir vēlāk grāmata, meklēt Mike labajā
puse grāmata.
Un paziņojums jau ir cirkulārās.
Tiesības?
Es esmu meklē Mike tālrunis grāmatu un pēc tam
Es beidzot hit varbūt line septiņi vai varbūt līnija 10
un mans norādījums sevi, ir meklēt Mike pusē tālruņu grāmatā.
Nu, kā es varu meklēt Mike?
Es esmu pa vidu meklējot Mike, kāpēc
Jūs veida nosūtot mani pa apli?
Bet tas ir OK, jo to, kas ir notiek ar izmēru problēmas,
kā rakstīts 7. līnija un 10?
Mēs esam ne tikai saku meklēšanu Mike, meklēt Mike.
Mēs esam īpaši, sakot, ko?
Meklēt viņam kreisajā pusē labajā pusē, kas ir efektīvi
uz pusi mazāks par problēmu.
Tātad, tas ir OK, ka mēs esam sava veida iesaistoties šajā cirkulāro,
šis apkārtraksts arguments, jo vismaz mēs esam
padarot problēma mazākas un mazākas.
Un galu galā mēs ejam, lai sasniegtu ka tā sauktais bāzes gadījums
mums ir tikai viena lappuse left-- kā mūsu brīvprātīgais pagājušajā nedēļā
did-- mums bija viena lapa pa kreisi un tad mums nav
ir saglabāt meklējot Mike Smith jo viņš ir vai nu šajā lapā
vai viņš nav.
>> Tātad, kā mēs varam īstenot šo ideju, šo kārtot cirkulārās faktiskajā kodu?
Nu, mēs varam sviras tehniku kas ir parasti sauc par recursion.
Un mēs esam redzējuši šo In pseudocode par sapludināšanas veida pagājušajā nedēļā.
Atgādināt, ka tas bija pseudocode par sapludināšanas kārtošanas.
Tas varbūt pat vienkāršāk, nekā burbulis vai izvēle vai ievietošanas kārtošanas
tikai attiecībā uz vienkāršību ar kuru jūs varat izteikt to.
>> Bet tas ir tāpēc, ka mēs esam sava veida cirkulāri
sakot, meklēt kaut ko meklējot to vēlreiz.
Bet mēs esam meklējot vai nu uz kreiso pusi vai labajā pusē
un tad galu galā mēs esam apvienojot šajā gadījumā.
Bet šeit, arī ar šie divi kārtot līnijas,
vai mēs atkal ir šī Ideja recursion.
Un konkrēti, ko tas nozīmē, saistībā ar algoritmu,
ir tas, ka algoritms ir rekursīvs ja tā izmanto vai prasa pats.
>> Vai attiecībā uz C, funkcija ir recursive-- funkciju sauc
foo ir rekursīvs ja foo, kaut kur savā pirmkodu,
aicina funkciju pati foo.
Un tas ir slikti, ja viss foo kādreiz dara ir sevi dēvēt atkal un atkal.
Tas ir OK, ja foo beidzot apstājas, kā to dara apvienot kārtot, sakot, pagaidiet minūti,
Ja šī problēma ir super mazs, piemēram,
vai es atklāju viņam kuru es esmu meklē, vienkārši atgriezties.
Nelietojiet rekursīvi, nav cikliski saucam sevi vēlreiz.
>> Un tāpēc pieņemsim to apskatīt cik tas varētu faktiski strādā.
Tāpēc es esmu gatavojas iet uz priekšu un atvērt līdz divām source koda piemērus šeit.
Viens no tiem sauc sigma 0.
Un tas nav vispār rekursīvs, bet pieņemsim
apskatīt to, ko šī programma dara.
Esmu attīrīta no visiem komentāri no tā, bet visi
avota kodu uz CS50 s Mājas lapā ir komentāri, ja jums
gribu lasīt caur to vēlreiz vēlāk.
Un pieņemsim darīt pāris par veselo saprātu pārbauda šeit.
>> Tā augšpusē šo kodu, mums ir jāiekļauj CS50.h.
Ko tas dara?
Kāpēc tas ir šeit?
Saprātīgos lajs izteiksmē.
Ko tas dara?
Jā.
>> Mērķauditorija: Lai GetInt funkcija darbojas.
>> DAVID J. Malan: Tāpēc, ka GetInt funkcija darbojas.
Tāpēc, ka iekšpusē šis fails, CS50.h, kas
mēs redzēsim pirms ilgi saistībā ar tās pirmkodu,
ir ķekars funkcijas declared-- GetInt, GetString,
un ķekars others-- un ja mums tiešām ir, ka Iekļaut līnija,
kompilators šķindēt nav gatavojas zināt, ka tā pastāv.
Un pats attiecas uz līniju divi kur int ir definēts
printf, kas ir funkcija mēs turpinām izmantot diezgan daudz.
Tagad, līnija četri šķiet mazliet bailīgs jo tā ir tikai viena līnijpārvadātāju.
Tas ir ieguvuši semikolu, ne cirtaini bikšturi, neviens kods iekšpusē no tā.
Bet tas, ko darīja mēs saucam šī lieta nedēļas agrāk?
Jā.
Tā prototipu.
Un kāpēc mums ir prototipu, kas, šķiet,
būt nedaudz lieka Parasti, jo mēs parasti
skatiet funkciju atkal vēlāk failu, vai ne?
Tad kāpēc mēs have-- jūs vienkārši nesaskrāpē galvu, bet es ņemšu to.
Jā.
>> Mērķauditorija: [dzirdams] funkcija pēc galvenās.
DAVID J. Malan: Tieši tā.
Tā, ka kompilators zina tevi galu galā noteikt vai īstenot
ka funkcija pēc galvenās, domājams.
Tātad šķindēt un visvairāk sastādītāji ir sava veida mēms
un tie būs tikai zināt ko jūs viņiem saku.
Un, ja jūs vēlaties izmantot funkcija sauc sigma,
jūs labāk mācīt kompilators ka tā eksistē iepriekš.
>> Tagad, galvenais pati, pat lai gan tas ir ķekars līniju,
ir diezgan pazīstams, cerams, ko tagad.
Tas ir ieguvuši darīt, kamēr cilpa kuras mērķis dzīvē
šeit acīmredzot ir iegūt pozitīvs vesels skaitlis no lietotāja.
Un tikai glabāt pestering viņu vai viņai līdz tie sadarbojas.
Tad 16. rindā man ir interesants zvanu.
IntAnswer.
Kura no kreisās puses sānu dod man Int
kas var store-- sauc Answer-- kas gatavojas glabāt, acīmredzot,
atgriešanās vērtību sigma.
Tātad sigma ir tikai patvaļīga bet jēgpilna vārds
ka es esmu devis uz funkciju kuras mērķis dzīvē
ir veikt vienu argument-- mēs to saucam N šajā case--
un vienkārši veikt šo numuru summu plus katrs pozitīvs skaitlis, kas ir
mazāka nekā tā.
>> Tātad, ja es iet skaita 2 līdz sigma, es vēlos pievienot 2 plus 1
plus 0-- ne 0-- lai dod man 3.
Ja es iet 3. līdz SIGMA, es gribu ir 3, plus 2 plus 1, kas dod man 6.
Un tā tālāk.
Tātad tas tikai palielina up visu numuri mazāks vai vienāds ar to.
>> Tagad, noteikti šeit es esmu tikai gatavojas izdrukāt atbildi.
Tā kā ātri veselība pārbaudītu, pieņemsim padarīt sigma 0-- dot slash sigma 0--
un ļaujiet man ierakstiet 2.
Un es tiešām iegūt 3.
Ļaujiet man ierakstiet 3.
Es tiešām saņem 6.
Un, ja kāds var darīt to math ātri, ja man 50, ko es esmu gatavojas saņemt?
>> Mērķauditorija: [nedzirdama].
DAVID J. Malan: Nu, nē.
Bet 1275, kas ir diezgan tuvu.
Tātad šis ir rezultāts dara 50 plus 49 plus 48 plus 47 plus 46
visu ceļu uz leju līdz 1.
Tā ka viss ir sigma dara.
Bet pieņemsim redzēt, kā mēs esam īstenoti to tagad.
Tātad, šeit lejā ir funkcija pati.
Un tas, šķiet, nav kaut ko darīt ar recursion vēl.
Patiesībā, mēs esam izmantojot vecās skolas paņēmiens.
Es esmu inicializēšana mainīga sauc summu līdz nullei, tad man ir foreloop šeit,
un es esmu pasludinātu Int sauc Es, nosakot to vienāds ar 1--
lai gan es varētu noteikt, ka ir vienāds ar nulle, bet kopš es esmu dara saskaitīšanu,
Who cares, ja tas ir nulle vai viens.
Tas notiek, lai nav spēkā.
>> Tāpēc es esmu atkārtojot tik ilgi, kamēr es ir mazāks par vai vienāds ar m, kas
ir arguments, ka tika pieņemts.
Un tad es tikai glabāt palielināšanai I. un izpratne
cilpas es esmu dara dara summa plus vienāds I. Un tas ir apzināts.
Es nevēlos darīt, šajā gadījumā, piemēram, summa plus plus.
Es gribu, lai faktiski pievienot pašreizējā vērtība I
kas tur kļūst lielāka un lielāka un lielāks velšanās saskan.
>> Un tad es atgrieztos summu.
Un tā atbilde izpaužas vērtību summu.
Un tad es to izdrukāt.
Tātad tur ir iespēja šeit, lai gan, lai veida vienkāršotu
šis kods konceptuāli un veida izšņaukt
prāta ziņā no vienkāršība, pat ja tā
notiek laikā, lai kārtotu no novērtēt, kāpēc tas
ir spēcīgs šajos maziem piemēriem.
Šeit ir sigma one-- tā Otrā versija šo kodu.
Viss up top ir identisks tik ka pats stāsts attiecas kā pirms tam.
Bet tagad pieņemsim apskatīt īstenošana SIGMA, kas
Esmu samazināts līdz tikai tie lines-- četras rindas kods, tiešām,
plus daži cirtaini bikšturi un atstarpēm.
>> Bet ko es daru?
Ja m ir mazāks par vai vienāds ar nulle, man ir nepieciešams, lai veida rokturi
ka super vienkārša lieta.
Un, ja jūs nodot man nulle vai neko negatīvs kas ir tikai dīvaini,
Es esmu tikai gatavojas patvaļīgi bet konsekventi atgriezties nulli.
Es nevēlos šo lieta iekļūt daži dīvaini Infinite
cilpa, jo negatīvu vērtību.
Tāpēc es tikai saku, ja tu dod man nulle vai mazāk, es esmu atpakaļ nulli.
>> Bet tas ir labi, jo tas ir ka vienas lapas no tālruņu kataloga
kas palicis pāri.
Es esmu biting off ļoti konkrētu problēmu un nepiestājot kaut rekursīvi.
Bet līnijā 31, ko man šķiet, ir darīt?
Iekavās ir tikai tur lietas, cerams, nedaudz skaidrāks.
Bet viss, ko es daru, ir es esmu atgriežoties m-- neatkarīgi
jums roku me-- plus vērtība m-- sorry,
plus vērtība sigma m mīnus 1.
Tātad, ko tas nozīmē?
Ja jūs varētu man numuru 3 kā ievade, atbilde Es vēlos saņemt galu galā
ir 6, jo 3 plus 2 plus 1 dod man 6.
Bet kā es varu domāt par kā šis kods darbojas?
Pirmo reizi es aicinu sigma un es iet vērtības 3,
tas ir tāpat kā teikt par kādu papīra, šeit ir vērtība 3
un es esmu izturējis šo kā sigma.
3 protams, nav mazāks par 0 tik IF nosacījums neattiecas.
Cits dara.
Tātad, ko man darīt?
Es gribu atgriezties m, kas ir 3, plus sigma no m mīnus 1.
Tāpēc ļaujiet man sekot to.
Es esmu gatavojas īstenot šo gabals papīra leju.
Un kāda vērtība, lai būtu skaidrs, es esmu gatavojas iet
uz SIGMA šajā brīdī stāsts?
Kas numurs?
2, vai ne?
3 mīnus 1: 2.
Tāpēc es vienkārši vajag nedaudz lūžņi papīra šeit.
Tāpēc tagad sigma kļūst sauc atkal.
Un es esmu apzināti likts tas uz leju, jo tas ir
veida, piemēram, apturot ka versija stāsts
jo tagad es esmu vērsta par signāla m mīnus 1.
Tātad m bija 3, m mīnus 1: 2.
Tātad, šeit ir 2, kas es esmu pagājis.
2 protams, nav mazāks par 0, lai lieta neattiecas.
Else I atgriezties m, kas ir šī lieta, plus kāda vērtība sigma?
Tātad, ja sigma no 1-- jo m ir tagad 2 tik 2 mīnus 1 ir 1.
Tāpēc tagad man ir tikai vērtība 1.
Es esmu iet tikai skaitu 1 uz funkciju sigma--
vai pats here-- tik 1 acīmredzami nav mazāk par nulli, vēl neattiecas.
>> Else atgriešanās 1 plus sigma, ko?
0.
Tāpēc ļaujiet man tikai jāatceras, ka.
Es nopirkšu atpakaļ, ka vēlāk.
Tagad es esmu gatavojas iet uz priekšu un īsi pierakstīt lejup pa skaita 0, jo tas ir
mans arguments vai parametru.
Es esmu izturējis numuru 0 un, visbeidzot, šis process
no tikai atkārtojot sev reklāmu nauseum tas vairs jo tas, ko
man uzreiz darīt, kad es redzu šo 0?
Es atgriezties nulli.
Tātad, tagad jums ir, lai attīt stāsts.
>> Ja es tagad iet atpakaļ laikā, kāda bija pēdējā lieta
Es darīju, ja Jums bija burtiski pārtīšana video?
Es esmu gatavojas uzņemt jaunāko 1 un kas dod man 1 plus 0 ir 1.
Ja es glabāt tīšana stāsts, kas notiek, lai dod man
2, kā arī šī darba vērtība, kas ir 1.
Tātad tas ir 3.
Un tad es esmu gatavojas glabāt pārtīšana.
Kad es pirmo reizi nolika numuru 3-- tik 3 plus 3 dod man 6.
>> Un tagad, ja jūs esat jāpārtin video līdz šim punktam,
tas bija ļoti Pirmais jautājums man jautāja.
Kad pagājuši 3, kas ir sigma no 3?
Tas ir patiešām 6, summa, ko veido Visi šie papīra gabalus.
Tātad, ja tas aizņem maz, bet, lai wrap savas domas apkārt, tas ir jauki.
Bet uzskata, ka tas bija tā little-- bija ļoti apzināta, ka es kaudzē
šie skaitļi par virs otra.
Tas ir veids, piemēram, ņemot memory-- ierakstu laikā,
kā skruberis ar video, ka es patiešām var attīt in.
Un mēs esam gatavojas atgriezties ka metafora tikai mazliet.
>> Bet vispirms, izrādās, ka tur ir daudz dīvaiņi un smieklīgi cilvēki,
Es domāju, Google.
Vai kāds, kurš ir ļoti labi googling prātā
nāk klajā tikai brīdi un palīdziet man meklēt kaut ko?
Ļoti, ļoti zems taustiņu.
Kāds, kurš nekad nav nākt klajā pirms, varbūt.
LABI.
Yeah?
Nāc šurp.
Nāciet uz leju.
Kā tevi sauc?
>> SAM: Sam.
>> DAVID J. Malan: Sam, nāk uz leju.
Tas ir tas pats.
Prieks iepazīties.
Hey.
Nāc uz vairāk.
Tātad viss, kas man ir nepieciešams, lai jūs darīt, ja jūs varētu, Sam, šeit ir Google.
Vai jūs varat meklēt terminu recursion?
Nebojā.
>> Un tagad let's-- yeah.
Labi Click to.
Labāk noklikšķiniet kas.
Ahh, saņemt to.
Nē?
LABI.
Tātad, pieņemsim darīt pāris citiem.
Ne tik daudz saistīta akadēmiski šeit, bet jūs esat
kādreiz meklējis Google Anagram?
>> SAM: Nē.
>> DAVID J. Malan: OK.
Meklēt Anagram nevis recursion.
Kā par šķībi.
Jūs kādreiz meklēja šķībi?
Tagad, šis viens ir nedaudz grūti redzēt, bet, cerams, everything's-- OK.
Tas ir tikai tu un es bauda to.
LABI.
>> Tātad beidzot, šis one's-- tas ir mazliet šķībi.
Tagad do barelu roll.
Wonderful.
Viss kārtībā.
Liels paldies Sam.
Šeit jums iet.
Pateicība.
>> Tātad, kas notiek visās Šo dumjš piemēriem?
Tik tiešām, zem motora pārsega Google miljoniem rindas kodu
acīmredzot ir daži dumjš IF apstākļi, kas ir būtiski
pārbaude, ja lietotājs ir drukāti šajā frāzē,
darīt kaut ko, kas, iespējams, veikusi netriviāls laika daudzums
īstenot tikai būt uzjautrinoši šādā veidā.
Bet tas ir viss tas sāk vārīties uz leju, lai zem motora pārsega.
Bet, protams, rekursijas ir vairāk no geekier
piemērs starp šiem īpašajiem trikiem.
Un, protams, tur ir citi, kas tur kā arī to, ka mēs, iespējams, nav pat
atklāja tikai vēl.
>> Tātad to apskatīt, vai apsvērt Tagad šādu programmu,
un, protams, paķert kādu no šiem pa ceļam ārā.
Es iešu uz priekšu un atvērt programmu, kas ir
gatavojas izmēģināt, lai mijmaiņas divas vērtības.
Bet, pirms mēs ejam tur, pieņemsim to izdarītu.
Mēs varētu iegūt vēl vienu brīvprātīgo, es domāju?
Vai jūs vēlētos veikt brīvprātīgo darbu?
Nē?
Nāciet uz augšu.
Viss kārtībā.
Tātad jūsu vārds ir tas, ko?
>> LAUREN: Lauren.
>> DAVID J. Malan: Lauren.
Nāciet uz augšu, Lauren.
Tātad Lauren tiek apstrīdēt šeit šādi.
Prieks iepazīties.
Tātad Lauren šeit ir priekšā viņas diviem tukšiem tases.
Un mums ir dažas oranžs sulu un pienu
un mēs esam gatavojas iet uz priekšu un darīt šādi.
Mēs esam tikai gatavojas aizpildīt to.
Dažas unces piena nekā šeit, un pieņemsim aizpildīt nedaudz apelsīnu sulas nekā šeit.
>> Un pie visiem šie skatītāji,
mijmaiņas divas vērtības šo tases.
Ielieciet apelsīnu sulu piena kauss un piens ar apelsīnu sulu čempionātā.
Kā jūs darīt, ja jums bija mājās un bija pieejami citām piegādēm?
LAUREN: Ielieciet to citā čempionātā.
DAVID J. Malan: OK.
Tātad pieņemsim ir pagaidu mainīgs, ja mēs.
Un iet uz priekšu tagad un īstenot šī pati pārnešana procedūra.
Tik labi.
Mēs esam izveidojuši OV vērā pagaidu mainīgs, piens uz OV mainīgo,
un tagad pagaidu mainīgo pienā mainīgo.
LABI.
Tik ļoti labi darīts līdz šim.
Tātad izrādās out-- uzskatīt, ka domāja tikai brīdi.
Lūk, tikai geek to uz augšu mazliet, šis būtu atbilstošs C kods
ka mēs tikko īstenots.
Mums bija divas ieejas, A un B abi kas mēs vienkārši sakām vienkāršību, ir
int s.
Un paziņojums šeit, ja es gribu apmainīt vērtības diviem mainīgajiem A un B,
mums tiešām ir nepieciešams starpnieks A pagaidu mainīgo, pagaidu kauss,
uz kuru pour viena no vērtībām tāpēc, ka mums ir vietturis to.
Bet tad kods ir tieši kā Lauren šeit īstenots.
>> Tagad, tikai, lai iegūtu maz crazier, izrādās,
ka jūs varat darīt bez pagaidu mainīgs.
Lai to izdarītu pareizi, lai gan, mēs ejam ir krāpties ar kādu ķīmiju.
Mums ir daži papildu kausus šeit.
Tātad vistuvāk lieta, kas izskatās piemēram, piena un ūdens perhaps--
vai piens un OJ-- ir mums ir daži ūdens, tāpēc mēs aizpildīt šo vienu up
ar dažiem uncēm tīru ūdeni.
Tas ir iespējams, ir pārāk daudz.
Jā.
Tas noteikti ir pārāk daudz.
Turiet par vienu sek.
>> Un tagad mums ir eļļa, kas, kā es atceros no vidējā skolas ķīmijas klasē,
cerams, tas nav sajaukt ar ūdeni.
Bet tas veida veida Izskatās, pienu un OV.
Tāpēc tagad, neizmantojot pagaidu mainīgo,
Jūs varat mijmaiņas šīs divas vērtības?
Tātad eļļas tērēta ūdens kauss, ūdens tērēta naftas kauss.
LAUREN: Nav citu krūzes?
DAVID J. Malan: Nav citu tases.
Un man nav reāli pārbaudīts tas pirms šā gada
tāpēc es nezinu, ja tas būs faktiski strādā ķīmiski.
Tas nebija paredzēts notikt.
Vai tas darbojas?
Viss kārtībā.
Tātad atdalot?
Labs.
Tagad mēs saņēmām, lai iegūtu Ūdens uz otru čempionātā.
Gudrāki ķīmija koncentratorus varētu iespējams darīt labāk nekā man.
>> LAUREN: Ūdens ir apakšā.
>> DAVID J. Malan: The water-- tas bija kas ir galvenais pēdējā reize, kad mēs to darījām.
Jums ir darīt to pareizā secībā.
Jā.
Tas ir labi.
Tāpēc tagad mums ir divas tases eļļas.
LABI.
Tas ir labi.
Bet ķīmiski ja tas strādāja par I--
>> LAUREN: Tas ir ūdens.
>> DAVID J. Malan: Tas ir galvenokārt ūdens.
Viss kārtībā.
Bet tas joprojām ir tas pats kauss, kā pirms tam.
Tātad ieliet it-- izmēģināt to tur.
LABI.
Tas ir labs izmantot klases laika šodien.
LABI.
Tāpēc tagad we-- jauki.
Kārtot.
Viss kārtībā.
Tik ļoti labs.
Paldies Lauren.
Ļoti labi darīts.
>> Tik vienkārši, lai trieciens jūsu prātus, un tas ir kaut kas, iespējams,
spēlēt ar, ja jums patīk CS50 ID, jūs varat, faktiski, mijmaiņas divi mainīgie
neizmantojot pagaidu skaitlim.
Un tas ir atbilstošs C kodu.
Un, ja jūs atceraties no pēdējās Trešdiena, mēs ieviesām, ja īsi,
daži jauni operatori C un tas kāds atgādināt to, ko maz burkāns
simbols ir, ka maz trīsstūrveida simbols no klaviatūras pārstāv?
Kas Bitu līmeņa uzņēmējs?
>> Mērķauditorija: Exor.
>> DAVID J. Malan: Exor.
Exclusive Or.
Tātad, ja jūs vēlaties, vienkārši prieka pēc mājās, lai dotu un b divi patvaļīgs
vērtības, piemēram, kāds eight-- un I izvēlētos astoņu bitu vērtību.
Ja jūs to izdarītu ar 32 bitiem, jūs ļoti ātri garlaicīgi.
Bet tikai dod astoņu bitu vērtība, kas ir neatkarīgi, viens vai divi,
un dot b līdzīgā vērtībā.
Un tad, izmantojot definīciju no XOR no pagājušajā trešdienā,
piemēro šo pamazām, katrs šie astoņi biti katrā no A un B,
un pēc tam darīt to tieši par šo kodu.
Un tas nav nepareizi, ko jūs redzēt šeit uz ekrāna.
Tas tiešām vārīties uz leju trīs XOR operācijām
un kaut kā maģiski a un b apmainīsies pozīcijas
nezaudējot informāciju.
>> Tātad eļļas un ūdens triks ir tuvākais reālās pasaules iemiesojums
Es varētu iedomāties, lai atdarinātu to.
Bet tas, protams, ir vieglāk izmantot pagaidu mainīgo,
kā šajā gadījumā šeit.
Un tas arī ir iespēja teikt, Arī šāda veida mikro optimizāciju,
kā datorzinātnieks teiktu, bet sava veida jautrību
lielīties par to, kā jūs to izdarīja bez tāpat pārnešana ar papildu mainīgo,
tas nav viss, kas pārliecinoši.
Tāpēc, ka, lai saglabātu 32 biti, AS gadījumā, ja faktiskā int,
nav tik pārliecinošs uz sistēmu, kurā
Jums varētu būt, izmantojot desmitiem megabaitu vai pat vairāk, piemēram atmiņas šajās dienās.
Un patiesībā, kad mēs nokļūt uz vēlāku problēmu kopumu
un jūs īstenot burvestību pārbaudītājs un jūs
apstrīdēt to darīt ar tas tik maz RAM un kā maz
laiks ir iespējams, uz computer-- jūs joprojām
ir nedēļa, lai īstenotu it-- jūs have-- jūs būsiet
apstrīdēja lai samazinātu šos resursus.
Un tas ir tiešām vienīgais godu šo semestri
kur jums tiks aicināti noskūties off pat smalkāko sniegumu
izmaksas citādi.
>> Tātad what-- kā mēs varam redzēt šo faktisko kodu?
Ļaujiet man iet uz priekšu tagad un atvērt piemēru
ka apzināti tiek saukta Nē Swap jo tas nav
faktiski mijmaiņas mainīgos kā jūs tiešām varētu gaidīt.
Tātad, pieņemsim to apskatīt.
Lūk programma, kas nav CS50 bibliotēka notiek, vienkārši standarta I / O.
Tagad mums ir prototipu par mijmaiņas up top, kas tikko
nozīmē, ka tas ir nokļuvis definēt vēlāk.
Un šeit ir galvenais.
>> Es patvaļīgi piešķirts x un y, attiecīgi, vērtības viens un divi
tikai tāpēc, ka viņi ir mazi un viegli domāt par.
Un tad man vienkārši ir ķekars printfs kur man ir veselība pārbaudītu. x ir 1
un y ir 2, ir iespējams kādi ir šie printfs teiks.
Līdz ar to nav burvju līdz šim.
>> Tad es esmu gatavojas pieprasīt ar drukāt def, pārnešana dot dot dot.
Es esmu gatavojas, lai izsauktu mijmaiņas funkcija, kas iet x un y.
Un pieņemsim, tagad, ka swap tiek īstenota tieši
kā tas bija pirms brīža ar pagaidu mainīgo.
Un tāpēc es apgalvot droši, nomainīju.
x tagad šo un y tagad ir tā, ka.
Bet lieta, protams, sauc Nr Swap.
Tātad, pieņemsim faktiski redzēt, kas notiek.
Ja es sastādīt nav swap un tad do ./noswap, x ir 1, y ir 2.
Pārnešana nomainīju.
x ir 1, y ir 2.
Tātad, tas tiešām šķiet, ir kļūdains, pat gan swap-- pieņemsim ritināt uz leju now--
tiek īstenota tieši vienu kods es ierosināju pirms brīža.
Tātad mēs nebrauksim, lai saņemtu fancy ar XOR stuff tagad.
Tas arī būtu jāstrādā tikai tāpat ar pienu un OV,
bet tas nav, šķiet, darbojas.
>> Tātad, pieņemsim darīt atkal.
Varbūt es vienkārši bija nedarbojas pareizi.
Tātad pieņemsim palaist Nr Swap vēlreiz.
Varbūt I-- nē.
Tātad tas ir tikai nedarbojas.
Tātad, pieņemsim darīt nedaudz veselo saprātu pārbaudi.
Ļaujiet man iet uz priekšu šeit Swap un vienkārši pievienot, pagaidiet minūti,
a ir% i / n un pieņemsim plug-in a vērtība.
Tā kā es tiešām gribu lai redzētu, kas notiek.
Un tiešām, tas ir atkļūdošanas paņēmiens
kas jums varētu būt, izmantojot in darba laika vai mājās jau,
līdzīgi pirmajā pusē Dan Armendariz ir video in PSET3
kur mēs iepazīstinājām drukāt def kā ieteicamā metode, vismaz
vienkāršiem gadījumiem.
Ļaujiet man iet uz priekšu un palaist padarīt nē swap atkal ./noswap.
>> Interesanti.
Tātad paziņojums, kas, šķiet, ir taisnība. x ir 1, y ir 2, bet ir 2, ja b ir 1.
Tātad šie divi kaut got samainīti bet X un Y ir ne kļūst apmainīti.
Tātad, lai būtu skaidrs, kas notiek ir, šeit man ir X un Y
un tie ir mainīgie vietējie In joma galvenais, es esmu iet uz x un y
apmainīt.
Tagad, maiņas, kā atsevišķu funkciju, ir brīvi, lai izsauktu savus argumentus
vai tā parametrus kaut tā vēlas.
Foo vai bārā vai X vai Y vai a vai b.
Tikai, lai būtu skaidrs, ka viņi nav identisks ar X un Y, per se,
Es esmu teica a un b.
Bet mēs varētu tos saucam neko mēs gribam.
>> Un tā tas izskatās swap tiek nodots
X- AKA a-- un tas ir tiek nodots y-- AKA b.
Kaut kā šie trīs līnijas ir pārnešana šīs vērtības tieši
kā Lauren darīja ar pienu un OV.
Bet, kad mēs izdrukāt vērtībām, a un b
patiešām mijmaiņas bet x un y nav izmaiņas tiem.
Atgādināt, ka x un y ir šeit.
>> Tātad, mēs varam redzēt šo via Vēl viens paņēmiens, kā arī.
Un tas arī ir tehnika iestrādāta problēma noteikti trīs.
Iesim uz priekšu un darīt to CS50 ID, ja Jums vēl nav.
No labajā pusē mēs ir šī atkļūdotāju tab.
Un, ja jūs atvērt šo augšu, tur ir daži arcane informācija
kas ir izmet pie jums sākotnēji.
Bet pieņemsim kaitināt šis intervālu nekustamo ātri.
>> Tik viens, jūs redzat vietējo mainīgie.
Izrādās, ka iebūvējamā CS50 IDE, un daudz programmēšanas vidēm vairāk
parasti, ir atkļūdotājs.
Rīks, kas ļauj jums, lai vizuāli redzēt kas notiek iekšpusē jūsu programmā
bez ķerties pie pievienojot printfs un apkopojot un darbojas
un pievienojot printf s un apkopojot un skriešana, kas jau, jo darba laika
vai mājās, ir iespējams kļūst diezgan garlaicīgs.
>> Tātad šeit, tikai brīdi, mēs esam gatavojas redzēt reālajā laikā
vērtības mūsu vietējo mainīgo.
Mēs arī gatavojas, lai varētu noteikt ko sauc kontrolpunkti, kas
Ir iespējas manā programmā, lai apturētu izpilde noteiktā koda rindu
ka es esmu ziņkārīgs par.
Tiesības?
Šīs programmas darbojas vienā mirklī.
Tas ir sava veida jauki mums lēnāku cilvēkiem lai varētu apstāties, veltiet laiku, skatiet
Kas notiek apkārt noteikta līnija koda
bez programmas aršanas caur to un apdares pilnībā.
Tātad kontrolpunkti gatavojas ļaut mums pauze un pauzes kādā noteiktā brīdī.
>> Zvanu kaudze ir iedomātā veids sakot, kādas funkcijas ir šobrīd
tiek saukta brīdī.
Galvenais vienmēr sauc pirmo reizi.
Bet, ja Main tā dēvētajā funkcija sauc Swap,
mēs patiešām gatavojas, lai redzētu šo tornis funkciju, kas ir
sauc apgrieztā hronoloģiskā secībā.
Tātad, pieņemsim redzēt, ka.
>> Es esmu gatavojas, lai tālinātu.
Es esmu gatavojas doties atpakaļ uz manu kodu.
Un tikai tāpēc, ka es gribu būt pedantiska šeit,
Es iešu uz priekšu un noklikšķiniet tikai pa kreisi no līnijas pieci.
Un tas rada sarkanu punktu.
Un paziņojums labajā pusē ka atkļūdotājs zina, hey,
Es tikai teicu pārtraukumpunkts at noswap.c line pieci, īpaši
šajā rindā kodu.
Tātad atkļūdotājs zina, ka es ir pieprasījušas nākamo reizi
Es palaist manu programma to pauzi izpilde ir nevis tikai
darbojas viss super ātri.
>> Tāpēc tagad es esmu gatavojas noklikšķiniet uz Debug poga pašā augšā IDE
un kas notiek, lai veiktu šādas darbības.
Tas notiek, lai atvērtu sākotnēji nedaudz biedējošu meklē otrais terminālis window--
attālā atkļūdošana no uzņēmējas piemēram un such--
un mēs būsim atpakaļ uz to, kas viss, kas nozīmē, pirms ilgi.
Bet to, kas ir svarīgi, lai tagad ir tā, ka tas red dot notrieca,
atkļūdotājs tīši apturēta execution--
ne uz šīs līnijas per se, bet par pirmo līnija faktisko koda šo funkciju.
Un tas ir iemesls, kāpēc septiņi līnija Tagad izcelta dzeltenā krāsā.
>> Un tagad pieņemsim to apskatīt pie labās malas.
Izskatās, pēc noklusējuma, labi pietiekami, x ir kāda vērtība?
0.
Un y ir kāda vērtība?
Zero.
Un tas ir sagaidāms tādā nozīmē, ka x un y-- ka dzeltenā line-- ir
vēl nav izpildīts.
Tātad x nevajadzētu būt vērtība 1.
Tas varētu būt jebkura cita vērtība, tā sauktais atkritumu vērtība.
Un mēs palaimējies, jo tas ir nulle šajā brīdī, būtībā.
>> Tāpēc tagad tur ir tikai daži pogas mums ir nepieciešams rūpēties
par to, kad debugging šādā veidā.
Ievērojiet šeit, mums ir atskaņošanas pogu.
Un, ja mēs spēlējam vai hit atsākt, tas ir tikai
gatavojas palaist cauri pārējā programmas
vai arī līdz brīdim, kad tas hits cita koncentrācija.
Bet es esmu nav noteikti jebkura cita kontrolpunkti tāpēc tas ir tikai
gatavojas palaist cauri beigām.
Šāda veida uzvar mērķis papētījis.
>> Tā vietā, man rūp Šīs ikonas pa labi.
Un, ja es lidināties virs viņiem, jo ​​jums ir pārāk,
jūs redzēsiet maz tips-- rīku padomus.
Tas viens ir soli pa.
Tagad tas nenozīmē izlaist šādu līnija kodu.
Tas nozīmē tikai to izpildīt un pārietu uz nākamo, pāriet uz nākamo,
pārietu uz nākamo.
Citiem vārdiem sakot, izmantojot ka poga, es varu staigāt
caur manu kods vienu soli laikā.
Pozīcijai, burtiski.
Tagad, pa labi no ka tur ir vēl viens
ka mēs redzēsim tikai brīdi.
Tas ir tā sauktā Step Into ikonas, kas ir
gatavojas atļaut man nirt uz citu funkciju.
Bet pieņemsim redzēt to tikai brīdi.
Tāpēc es esmu gatavojas noklikšķiniet soli pāri.
Un tagad paziņojums, kā es noklikšķiniet šo pogu augšējā labajā stūrī,
turēt acis aptuveni zem Local Mainīgie un redzēt, kas notiek ar x.
x tagad 1, jo dzeltenā līnija tagad ir izpildīts
un mēs esam pārvietots uz līnijas 8.
Un tikai brīdi y cerams kļūt 2.
>> Tagad, nekas, ka interesanti notiek mazliet.
Tas viss ir ir printf.
Un paziņojums, manā sekundārajā terminālī logu, es redzu rezultātu drukas Def.
Un tagad man ir padarīt Lēmums par programmētājs.
Es varu soli pār šo līniju kods, izpildes, bet ne
kļūst ziņkārīgs par to, kas ir iekšā.
Vai es tiešām var soli tajā un iet iekšā Swap pati.
Tātad, pieņemsim darīt tā.
>> Ļaujiet man iet uz priekšu un noklikšķiniet ne soli pa bet solis.
Paziņojums, pēkšņi logu izmaiņas
lai izceltu pirmais līnija koda Swap.
Tas ir līnija 21.
Un tagad, kas ir sava veida bailīgs ir tas, ka, ja paskatās nekā šeit, kā plānots,
komatu b ir 1 un 2, attiecīgi.
Kāpēc temp 32767?
Atgādinot, ka temp, līdzīgi tukša kauss pirms brīža,
ir deklarēts šeit uz līnijas 21.
Kāpēc 32,000- es domāju, kāpēc ir tas tikai daži dīvaini vērtība?
Yeah?
>> Mērķauditorija: Tas nav inicializēts.
>> DAVID J. Malan: Tas ir nav inicializēts.
Tātad mūsu dators vienmēr ir fiziskā atmiņa.
Tas vienmēr ir fizisko RAM.
Un tur vienmēr ir nulle 's un viens ir tur, vai ne?
Tāpēc, ka mēs izmantojam mūsu dators visu dienu,
jūs izmantojat CS50 IDE vai serveri visas dienas garumā.
Tā, ka RAM nu ir dažas nullēm vai daži viens ir vai daži nullēm un uzņēmumiem.
Nav svarīgi, vai ne jūs, izmantojot tos.
Jūs nevarat vienkārši ir tukšs vietas, kur vēlaties biti.
Viņi vai nu nullēm un uzņēmumiem.
>> Tātad izrādās, ka temp, jo mēs esam nav inicializēts to vēl,
mums ir šie 32 biti, bet tie esam ne inicializēts visām zināmajām vērtībām.
Tātad kādi tie bija visvairāk nesen izmantota for-- tām 32 bits--
mēs esam tikai redzēt artifacts dažu iepriekšējais lietošana šiem konkrētajiem 32
biti.
Tiklīdz es noklikšķiniet Step Over gan, Phew, temp gatavojas iegūt vērtību 1.
Un, ja es to darīt atkal, a ir tiks dota vērtība 2
un tad b gatavojas jādod vērtību 1.
>> Un tā, kādi ir jauki tagad šis punkts stāsts
ir tā, ka atkļūdotājs ir rāda man, super lēni
pie mana savā tempā, ko stāvoklis Swap ir.
Bet paziņojums augšpusē šeit, paziņojums ka zvanu kaudze faktiski
ir divi slāņi uz to.
Tagad viens, kas ir iezīmēts kā Swap, ja es noklikšķiniet uz Main vietā,
paziņojums, kā vietējās mainīgie mainās jo attīstītājs var tikai apiņu
apkārt un doties jebkurā citā darbības jomā.
Tātad, pat ja mēs darām visu to strādāt un pareizi pārnešana A un B,
ja man iet uz priekšu un atpakaļ starp Swap kur a ir 2, un b ir 1 un Main,
ir Main skārusi vispār?
Nē.
Tātad, kas ir takeaway šeit?
Nu, izrādās, ka jebkurā brīdī tu sauc funkciju, piemēram, Swap,
un jūs nodot to argumentus, ko jūs iet uz Swap funkcijai
Šajā gadījumā, ja ir kopija no šiem argumentiem.
Tātad, ja X un Y katrs ir attiecīgi 32 biti, ko Swap kļūst
ir divas jaunas vietējās mainīgie, vai argumenti,
sauc un b-- bet tie ir patvaļīgi names-- bet modelis nullēm
un vieni no A un B iekšā ir izklāta līdz būt identisks x un y
bet tie nav pats kā x un y.
>> Tas ir tā, it kā Main ir tās gabala papīrs numurs 1 un 2 x un y,
un tad, kad tā rokām, kas papīra apmainīt,
Swap ļoti ātri kļūst pati pildspalva, raksta uz leju
1 un 2 uz savas papīra loksnes, rokas atpakaļ sākotnējo XY galvenā
un tad dara to pašu lieta ar a un b.
Un tagad tas ir super svarīgi, jo Tas ir sarežģītākus sekas
par faktiski rakstot pareizo kodu jo šķiet, mēs nevaram mijmaiņas
divi mainīgie.
>> Es esmu uzrakstījis pareizu Swap funkciju.
Mēs esam īstenots ar Lauren kā pareizs mijmaiņas funkcija patiesībā,
bet acīmredzot neviens no šo lietās, ja jūs nevarat patiešām
mijmaiņas divas vērtības pastāvīgi.
Tāpēc mums ir vēl viens veids, kā lai faktiski saņemtu šajā,
un mums ir jāspēj faktiski atrisināt šo problēmu.
Un izrādās out-- un mēs nākt atpakaļ uz šo konkrēto attēlu
pirms long-- šis ir viens no veidiem, kas jūs varētu izdarīt datora atmiņā.
Tas ir tikai taisnstūris.
Jūs varētu izdarīt to jebkurš vairāki veidi, bet tas ir
ērti izdarīt to kā taisnstūris šāda iemesla dēļ.
>> Mēs ejam, lai sāktu šodien un turpmāk runājam par tā saukto kaudze.
Un kaudze ir tikai rieciens no RAM-- rieciens memory--
ka funkcijas ir pieejamas lai tad, kad viņi sauc.
Un tā izrādās, ka pie ļoti apakšā šo kaudze
ir vieta, kur visi galvenie vietējo mainīgie un org C un org V un visu, kas stuff
gatavojas doties pēc noklusējuma. Un, ja galvenās prasa dažas citas funkcijas, piemēram, Swap,
labi, Swap gatavojas saņemt citu slānis atmiņu līdz virs tā.
>> Un tā tikai, lai dotu jums ātri paviršs priekšstatu par to, ja es eju pa here--
un ļaujiet man spogulis šo par gaisvadu kā well-- to, kas patiešām man ir,
ja mēs rūpējamies tikai par apakšā šo attēlu tagad,
ir tas, ka tad, kad es palaist programmu un Main izpaužas sauc,
Galvenais ir dota rieciens RAM manā datorā, kas ir
apakšā šo tā saukto skursteni.
Un es esmu gatavojas izdarīt to apzināti kā kvadrāts.
Tātad, tas ir tāpat kā 32 bitu vai četriem baitiem.
Un, ja tas galvenā funkcija has a mainīgo sauc x, kuru vērtība ir 1
un tā ir mainīga, ko sauc par y ar vērtību 2, kas ir
piemēram, ņemot šo skaida atmiņu, kas Galvenais ir devusi pamatdarbības
sistēma un dalot to uz augšu, lai pirmais vietējās mainīgais iet šeit,
otrais iet šeit, un tas arī viss.
>> Kad Main aicina swap, Swap izpaužas savu šķēle atmiņas
ka mēs izdarīt kā šis no operētājsistēmas,
un tas notiek, lai būtu tā pašu vietējie mainīgie balstīta
mūsu īstenošanu agrāk ar vietējiem mainīgajiem lielumiem
un b, ka sākotnēji iegūt vērtības 1 un 2.
Bet tad, tiklīdz mijmaiņas kods izpilda,
un Lauren faktiski mijmaiņas OV un piens, kas notiek?
Nu, šī 2 kļūst par 1, tas 1 kļūst par 2, un, starp citu,
ir temp mainīgs, kas ir to izmantojusi šo visu laiku, kas galu galā
iet prom.
Bet tas nav svarīgi cik daudz darba jūs darīt
šajā rindā of-- šajā atmiņas telpa, x un y neatkarīgi ir pilnīgi neskarta.
>> Tāpēc mums ir nepieciešams zināms veids, kā dot Swap un funkcijas patīk
noslēpums piekļuve, ja vēlaties, lai funkcijas like-- atmiņā, piemēram, x un y.
Tātad, pieņemsim to apskatīt piemērs, kas palīdz
mums redzēt, tieši to, kas ir bijis notiek visu šo laiku.
Es iešu uz priekšu un atvērt Salīdziniet nulle.
Un es esmu gatavojas slēgt Mūsu atkļūdotājs, es eju
aizvērt šo biedējošu meklējat ziņu tikko saka, pagaidiet minūti,
tu esi vidū atkļūdošanu.
Es esmu gatavojas, lai slēptu šo cilni šeit tikai, lai dotos atpakaļ uz vienkāršību.
Tāpēc nav jāuztraucas, ja GDB tiek nogalināti.
Tas nozīmē tikai to, ka programma ir ir atmest, apzināti šajā gadījumā,
ar mani.
>> Un tagad salīdziniet Zero tas.
Es esmu, izmantojot CS50 bibliotēka standarta I / O.
Man galvenā funkcija, kas pirmo reizi saka, kaut ko pateikt, un saņem virkni.
Tad saka, ka tā atkal un izpaužas vēl virkni.
Un paziņojums, ka šie divi virknes sauc par S un T, attiecīgi.
Un tagad šī programma, salīdziniet Zero, tās mērķis dzīvē,
tas ir paredzēts, lai man pateikt, did I tipa to pašu?
Un tāpēc es esmu dodas atpakaļ uz nedēļu vienu.
Es esmu, izmantojot manu vienlīdzīgu vienlīdzīgu operatoru kas ir kvalitāte operators.
Ne piešķiršana operatoram, vienlīdzības operators.
Es esmu tikai salīdzinot s un t.
>> Tātad pieņemsim faktiski iet uz priekšu un darīt to.
Un es iešu uz priekšu un padarīt Salīdziniet nulle.
Es esmu gatavojas darīt ./comparezero.
Un es iešu priekšu un pateikt kaut ko
piemēram, pieņemsim darīt mamma ar mazajiem un kā par mammu ar lielajiem.
Un, protams, es rakstīt dažādas lietas.
Viss kārtībā.
Tas ir sagaidāms.
>> Pieņemsim palaist vēlreiz.
Abas reizes darīt mazos, mazos.
Tas izskatās super identiski man.
Enter.
LABI.
Varbūt tā ir tikai dīvaini, jo tas nav patika manu gramatiku.
Tātad, pieņemsim do kapitāla MOM, kapitāls MOM, identiski.
Dažādas lietas.
>> Tātad, kāpēc ir tā, ka?
Nu, ko patiesībā notiek par zem motora pārsega šeit?
So iesim atpakaļ pār šeit tikai brīdi
un apsvērt, kādi GetString ir faktiski dara.
Kad jūs zvanu GetString, tas ir funkcija mēs
paši rakstīja un tas kaut kā izpaužas rakstzīmju sekvence no lietotāja.
Un pieņemsim, ka pirmais Šoreiz es aicinu GetString, kas dod man
rieciens atmiņas, kas izskatās šādi.
Un, ja es drukāti visiem mazajiem m-o-m-- un to, kas notiek pēc tam?
Just a quick veselība pārbaudītu.
>> Slīpsvītru nulle.
Mēs zinām, ka.
Un atcerēties, ka mēs spēlējām apkārt ar Zamila nosaukumu
un ķekars citus nosaukumus kad Rob bija šeit meklē
par to, kas notiek iekšā atmiņas.
Tā, ka stāsts ir tieši tāds pats.
Tas ir tas, ko GetString atgriežas pie manis.
Tagad, mans kods pirms brīža uzglabāti atgriešanās vērtību GetString
lielumâ sauc s.
Un tad otrā reize, kad es to sauca, tā glabājas to mainīgo sauc t.
>> Tātad, ja es iet vairāk nekā šeit, man ir nepieciešams izdarīt šo vietējo variable--
un es esmu vispār gatavojas izdarīt virkni kā just-- mēs
sauc to s-- kā mazs laukumā šeit.
Un tagad, somehow-- kā tas mamma iet iekšā šo mainīgo s?
Nu, mums ir nepieciešams, lai dotos atpakaļ uz pirmajiem principiem šeit.
Kas ir GetString faktiski atgriežas?
>> Tātad izrādās, ka M-O-M slīpsvītru nulle, un jebkurš skaits
Citu stīgas atmiņā līdzīgu Zamila un Rob vai Andy vai jebkuras citas metodes,
Ir, protams, mūsu datora RAM vai atmiņas.
Un jūsu RAM ir like-- esat GIG RAM, divas gigs RAM,
vai miljards vai divi miljardi baiti, vai varbūt pat vairāk šajās dienās.
Tātad pieņemsim, šodienas vajadzībām, ka tas nav svarīgi, kā mēs numurēt
viņiem, taču mēs varam skaits katrai no tiem miljardiem vai divi miljardi
vai četri miljardi baiti.
>> Un pieņemsim tikai patvaļīgi teikt, ka šis ir pirmais sakodiens, otrais sakodiens,
trešo, ceturto.
Es apzināti nelieto nulli šodien, bet mēs atgriezīsimies pie tā.
Tātad, citiem vārdiem sakot, ja tas ir Pirmo reizi es esmu, izmantojot programmu,
Es esmu tikai kļūst laimīgs un pirmais sakodiens ir atrašanās vienā tad divas
tad trīs nekā četri.
Un, ja es tur zīmēšanas, kastītes numurs divi miljardi būtu veids, nekā šeit.
>> Tātad, ko jūs domājat, tad, GetString faktiski atgriežas?
Tas neatgriezīsies M-O-M slīpsvītru nulle per se, jo tas skaidri
neiederas lodziņu, kas es esmu novilkta.
Tātad, ko vēl varētu GetString faktiski atgriežas visas šīs nedēļas?
Atbilde ir par dēlis šeit kaut kur.
Jūs nevarat fit M-O-M slīpsvītru nulles, Tātad, ko varētu jēgas vietā?
Ja jums bija jābūt super gudrs, liekot uz tā saukto inženierijas cepure,
Ko jūs varētu atgriezties?
Kas ir vismazāk informācijas apjoms jūs varētu atgriezties, ka joprojām
ļauj jums atrast M-O-M atmiņā?
Yeah?
>> Mērķauditorija: One.
>> DAVID J. Malan: One.
Un kāpēc viens?
Mērķauditorija: Jo tas varētu pateikt Jums, kur doties [nedzirdama].
DAVID J. Malan: Tieši tā.
Es esmu tikai gatavojas atgriezties adresi no virknes, kas man ir gotten.
Ar šī adrese Lieta ir vieta viena.
Tātad, kas īsti tiek glabāti s-- un katrs string mainīgais tādējādi far--
tikko bijis adrese, virkni.
>> Tikmēr, ja es aicinu GetString otro reizi, un es
ierakstiet burtiski to pašu thing-- M-O-M ar lowercase-- M-O-M
un vēl slīpsvītru nulle, un tagad varbūt mana programma ir
darbojas jau kādu laiku, tāpēc varbūt tas ir 10, tas ir vieta 11, tas ir 12,
tas ir 13.
Datori izmantojot kādu citu atmiņa jebkāda iemesla dēļ.
Kas tagad notiek manā sekundē mainīgs manā programmā t?
10.
Tieši tā.
>> Un tad, kad mēs apskatīt pirmkods šī programma
kur es esmu vienkārši cenšos salīdzināt divas vērtības,
ir s vienāds vienāds ar t, kas ir skaidrs cilvēka atbilde?
Tikai ne tāpēc, ka 1 nav vienāds 10.
Un tā šeit slēpjas iespēja mums patiešām
tikai iet atpakaļ, atkal pirmais principus un domāt par, labi,
kas notiek zem motora pārsega?
Mēs esam runājuši par biti un baiti un atmiņa,
bet patiesībā tas ir noderīgi, lai izprastu jo, kad jūs zvanu GetString,
pat ja mēs domājam par to atgriežoties M-O-M vai stīgu mamma
vai Andy vai Zamila vai tamlīdzīgi, tehniski
tas ir tikai atgriežas adresi Minētās rieciens atmiņas.
>> Bet tas ir OK.
Jo kā es varu zināt kur stīgu beidzas?
Ja es esmu tikai dota sākumu?
Nu, slīpsvītru nulle, vai ne?
Tieši lineārā laika es varu izdrukāt ar drukas def M-O-M.
Un tiklīdz es redzu slīpsvītru nulle, man vienalga, kur es sāku,
Es jau zinu, netieši kur man ir nepieciešams, lai izbeigtu.
>> Un tā šodien iezīmē beginning-- un ļaujiet man darīt dramatiski, jo mēs
pārdzīvoja daudz problēmas ar saņemt šos šeit mācības wheels--
Tātad šodien mācību riteņi sāk atrauties un mēs atklāt pie least--
>> [Aplausi]
>> Tas bija labi vērts ceļojums Target šorīt, jā?
Tātad now-- ir, izrādās ārā, nav tādas lietas kā virkni.
String neeksistē.
Tas ir sinonīmu, ka mēs esam bija iekšpusē CS50 bibliotēkā.
Turpmāk, mēs ejam, lai sāktu zvanīt s un t nevis virknes, bet char zvaigznes.
Un char zvaigzne mēs ķircināt intervālu pirms ilgi.
Bet tas ir, ka pat tad, ja mēs turpināsim
izmantojot GetString tagad, tehniski es būtu
būt sakot char zvaigzne un char zvaigzne.
>> Un izrādās, ka kāda zvaigzne gatavojas apzīmētu ir kaut kas
sauc rādītājs vai adrese.
Un patiesībā, teaser par to, kas ir priekšā
tas ir 20 sekunžu klips no mūsu draugs Nick Parlante Stenfordas
kurš, pirms diezgan kādu laiku, pavadīt smieklīgs daudz laika,
cik labi es varu pateikt viņa virtuves vai viņa pagrabā,
padarot claymation ievieš uz pasauli
raksturs nosaukts Binky ar kuriem mēs
jāievieš nākamreiz uz norādes.
Tātad, šeit ir preview par to, kas ir nākt.
>> [Video atskaņošana]
>> -Hey, Mīkstās.
Celies.
Ir pienācis laiks, lai rādītāju jautri.
>> -Kas tas ir?
Uzziniet par norādes?
Ak, našķis.
>> [Beigtu atskaņošanu]
DAVID J. Malan: Un par šo piezīmi, mēs redzēsim tevi trešdien.
Viss kārtībā.
Kas ir dejas?
Nāc šurp.
Kas ir dejas?
Tu gribi, lai saņemtu to sākās?
Es nopirkšu tas sākās.
Woooo!
>> LAUREN: Sweet iedomātā Mozus.