>> DAVID J. Malan: Jen CS50 kaj tiu estas la komenco de semajno kvar.
Kaj, knabo, estas Volkswagen en problemojn cxiuj pro programaro.
Ni rigardu.
[VIDEO reprodukto]
-Cars, La plej inteligenta karakteroj en la Rapida kaj Furioza filmoj.
Ĉi semajno germana fabrikanto Volkswagen trovis sin
en la mezo de skandalo de potenciale kriman proporcioj.
>> -Volkswagen Estas fiksante por miliardoj en monpunas, eblaj kriminalaj postenoj
por liaj ekzekutivoj, kiel la kompanio senkulpigas
por falsigi 11 milionoj aŭtoj helpi batis emisiones testoj.
>> -Certain Dizelaj modeloj estis desegnita kun altnivela softvaro
kiu uzis informo inkludante la pozicio de la stirrado kaj veturilo
rapidigi determini la aŭto estis travivanta emisiones testado.
Sub tiu cirkonstanco, la motoro reduktus toksaj emisioj.
Sed la aŭto estis rigita por bypass ke kiam ĝi estis pelataj.
Emisiones pliigis 10 ĝis 40 fojojn super akcepteblaj niveloj EPA.
>> [FINO reprodukto]
>> DAVID J. Malan: Do ni rigardu ĉi
kaj vidi ĝuste kiel ĉi povus esti implementado
kaj kiel tiu povus afekcii tiel multaj aŭtoj kiel ĉi.
Do en mia mano jen la gazetaro gazetaro kiu estis elsendita de la EPA--
la Media Protektado Agentejo kiu
estas la usona reguligaj agentejo kiu pritraktas mediaj konzernoj,
kaj tiam la efektiva jura avizo kiu estis
sendu al Volkswagen nur kelkaj tagoj.
>> Do la EPA skribas, kaj diskonigas nun publike, kompleksa programaro
algoritmo sur certaj Volkswagen veturiloj detektas
kiam la aŭto estas travivanta oficiala emisiones testado
kaj turnas plena emisiones kontrolas sur nur dum la testo.
La efikeco de tiuj veturiloj poluado
emisiones kontrolo aparatoj estas tre reduktis dum ĉiuj normalaj kondukado
situacioj.
Ĉi tiuj rezultoj en aŭtoj kiuj plenumas la normoj en la laboratorio aŭ testado
stacidomo, sed dum normala operacio elsendas nitrogeno oxides-- aŭ NOx--
ĉe ĝis 40 fojojn la norma.
La programaro produktita de Volkswagen citajxo unquote, malvenko aparato,
kiel difinita de la Pura Aero-Leĝo en Usono.
>> Ili daŭriĝus por diri ke la EPA kaj alia agentejo
briligis malvenko aparato programaro post sendependa analizo
de esploristoj ĉe Okcidenta Virginia University.
NOx polucio kontribuas nitrogena dioksido, ternivelo ozono,
kaj fajna partikla afero.
Ekspona al tiuj malpurigaĵoj estis ligita
kun larĝa gamo de seriozaj sano efektoj,
inkluzive pliigis astmo atakoj kaj aliaj spiraj
malsanoj kiuj povas esti serioza sufiĉe sendi homojn al la hospitalo.
Ekspona al ozono kaj partikla materio havas ankaŭ
estis asociitaj kun antaŭtempa morto pro spira rilatajn
aŭ cardiovasculares rilatigis efikojn.
Infanoj, maljunuloj, personoj kun preexistente spira malsano
estas aparte ĉe risko por sano efektoj de ĉi tiuj contaminantes.
>> Sufiĉu estas, ĝi estas tre grava.
Kaj ni iru sur legi nur unu pli eltiraĵo
kaj tiam ni rigardu la subkuŝantaj implikaĵoj
de ĉi tio en la kunteksto de aŭto.
Specife, Volkswagen fabrikita kaj instalita
programaro en la tn elektronika kontrolo
module-- aŭ ECM-- de tiuj veturiloj kiuj sentis
kiam la veturilo estis elprovita por plenumo EPA emisión normoj.
Bazita sur diversaj enigoj inkludante la pozicio de la stirrado, veturilo
rapido, la daŭro de la motoro operacio kaj premo barométrica,
tiuj enigoj precize spuris la parametroj
de la federacia testo proceduro uzita por emisión testado por EPA atestado
celoj.
>> Dum EPA emisión testado la veturiloj ECM programaro
kuris programaro kiu produktis konsentemaj emisiones rezultoj.
Ĉe ĉiuj aliaj tempoj, la veturilo ECM programaro
kuris aparta vojo calibración kio reduktis
la efikeco de la entuta emisión kontrolo sistemo,
specife la selektema kataliza redukto de la Lean NOx trap--
kiun ni vidos pri en momento.
Kiel rezulto, la emisiones de NOx pliigita je faktoro de 10 al 40 fojoj
super la EPA observema niveloj Dependanta sur la tipo de stirado ciklo.
>> Do kio ĉi vere signifas, kaj la fontkodon la programaro kurado
sur la Volkswagen havas ne tamen estis publike diskonigita,
estas ke, efektive, tiu ekvivalento estas ie tie interne
de Volkswagen kodon.
Se vi estas estanta elprovita, kaj se la aŭto detektas iuj mediaj faktoroj
kiel la stirrado pozicio aŭ la movado
aŭ manko de la aŭto aŭ ajna nombro da aliaj faktoroj
ke aktuale hipotezis esti parto de ĉi tiu formulo,
Ili simple ŝalti plena emisiones kontroli.
En aliaj vortoj, ili komencas elsendante malpli de la contaminantes.
>> Alie, en ĉiu alia situacio kiam ĝi ne estas detektita kiel estante
en la laboratorio, ili simple ne faras.
Kaj tiel vi povas simpligi tion ĉi en pli konkreta _pseudocode_ kun io
kiel tio.
Se la radoj turniĝas sed la stirrado ne, sugesta
ke la aŭto estas ĉe iuj speco de rotacianta cilindro
sed en ia magazeno estanta elprovita,
tiam kondutas kiel la EPA ŝatus vin.
Alie ne.
Do ni rigardu ĉe mallonga video kiu
prenas rigardi kion la implikaĵoj estas de ĉi tiu praktiko mekanike.
>> [VIDEO reprodukto]
>> -Last Vendredo la EPA sciigis ke iuj Volkswagen Audi aŭtoj fabrikitaj inter 2009
kaj ĉi jaro estis uzantaj tn malvenko aparato
akiri ĉirkaŭ emisiones leĝoj desegnita por gardi la aero pura.
Sed kion tio signifas ekzakte?
>> Nu, modernaj aŭtoj havas dekduojn de komputiloj ene de ili.
Kaj iuj de tiuj komputiloj helpi kunordigi la funkciojn
de la motoro por optimuma agado dum certigi
ke estas ne tro da rubo eliranta el la tubo de ellasilo.
Ili fakte estis laboranta tiu vojo dum pluraj jardekoj nun.
Esence, ĉiu parto de moderna aŭto motoro
havas sensor aŭ regilo sur ĝi, kaj tiuj komputiloj
legas en datumoj miloj da fojoj sekunde farado ĝustigas
kiel la rilatumo de karburaĵo al aero tio tuj en la cilindroj.
>> Tiuj trompas Volkswagen kaj Audi modeloj estas dizeloj,
kaj dizeloj havas pli vere grava komputilo
kontrolis parametroj, kiuj estas la kvanto de brulaĵo unburned iranta
en la ellasilo.
Nun tio sonas malbona.
Ĝi ne sonas kiel vi volus unburned brulaĵo iranta en la ellasilo.
Sed en la kazo de diesel, vi havas ion
nomiĝas NOx kaptilo kiu estas mekanismo kiu sorbas kaj kaptiloj por nitrogeno oksidoj
ke estas contaminantes kiu volus alie iru al la atmosfero.
Kaj la efiko de tiu NOx kaptilo estas plibonigita kun unburned brulaĵo.
Do malvenko aparato estas speciala programo interne tiuj komputiloj kiuj povas fari ĝin
aspekti la aŭto renkontas emisión normoj eĉ kiam ĝi ne.
Volkswagen havis problemon sur liaj manoj.
Lia dizelaj motoroj estis konataj por interesigi granda brulaĵo ekonomio,
sed la NOx kaptilo nur funkcias bone kiam pli karburaĵo estas uzita.
Do la ĉaro detektus, uzante tiu malvenko aparato,
kiam atingante emisiones testo, ĝi uzus pli brulaĵo,
fari la NOx kaptilo laboron bone, emisiones estus bone.
Sed tiam vi akiras sur la vojo, la aparato malŝaltas, vi brulanta malpli brulaĵo
sed vi metas tiel kiel 40 fojojn pli contaminantes en la atmosfero.
Sed kiel la heck faris la aŭto scias ke estis
testata por emisiones observon?
La EPA Diras estis kompleksa sistemo kiu kontrolis aferoj
kiel stirrado pozicio, rapido, kiom longe la motoro estis sur,
kaj eĉ la atmosfera premo.
En aliaj vortoj, ekzistis neniel ĉi estis accidental
ĉar la programaro estis desegnita tre atente detekti
oficialan emisiones testo.
Jen kelkaj belaj serioza seniluziiĝo kaj jen
kial Volkswagen estas en tiaj seriozaj problemoj.
Fakte, liaj CEO, Martin Winterkorn, nur paŝis malsupren.
>> Do kio okazas nun?
Nu, se vi estas unu el la duono milionoj dizela Jettas, Beatles, Golfs, Passats,
aŭ Audi A3s efektivigxos, La bona novaĵo estas estas
ke via aŭto estas ankoraŭ sekuraj funkciigi.
Vi ne devas meti ĝin for ĝis Volkswagen diktas revokon.
Sed en iu momento ili estas probable tuj havos
ĝisdatigi la programaron en via aŭto.
Kiam tio okazas vi eble akiri pli malmultaj mejloj por benzinujo.
Advokatoj jam preparas ĉe klaso agado procesoj
tiel posedantoj povus akiri kompensita ĉe iu punkto en la estonteco.
Sed tio ne tuj okazi ajnan tempon baldaŭ.
>> [FINO reprodukto]
DAVID J. Malan: Do tiu fakte levas interesa granda bildo demando
kiel protekton.
Dekstra?
Ni ĉiuj iPhones aŭ androides aŭ ion en niaj poŝoj plej verŝajna
kelkan tempon aux tekkomputiloj sur nia rondiroj kiuj estas
kurante faris programaro Apple kaj Microsoft
kaj gxibo de aliaj kompanioj.
Sed kiel ni scias ke kio tiuj programaro produktoj faras
estas fakte kion tiuj kompanioj diri ili faras?
>> Ekzemple, kiu estas al diri ke ĉiufoje kiam vi
fari telefonvokon en via iPhone aŭ Android telefono aŭ simile,
ke tio telefonnumero ankaŭ ne estanta uploaded al iu firmao servilo
pro iu programo vi havas skribita, ĉu ĝi estas la mastruma
sistemon kiel iOS aŭ Android, aŭ ĉar vi elŝutis
iu tria partio app ke iel estas aŭskultanta
al ĉiu vi tajpas en aŭ ĉio vi reale diras.
Kiel vi scias ke, kiam you guys kurante Clang
aŭ Faru al kompili via propra programaro en CS50, kiom
ĉu vi ke CS50 propra stabo, tra la CS50 biblioteko,
ne estis ensalutanta ĉiun string vi iam alveninta
aŭ tutplene vi iam alveninta?
Nu, vi certe povus rigardi ĉe la fontkodon por io
kiel la CS50 biblioteko, vi povis rigardi la fontkodo
por Linukso operaciumo kurante sur CS50 IDE.
Sed miriga prezento estis redonita en 1984
en kvitanco de la Premio Turing de Tre fama komputila sciencisto konata
as-- nomita Ken Thompson kiu ricevis la Premio Turing kiu
estas speco de komputila scienco La Nobelpremio, se vi volas,
por lia laboro sur mastruma sistemo nomita
Unikso, kiu estas tre simila en spirito al kion ni uzas kio estas Linukso.
Kaj la demando li demandis en sia akcepto parolado, esence
formetante la kadron por jaroj kaj jaroj de diskuto
pri konfido kaj sekureco, estis jena.
Ĝis kio punkto povus unu konfidon al deklaro ke program-- peco
de software-- estas libera de Trojan ĉevaloj?
Eble estas pli grava fidi la homoj kiuj skribis la programaron.
>> Kaj fakte, ni ligitaj al la diskuto, ke li
donis akceptinte ĉi premio en la 80'oj sur CS50 la paĝaro
sub la Prelegoj paĝon por hodiaŭ.
Pro kio vi vidos estas ke li efektive donas
sufiĉe simpla ekzemplo de kiel eĉ tradukilo kiel Clang aŭ kio ajn
kompililoj aliaj uzis en pasinteco, kio se enigita en la tradukilo ni
mem estas uzanta estas iom se kondiĉo kiu esence diras,
se vi rimarkas ke tiu kodo estas uzanta la GetString funkcio aŭ la GetInt
funkcio, antaŭeniri kaj enmeti malantaŭa pordo aŭ Troja ĉevalo
tia ke ke programo nun havas iuj nuloj
kaj tiuj kiuj faras ion malican.
Ensalutas ĉiuj viaj pulsbatoj, alŝutas ke datumoj
al iu servilo, aŭ vere nenion.
>> Kaj kion Ken Thompson daŭriĝas por fari per interparolado
estas pruvi ke eĉ se vi havas aliron al la fonto
kodo de compilador ke malice povus fari tion,
ne gravas ĉar ekzistas tiu kokido kaj ovo
realo de la pasinteco multaj jaroj per kompililoj
estas uzataj por kompili sin.
Alivorte, vojon reen kiam iu devis esti skribinta la unuan tradukilon.
Kaj poste, iam ili ĝisdatigis kompililon ŝanĝante lia fontkodon,
aldonante funcionalidades kaj recompiling ĝi por personoj kiel ni uzi, nu,
ili uzas la malnovan versio de la tradukilo
kompili la nova versio de la tradukilo.
Kaj se vi rigardu ĉe la diskutpaĝo ke li donis,
vi vidos ke ĉar de tiu circularidad,
vi efektive povas havi misfunkciadojn aŭ Troja ĉevaloj enigita en softvaro
ni uzas.
Kaj eĉ se vi rigardas la fontkodon por tiuj programoj,
ĝi povus eĉ esti evidenta ĉar jxonglado estas reale
en iu malnova versio de tradukilo ke ekde estis
injekti la minaco en nia programaro.
>> Kiu estas nur por diri, ni vere ne povas kaj ne devus
konfido programaro kurante sur niaj tekkomputiloj aŭ telefonoj aŭ ajna nombro da lokoj.
Kaj fakte, poste en ĉi semestro kiam ni komencu paroli pri ttt programado
kaj fakte komenci konstrui aplikoj retejo mem,
ni parolos pri tiuj minacoj kaj aliaj.
Nun, vi eble scivolus kaj rimarkis ke ekzistis eta Darth
Vader en la klipoj kiuj La Rando estis montrante tie
pri Volkswagen. Se vi neniam vidis, mi
pensis ke ni devus malpligrandigi la humoro ĉar tiu estas ĉiuj
tre deprimente kaj timiga.
Mi tuj retrorigardas ĉe Super Bowl 2011
kiam komerca per Volkswagen-- kaj ĉi
preskaŭ faras ilin ŝatinda again-- elsendiĝis unuafoje en televido.
Ĝi estas la 60 dua tranĉeto ke mi opinias ke vi ĝuos.
[VIDEO reprodukto]
[MUZIKO - TEMO DE "Star Wars"]
[HUNDO Barks]
[CAR startas]
[FINO reprodukto]
DAVID J. Malan: Yeah.
Mi ĵus kontrolanta.
Ke aŭto estas sur la listo de seksperfortadoj.
Bone.
Do ni rigardu kelkajn _Pseudocode_ antaŭ momento.
Kaj jen granda fragmento de _pseudocode_ kodo
ke ni vidis kelkajn fojojn tiom.
Kaj ni uzas ĉi estas ŝanco nun enkonduki novan programado
tekniko ke ni faris vidi algorítmicamente
lasta semajno, kiam ni rigardis merge varon.
Sed ni formaligi gxin kaj vidu kiel Ni povus uzi ĝin en reala kodo,
kaj tiam ni tuj uzi ĉi teknikon laŭ la vojo plej
verŝajna solvi kelkajn aliajn problemojn.
>> Do tiu estis unu el la unuaj programoj ni iam skribis, kvankam en _pseudocode_ kodon.
Kaj kio ĉi programo permesis al ni fari kurson
estis trovi Mike Smith en telefono libro.
Kaj rimarku precipe linioj ok kaj 11 kiu havis tion iru al deklaro.
Kaj fakte, iuj lingvoj, C inter ili,
fakte ja havas aserto ke estas laŭvorte
iri al kiu permesas salti al specifa linio.
Ĝi estas ĝenerale malaprobita ĉar ĝi povas tre facile trouzita
kaj vi povas komenci salti vian programo tuta loko kontraste
uzi la specon de logiko kaj la kontrolo de fluo
ke ni uzis ĝis nun kun nur maŝojn kaj kondiĉoj kaj similaj.
>> Sed ni povas simpligi ĉi tiu algoritmo en _pseudocode_ kodon jene.
Anstataŭ ĉi ripeta aŭ looping alproksimiĝo
kie ni daǔre revenanta kaj tien kaj reen al linio tri,
kial ni ne nur speco de Punt kaj pli ĝenerale diras en linio sep kaj 10,
nur anstataŭi tiujn du paroj de linioj kun,
alie se Smith estas pli frua en la libro ni
serĉi Mike en la maldekstra duono de la libro.
Else se Smith estas poste en la libro, serĉi Mike en la dekstra
duonon de la libro.
Kaj rimarki jam la circularidad.
Dekstra?
Mi sercxas Mike en la telefono libro kaj poste
Mi finfine atingis eble linio sep aŭ eble linion 10
kaj mia instruado al mi mem estas serĉo Mike en duono de la telefono libro.
Nu, kiel mi serĉu por Mike?
Mi estas en la mezo de serĉanta Mike, kial
vi ian forpelas min en cirklo?
Sed tio estas bone ĉar kio estas okazante al la grandeco de la problemo,
kiel skribite en la linio 7 kaj 10?
Ni ne nur diras serĉo Mike, serĉu por Mike.
Ni specife dirante kion?
Serĉi en la maldekstra duono de la dekstra duono kiu estas efike
duono de la grandeco de la problemo.
Do ĝi estas BONE ke ni estas speco de okupiĝado ĉi circularidad,
tiu cirkla argumento, ĉar almenaŭ ni estas
farante la problemo pli kaj pli malgranda.
Kaj fine ni tuj atingos ke tn baza kazo kie
ni havas nur unu paĝo left-- kiel nia volontulo pasintsemajne
did-- ni havis unu paĝo maldekstra kaj tiam ni ne
devas teni serĉanta Mike Smith ĉar li estas ĉu sur tiu paĝo
aŭ li ne estas.
>> Do kiel ni povas apliki tiun ideon, tiun ia circularidad en reala kodo?
Nu, ni povas utiligi teknikon kiu estas ĝenerale konata kiel rekursio.
Kaj ni vidis tion en la _pseudocode_ por merge varo pasintsemajne.
Memoru ke ĉi tiu estis la _pseudocode_ por merge varon.
Estas defendeble ech pli simpla ol bobelo aŭ selektado aŭ inserción varo
nur en terminoj de la simpleco kun kiu vi povas esprimi ĝi.
>> Sed tio estas ĉar ni estas speco de cirkle
dirante, serĉi ion per serĉanta ĝin denove.
Sed ni sercxas ĉu sur la maldekstra duono aŭ la dekstra duono
kaj tiam fine ni estas kunfando en tiu kazo.
Sed ankaŭ tie ĉi, kun tiuj du speco linioj,
ni denove havos tiun ideo de rekursio.
Kaj konkrete kion tio signifas, en la kunteksto de algoritmo,
estas ke algoritmo estas rekursia se ĝi uzas aŭ nomas sin.
>> Aŭ en terminoj de C, funkcio estas recursive-- funkcio nomita
umo estas rekursia, se foo, ie en lia fontkodon,
vokas la funkcio foo mem.
Kaj tio estas malbona, se ĉiu umo iam faras estas voki mem denove kaj denove.
Estas bone se foo finfine haltas, kiel faras kunfandi speco, dirante, atendu minuton,
se tiu problemo estas súper malgrandajn, ekzemple,
aŭ mi renkontis tiun, kiun mi serĉas, simple reveni.
Ne rekursie, do ne cikle nomi min denove.
>> Kaj do ni preni rigardi kiel tiu povus fakte funkcii.
Do mi tuj iros antaŭen kaj malfermi supren du fontkodo ekzemplojn ĉi tie.
Unu el kiu estas nomita sigma 0.
Kaj tio estas tute ne rekursie, sed ni prenu
Rigardu kion tiu programo faras.
Mi senvestigis ĉiujn komentoj de ĝi sed ĉiuj
de la fontkodo sur CS50 retejo havas komentojn se vi
volas legi tra ĝi denove poste.
Kaj ni faru paro de prudento kontrolas tie.
>> Do ĉe la supro de ĉi tiu kodo, ni havos inkludas cs50.h.
Kion tio do?
Kial estas tie?
En racia laiko La terminoj.
Kion ĝi faras?
Yeah.
>> Publiko: Por ke GetInt funkcion laboras.
>> DAVID J. Malan: Do tiu la GetInt funkcion laboras.
Ĉar ene de tiu dosiero, CS50.h, kiu
ni vidos post nelonge en Kondiĉoj de sia fontkodo,
havas aron da funkcioj declared-- GetInt, GetString,
kaj faskon da others-- kaj krom se ni fakte havas tiun Inkluzivi linio,
la kompililo Clang estas ne tuj scias ke ĝi ekzistas.
Kaj sama iras por linio du kie int estas difinita
printf, kiu estas funkcio ni plu uzi tre iom.
Nun, linio kvar ŝajnas iom funky ĉar estas nur unu liner.
Oni alvenis punktokomo, neniu krispa krampoj, neniu kodo ene de ĝi.
Sed kion ni nomas tion en semajnoj pasinteco?
Yeah.
Do prototipo.
Kaj kial ni havas prototipo kiu ŝajnas
esti iom redundaj tipe ĉar ni kutime
vidi la funkcion denove poste en la arkivon, dekstra?
Do kial ni have-- vi estas nur gratante la kapon sed mi prenos ĝin.
Yeah.
>> Spektantaro: [inaudible] funkcio post la ĉefa.
DAVID J. Malan: Ĝuste.
Por ke la tradukilo scias vin eventuale difini aŭ efektivigi
domadministranto post ĉefa, supozeble.
Do Clang kaj plej tradukiloj estas speco de mutaj
kaj ili diros nur scias kion vi diros al ili.
Kaj se vi volas uzi funkcio nomita sigma,
vi pli bone instrui la tradukilo ke ekzistas anticipe.
>> Nun, ĉefa mem, eĉ kvankam ĝi estas aro de linioj,
Estas bela familiara espereble de nun.
Oni alvenis al fari dum buklo kies celo en la vivo
tie ŝajne estas akiri pozitiva entjero de la uzanto.
Kaj simple observu tedante lin aŭ ŝi ĝis ili kunlaboru.
Tiam en linio 16 Mi havas interesan alvokon.
IntAnswer.
Kiu maldekstre flanko donas min int
kiu povas store-- nomita Answer-- kiu iras al stoki, ŝajne,
la reveno valoro de sigmo.
Do sigma estas nur arbitra sed signifoplena nomo
ke mi donis al funkcio kies celo en la vivo
prenos unu argument-- ni nomas ĝin N en ĉi case--
kaj simple preni la sumo de tiu nombro plus ĉiu pozitiva nombro tio
pli malgranda ol ĝi.
>> Do se mi pasas en la numero 2 al sigma, mi volas aldoni 2 plus 1
plus 0-- ne 0-- tiel ke donas min 3.
Se mi pasas en 3 al sigma, mi volas havas 3 plus 2 plus 1, kiu donas al mi 6.
Kaj tiel plu.
Do ĝi nur aldonas la tutan nombroj malpli ol aŭ egala al ĝi.
>> Nun, cxi tie mi simple tuj presi la respondo.
Do kiel rapida prudento ĉeko, ni fari sigma 0-- dot oblikvo sigma 0--
kaj mi entajpas 2.
Kaj mi ja ricevas 3.
Lasu min tajpi en 3.
Mi ja akiras 6.
Kaj se iu povas fari la math rapide, se mi faras 50 kion mi ricevis?
>> Spektantaro: [inaudible].
DAVID J. Malan: Bone, ne.
Sed 1,275 kiu estas sufiĉe proksima.
Do tiu estas la rezulto de fari 50 plus 49 plus 48 plus 47 plus 46
tuta vojo malsupren al 1.
Do jen ĉio sigma faras.
Sed ni vidu kiel ni havas implementado ĝin nun.
Do cxi tie estas la funkcio mem.
Kaj ĉi tiu ne ŝajnas havi iel koncernas rekursio ankoraŭ.
Fakte, ni estas uzanta malnova lernejo tekniko.
Mi inicialización variablon nomita sumo al nulo, tiam mi havas foreloop tie,
kaj mi deklarante int vokis Mi, fiksante ĝin egala al 1--
kvankam mi povus instali ĝin egala al nulo, sed ekde mi faras krome,
Kiu zorgas se ĝi estas nulo aŭ unu.
Ĝi tuj ne havas efekton.
>> Do mi ripetanta tiel longe kiel mi estas malpli ol aŭ egala al m, kiu
estas la argumento kiu estis pasita en.
Kaj tiam mi daŭre pliigante I. Kaj enrigardo
de la buklo ĉiuj mi faras estas faranta sum plus egalas I. Kaj tio estas intenca.
Mi ne volas fari, en tiu kazo, kiel sumo plus alpago.
Mi volas reale aldonu la nunan valoro de mi
kiu tenas akiranta pli kaj pli grandaj kaj pli granda al la kurado kalkulrezulto.
>> Kaj tiam mi revenos sumo.
Kaj do respondo ricevas la valoron sumo.
Kaj tiam mi presas ĝin.
Do ekzistas ŝanco tie, kvankam, por ia simpligi
tiun kodon koncepte kaj la speco de bato onia
gravas en terminoj de la simpleco kvankam
prenas tempon por ordigi de estimi kial ĉi
estas potenca en tiuj malgrandaj ekzemploj.
Jen sigma one-- tiel la dua versio de tiu kodo.
Ĉio supren supro estas identaj tiel tiu sama rakonto validas kiel antaŭe.
Sed nun ni rigardu la efektivigo de sigma kiu
Mi ĉizis malsupren al nur tiuj lines-- kvar linioj de kodo, vere,
plus kelkaj krispaj krampoj kaj blanka spaco.
>> Sed kion mi faras?
Se m estas malpli ol aŭ egala al nulo, Mi bezonas specon de manipuli
ke super simpla kazo.
Kaj se vi transdonos min nulo aŭ ion negativa kiu estas nur stranga,
Mi simple tuj arbitre sed konsekvence reveni nula.
Mi ne volas tion al enir iuj strangaj senfina
buklo pro negativa valoro.
Do mi nur diras, se vi donos al mi nul aŭ malpli, mi reveni nula.
>> Sed tio estas bona ĉar tio estas ke unuopa paĝo de la telefono libro
la restaĵo.
Mi mordi ekstere tre specifa problemo kaj ne nomante ion rekursie.
Sed en linio 31, kio mi ŝajnas esti faranta?
La parentezoj estas nur tenanta aferojn, espereble, iom pli klara.
Sed ĉiuj mi faras estas mi reveninte m-- ajn
vi transdonu kunulinon plus la valoro de m-- bedaŭras,
plus la valoro de sigmo de m minus 1.
Do kio faras ĉi tiun mezumon?
Se vi donos al mi la numeron 3 kiel enigo, la respondo mi volas akiri finfine
estas 6 ĉar 3 plus 2 plus 1 donas min 6.
Sed kiel mi pensas pri kiamaniere tiu kodo kuras?
La unuan fojon mi nomas sigma kaj mi pasas en la valoro 3,
ke estas kiel diri sur peco da papero, jen la valoron 3
kaj Mi estis pasita ĉi kiel sigma.
3 estas evidente ne malpli ol 0 por la IF kondiĉo ne validas.
La alia faras.
Do kion mi faru?
Mi volas reveni m, kio estas 3, plus sigma de m minus 1.
Do lasu min sekvigi ĉi.
Mi tuj metos ĉi paperfolion malsupren.
Kaj kio valoro, esti klara, mi tuj pasos
en sigma ĉe tiu punkto en la rakonto?
Kio numeron?
2, ĉu ne?
3 minus 1 estas 2.
Do mi simple bezonas iom peceto de papero tie.
Do nun sigma estas akiranta reprovis.
Kaj mi intence metis tiun malsupren ĉar ĝi estas
ia kiel paŭzante ke versio de la rakonto
ĉar nun mi estas enfokusigita sur signalo de m minus 1.
Do m estis 3, m minus 1 estas 2.
Do tie estas 2 ke mi estis pasita.
2 estas evidente ne malpli ol 0 do tiukaze ne aplikeblas.
Alie mi revenos m, kio estas tiu aferon, plus sigma de kio valoro?
Do se sigma de 1-- ĉar m estas nun 2 do 2 minus 1 estas 1.
Do nun mi havas nur la valoro 1.
Mi pasante ĵus la nombro 1 por la funkcio sigma--
aŭ mi here-- tiel 1 estas evidente ne malpli ol nulo, ankoraŭ ne aplikeblas.
>> Else reveno 1 plus sigma de kio?
0.
Do mi simple memoras tion.
Mi reiros al tio poste.
Nun mi tuj iros antaŭen kaj joto malsupren la numeron 0 ĉar tio estas
mia argumento aŭ parametro.
Mi pasis la nombro 0 kaj fine tiu procezo
de ĵus ripetante mem ad nauseum does militantoj kio
mi tuj faros iam mi vidu tiun 0?
Mi revenos nulo.
Do nun vi devas malantaŭenigi la rakonton.
>> Se mi nun iras malantaŭen en tempo, kio estis la plej lastatempa afero
Mi faris se vi estis laŭvorte malantaŭeniganta video?
Mi tuj reprenos la plej lastatempaj 1 kaj kiu donas al mi 1 plus 0 estas 1.
Se mi tenas malantaŭeniganta la rakonto, kiu tuj donos al mi
2 pli ĉi kuranta valoro, kiu estas 1.
Do jen 3.
Kaj tiam mi tuj teni Rewinding.
Kiam mi unue metis malsupren la nombron 3-- do 3 plus 3 donas min 6.
>> Kaj nun, se vi jam rewound la video supren ĝis tiu punkto,
tiu estis la tre unua demando mi demandis.
Kiam pasis 3, kio estas sigmo de 3?
Estas ja 6, la sumo de ĉiuj tiuj pecoj de papero.
Do se tio prenas iom da tempo por envolver vian menson ĉirkaŭe, ke estas bone.
Sed konsideru estis little-- ĝi estis tre intencaj ke mi stakigita
tiuj nombroj sur supro de unu la alian.
Estas speco de kiel havi memory-- rekordon en tempo,
kiel scrubber en video, ke mi ja povas malantaŭenigi en.
Kaj ni tuj revenos al ke metaforo en nur iomete.
>> Sed unue, ĝi rezultas ke ekzistas multaj geeks kaj stranguloj,
Mi supozas, ĉe Google.
Ĉu iu kiu estas tre bona ĉe Googling menso
venante supren por nur momento kaj helpi min serĉi ion?
Tre, tre malalta ŝlosilo.
Iu kiu estas neniam supreniru antaŭe, eble.
BONE.
Yeah?
Venu.
Venu malsupren.
Kio estas via nomo?
>> Sam: Sam.
>> DAVID J. Malan: Sam, venu malsupren.
Tiu estas sama.
Agrable renkonti vin.
Hej.
Venu super.
Do ĉiuj mi bezonas vin fari, se vi povis, Sam, jen Google.
Ĉu vi povas serĉi por la termino rekursio?
Ne difektu.
>> Kaj nun let's-- yeah.
OK Klaku tio.
Better klaku tio.
Ahh, ricevas ĝin.
Neniu?
BONE.
Do ni faru kelkajn aliajn.
Ne tiel rilatajn akademie tie, sed ĉu vi
iam traserĉis Google por anagramo?
>> SAM: No.
>> DAVID J. Malan: Bone.
Serĉi anagramo anstataŭ rekursio.
Kion pri malrekta.
Vi iam serĉis malrekta?
Nun, ĉi tiu estas iom malfacile vidi sed espereble everything's-- OK.
Estas nur vi kaj mi ĝuas tion.
BONE.
>> Do fine, ĉi one's-- ĝi estas iom malrekta.
Nun faru barelo rulo.
Mirinda.
Bone.
Grandan dankon al Sam.
Jen.
Dankon.
>> Do kio okazas en ĉiuj de tiuj ridindaj ekzemploj?
Do vere, sub la kapuĉo de Google milionoj de linioj de kodo
ŝajne estas kelkaj stulta IF kondiĉoj kiuj estas esence
kontrolanta se la uzanto havas tajpita en ĉi tiu frazo,
fari iun kiu verŝajne prenis netriviala kvanto de tempo
implementar nur al esti amuzaj tiamaniere.
Sed jen ĉio bolas malsupren al sub la kapuĉo.
Sed, kompreneble, rekursio Estas pli de la geekier
Ekzemple inter tiuj specialaj lertaĵoj.
Kaj certe ekzistas aliaj tie tiel ke ni eble eĉ ne
malkovris ĵus ankoraŭ.
>> Do rigardu, aŭ konsideri nun la jena programo,
kaj certe ekpreni ajnan de tiuj sur vian vojon ekstere.
Mi tuj iros antaŭen kaj malfermi programon tio
provos interŝanĝi du valoroj.
Sed antaŭ ol ni iras tien, ni faru tion.
Ni povus preni pli volontulo, mi pensas?
Ĉu vi ŝatus volontuli?
Neniu?
Venu supren.
Bone.
Do via nomo estas kio?
>> Lauren Lauren.
>> DAVID J. Malan: Lauren.
Venu supren, Lauren.
Do Lauren estas estanta defiita tie jene.
Agrable renkonti vin.
Do Lauren tie havas antaŭ de ŝi du malplenaj tasoj.
Kaj ni havas kelkajn oranĝo suko kaj lakton
kaj ni tuj iru antaŭen kaj fari la sekvan.
Ni nur tuj plenigos ĉi.
Kelkaj gramoj da lakto tien por ke la plenigi iom oranĝsuko super tie.
>> Kaj antaŭ ĉiuj tiuj aŭskultantoj,
interŝanĝi la du valoroj de tiuj tasoj.
Metu la oranĝa suko en la lakto taso kaj la lakto en la oranĝa suko taso.
Kiel vi farus tion se vi estis hejmo kaj havis aliron al aliaj provizoj?
Lauren: Metu ĝin en alian tason.
DAVID J. Malan: Bone.
Do ni havas portempan variablo, se ni volas.
Kaj iri antaŭen nun kaj efektivigi tiu sama swapping proceduro.
Tiel bona.
Ni metis OJ en la portempa variablo, lakton en la OJ ŝanĝiĝema,
kaj nun la provizora variablo en la lakto variablo.
BONE.
Do tre bone farita ĝis nun.
Do rezultas fjordon teni ke pensis por nur momento.
Ĉi tie, je justaj geek ĝin iom, tiu estus la responda kodo C
ke ni ĵus efektivigita.
Ni havis du enigoj, a kaj b, ambaŭ kiun ni nur diros por simpleco estas
int a.
Kaj rimarki tie, se mi volas interŝanĝi la valoroj de du variabloj, a kaj b,
ni ja bezonas peranto, oni provizora variablo, portempa taso,
en kiun la versxu unu el la valoroj tiel ke ni havas lokokupilo por ĝi.
Sed tiam la kodo precize kiel Lauren tie implementado.
>> Nun, nur por akiri iom pli freneza, rezultas
ke vi povas fari tion sen portempa variablo.
Por fari tion adekvate, kvankam, ni tuj havi trompi kun iuj kemio.
Ni havas iuj ekstra tasoj tie.
Do la plej proksima afero kiu aspektas kiel lakto kaj akvo perhaps--
aŭ lakto kaj OJ-- estas ni havas iun akvo, do ni plenigas tiun unu supren
kun kelkaj uncoj de klara akvo.
Tio probable tro multe.
Yeah.
Tio certe tro multe.
Atendu unu sek.
>> Kaj nun ni havas oleo, kiu, kiel mi memoras de meza lernejo kemio klaso,
espereble ne miksi kun akvo.
Sed speco de ia aspektas kiel lakto kaj OJ.
Do nun, sen uzi provizora variablo,
vi povas interŝanĝi tiujn du valoroj?
Do oleoj iras en la akvon taso, akvo iras en la oleo taso.
Lauren: Neniu alia tasoj?
DAVID J. Malan: Neniu alia tasoj.
Kaj mi havas ne reale testis ĉi antaŭe ĉi tiu jaro
do mi ne scias se tiu volas reale funkcias kemie.
Kiu ne estis supozita okazi.
Ĉu funkcias?
Bone.
Do disigi?
Bona.
Nun ni alvenis al akiri la akvo en la alian tason.
Smarter kemio concentradores povis probable fari tion pli bone ol mi.
>> Lauren: La akvo estas sur la fundo.
>> DAVID J. Malan: La akvo; kiu estis kio estas ŝlosila la lasta tempo ni faris ĉi.
Vi devi fari ĝin en la dekstra ordo.
Yeah.
Estas bone.
Do nun ni havas du tasoj da oleo.
BONE.
Estas bone.
Sed kemie se tiu laboris ol I--
>> Lauren: tio estas akvo.
>> DAVID J. Malan: Tio plejparte akvo.
Bone.
Sed tio estas ankoraŭ la sama kiel antaŭ taso.
Do pour it-- provi ĝin tien.
BONE.
Tio estas bona uzo de klaso tempon hodiaŭ.
BONE.
Do nun we-- bela.
Ia.
Bone.
Do tre bone.
Dankon al Lauren.
Tre bone farita.
>> Do simple por forblovi mensoj, kaj tio estas eble io
ludi kun se vi ŝatas en CS50 ID, vi povas, fakte, interŝanĝi du variabloj
sen uzi temporal entjera.
Kaj estas la responda C kodo.
Kaj se vi memoras de lasta Merkredo, ni enkondukis, se mallonge,
iuj novaj operatoroj en C. Kaj faras iu memoras kion diris la malgranda karoto
simbolo estas, ke iom triangula simbolo de la klavaro reprezentas?
Kio bitlarĝa operatoro?
>> Publiko: EXOR.
>> DAVID J. Malan: EXOR.
Ekskluziva Aŭ.
Do se vi volas, nur por amuzo ĉe hejmo, doni kaj b du arbitraj
valorolisto ajna eight-- kaj mi elektus ok bita valoro.
Se vi fari tion ĉi kun 32 bitoj, vi tre rapide enuiĝos.
Sed nur doni ok iom valoron tio ajn, unu aŭ du,
kaj donu b similan valoron.
Kaj tiam uzanta la difino de XOR de lasta merkredo,
Apliki ke iom post iom, ĉiu el tiuj ok pecoj en ĉiu de a kaj b,
kaj poste fari ĝin ĝuste por tiu kodo.
Kaj ĝi ne estas malĝusta kion vi vidas tie sur la ekrano.
Ĝi ja abscesoj malsupren al tri XOR operacioj
kaj iel magie a kaj b interŝanĝos pozicioj
sen perdi iun informon.
>> Do la oleo kaj akvo lertaĵo estas la proksima reala mondo enkarniĝo
Mi povus elpensi imiti tion.
Sed estas certe pli facile uzi portempa variablo,
kiel en ĉi tiu kazo tie.
Kaj ĉi tro estas ŝanco diri, tro, tiu speco de mikro optimumigo,
por komputila sciencisto dirus, dum ia amuza
fanfaroni pri kiel vi faris tion sen kiel interŝanĝante kun ekstra ŝanĝiĝema,
ĝi estas ne ĉiuj, ke konvinka.
Ĉar por ŝpari 32 bitoj, kiel en la kazo de reala int,
ne estas ĉiuj kiuj deviganta sur sistemo kie
vi povus uzi dekojn da megabajtoj aŭ eĉ pli tia memoro tiujn tagojn.
Kaj fakte, kiam ni atingos al posta problemo aro
kaj vi apliki sorĉon kontrolilo kaj vi
esti defiita tiel fari kun tiu kiel iom RAM kaj tiom malmulte
tempo kiel eble sur la computer-- vi ankoraŭ
havas semajnon implementar it-- vi have-- vi estos
defiita minimumigi tiujn rimedojn.
Kaj tio estas vere la sola okazo ĉi semestro
kie vi estos kuraĝigitaj razi malproksime eĉ la plej bona elfaro
kostas alie.
>> Do what-- kiel ni vidi tion en reala kodo?
Lasu min nun kaj malfermu ekzemplo
ke intence nomiĝas Neniu Swap ĉar ĝi ne
fakte interŝanĝu la variabloj kiel vi efektive povus atendi.
Do ni rigardu.
Jen programo kiu ne havas CS50 biblioteko okazadas, nur normo / S.
Nun ni havas prototipon por interŝanĝa supren supro kiu ĵus
signifas ĝi estas alvenis al esti difinita poste.
Kaj jen ĉefa.
>> Mi arbitre atribuita x kaj y, respektive, la valoroj kaj du
nur ĉar ili estas malgrandaj kaj facile pensi pri.
Kaj tiam mi simple havas faskon de printfs kie mi havas prudento ĉeko. x estas 1
kaj y estas 2 estas supozeble kio tiuj printfs diros.
Do neniu magio tiom.
>> Tiam mi tuj aserti kun presi def, interŝanĝante dot dot dot.
Mi tuj vokos la interŝanĝa funkcio, pasante en x kaj y.
Kaj ni supozu por nun ke interŝanĝa estas implementado ĝuste
kiel ĝi estis antaŭ momento kun portempa variablo.
Kaj tial mi postulas sentime interŝanĝitaj.
x estas nun tiu kaj y estas nun.
Sed la dosiero, kompreneble, nomiĝas Neniu Swap.
Do ni vere vidi kion okazas.
Se mi kompilos neniu swap kaj tiam fari ./noswap, x estas 1, y estas 2.
Interŝanĝante interŝanĝitaj.
x estas 1, y estas 2.
Do ĝi vere ŝajnas esti mankhava eĉ kvankam swap-- ni rulumu malsupren now--
estas implementado ĝuste po la kodo mi proponis antaŭ momento.
Do ni ne ricevos imago kun la XOR ajxojn nun.
Ĉi tio, ankaŭ, devus labori nur kiel kun la lakto kaj OJ,
sed ne ŝajnas esti laborante.
>> Do ni faru ĉi denove.
Eble mi simple ne kurante ĝin dekstra.
Do ni kuras Neniu Swap denove.
Eble I-- ne.
Do ĝi estas nur ne laboranta.
Do ni faru iom prudento ĉeko.
Lasu min ĉi tie en Swap kaj nur aldoni, atendu minuton,
a estas% i / n kaj ni plug-in la valoro de.
Ĉar mi vere volas vidi kio okazas.
Kaj efektive, tiu estas a elpuriganta tekniko
ke vi povus uzi en oficejo horoj aŭ hejme jam,
parenca al la unua duono de Dan Armendáriz video en PSET3
kiun ni enkondukis presaĵo def kiel rekomendita tekniko, almenaŭ
por simplaj kazoj.
Lasu min antaŭeniri kaj kuri fari neniu interŝanĝa denove, ./noswap.
>> Interesaj.
Do rimarki kio ŝajnas esti vera. x estas 1, y estas 2, sed estas 2 kiam b estas 1.
Do tiuj du iel interŝanĝita sed x kaj y ne akiranta interŝanĝitaj.
Do esti klara, kio okazas estas, ĝis tie mi havas x kaj y
kaj tiuj estas variabloj lokaj en la medio de ĉefa, mi pasante en x kaj y
interŝanĝi.
Nun, swap, kiel aparta funkcio, estas libera nomi sian argumentadon
aŭ liaj parametroj ion ajn.
Foo aŭ trinkejo aŭ x aŭ y aŭ aŭ b.
Nur fari certe ke ili estas ne identa al x kaj y per,
Mi jam diris al kaj b.
Sed ni povus nomi ilin ion ni volas.
>> Kaj tiel ĝi aspektas kiel interŝanĝa estas aprobotaj
x-- AKA a-- kaj ĝi estas aprobotaj y-- AKA b.
Iel tiuj tri linioj estas interŝanĝante tiujn valorojn ĝuste
kiel Lauren faris kun la lakto kaj OJ.
Sed kiam ni presi la valoroj, a kaj b
ja interŝanĝu sed x kaj y havas neniun ŝanĝon al ili.
Memoru ke x kaj y estas supren tie.
>> Do ni povas vidi ĉi tra alian teknikon ankaŭ.
Kaj ĉi tro estas tekniko enigita en problemo starigis tri.
Ni iru antaŭen kaj fari tion en CS50 ID se vi ne jam.
Sur la dekstra flanko ni havas ĉi sencimigilo langeto.
Kaj se vi malfermos ĉi supre, ekzistas kelkaj arkaikaj informojn
kiu estas ĵetita ĉe vi komence.
Sed ni turmentus ĉi dise reala rapida.
>> Do, vi vidos lokaj variabloj.
Rezultas ke konstrui en CS50 IDE, kaj multajn programado medioj pli
ĝenerale, estas erarserĉilo.
Ilo kiu permesas vide vidi kio okazas ene de via programo
sen devi recurrir al aldono printfs kaj kompilante kaj kurado
kaj aldonante printf aj kaj kompilante kaj kurante, kiu jam, en oficejo horoj
aŭ hejmo, estas probable ricevas belajn teda.
>> Do jen, en nur momente, ke ni estas tuj vidi en reala tempo
la valoroj de nia loka variabloj.
Ni ankaŭ tuj povos agordi kio estas nomitaj breakpoints kiu
estas ŝancoj en mia programo paŭzi ekzekuto je specifa linio de kodo
ke mi estas scivolema pri.
Dekstra?
Tiuj programoj funkcias en ono de sekundo.
Estas ia bela por ni malrapidaj homoj povi paŭzi, preni momenton, vidu
kio okazas ĉirkaŭ certan linion de kodo
sen la programo plugado tra ĝi kaj finante tute.
Do breakpoints tuj permesos nin rompi kaj paŭzo je certa punkto.
>> Voko stako estas ornama metodo dirante kion funkcioj estas aktuale
vokite nuntempe.
Ĉefa ĉiam nomis unue.
Sed se Ĉefa vokas funkcio nomita Swap,
ni vere tuj vidos ĉi turo de funkcioj kiuj estis
nomita en inversa kronologia ordo.
Do ni vidas ke.
>> Mi tuj malzomi.
Mi tuj iros reen al mia kodo.
Kaj ĝuste ĉar mi volas esti pedanta tie,
Mi tuj iros antaŭen kaj klaku nur maldekstren de linio kvin.
Kaj tio kreas ruĝa punkto.
Kaj rimarki sur la dekstra flanko ke la erarserĉilo scias, hej,
Mi nur diris al Haltpunkto ĉe noswap.c linio kvin, specife
ĉe ĉi tiu linio de kodo.
Do la erarserĉilo scias ke mi petis ke la venontan fojon
Mi kuros mia programo paŭzo ekzekuto tie anstataŭ nur
kurante la tutan aferon super rapida.
>> Do nun mi tuj klaku la Debug butono ĉe la plejsupro de la IDE
kaj tio tuj fari la sekvajn.
Ĝi tuj malfermi komence iom timiga rigardanta dua terminalo window--
fora depuración de gastigi tian kaj such--
kaj ni revenos al kio ĉiuj kiuj signifas antaŭ longe.
Sed kio estas grava de momento estas ke tiu ruĝa punkto estis trafita,
la erarserĉilo havas intence paŭzis execution--
ne sur tiu linio si mem sed sur la unuan linio de reala kodo en tiu funkcio.
Kaj jen kial linio sep estas nun elstarigitaj en flava.
>> Kaj nun rigardu ĉe la dekstra flanko.
Ŝajnas, implicite, bele sufiĉe, x havas valoron kion?
0.
Kaj y havas kio valoro?
Nulo.
Kaj tio estas de atendi en la senco ke x kaj y-- ke flava line-- havas
Ne ekzekutita ankoraŭ.
Do x ne havas la valoro 1.
Ĝi povus havi iun alian valoron, tn rubo valoro.
Kaj ni akiris bonŝanca en tio ĝi estas nulo je tiu punkto, esence.
>> Do nun estas nur kelkaj butonoj ni bezonas zorgi
pri kiam elpurigi tiamaniere.
Rimarku tie, ni havas Play butonon.
Kaj se ni ludas aŭ bati rekomenci, tio estas nur
tuj kuri tra la resto de la programo
aŭ ĝis ĝi trafas alian Haltpunkto.
Sed mi ne metis ajnan alian breakpoints Do estas nur
tuj kuri tra la fino.
Tia malvenkoj la celo ŝovas ĉirkaŭ.
>> Do anstataŭ, mi zorgas pri tiuj ikonoj dekstre.
Kaj se mi ŝvebi super ilin, kiel vi devus ankaŭ,
vi vidos iom tips-- ilo konsiletoj.
Ĉi tiu estas ne transpaŝas.
Nun tio ne signifas skip la sekva linio de kodo.
Tio simple signifas ekzekuti ĝin kaj movi al la sekva, movi al la venonta,
movi al la sekva.
Alivorte, pere ke butono mi povas marŝi
tra mia kodo unu paŝon samtempe.
Linio por linio, laŭvorte.
Nun, dekstre de ke, ekzistas alia
ke ni vidos en nur momento.
Tio estas la tn Step Into ikono tio
tuj permesos min plonĝo en alian funkcion.
Sed ni vidu tion en nur momento.
Do mi tuj klaku transpaŝas.
Kaj nun rimarkas, kiel mi klakas tiun butonon ĉe supra dekstra,
teni viajn okulojn malglate sub Loka Variabloj kaj vidu kio okazas al x.
x estas nun 1 ĉar la flava linio nun ekzekutita
kaj ni pluiris al la linio 8.
Kaj en nur momento y devus espereble iĝi 2.
>> Nun, nenion interesan okazas por iom.
Ĉio ĉi estas estas printf.
Kaj rimarku, miaj malĉefaj terminalo fenestro, mi vidas la eligo de presaĵo def.
Kaj nun mi devas fari decido kiel la programisto.
Mi povas transpaŝas tiun linion de kodon, ekzekuti ĝin sed ne
atingi scivola pri kio estas ene.
Aŭ mi povas vere treti en ĝin kaj iras ene de Swap mem.
Do ni faru la lastan.
>> Lasu min kaj klaku Ne Transpaŝi sed Step Into.
Avizo, subite la fenestro ŝanĝoj
reliefigi la unua linio de kodo en Swap.
Tio linio 21.
Kaj nun, kio estas speco de funky estas ke, se vi rigardas ĉi tien, kiel atendita,
komo b estas 1 kaj 2, respektive.
Kial temp 32.767?
Memorigante ke temp, tre kiel la malplena taso antaŭ momento,
estas deklarita tie sur linio 21.
Kial 32,000- mi volas diri, kial estas ĝi nur iuj strangaj valoron?
Yeah?
>> Spektantaro: Ĝi ne pravalorizitaj.
>> DAVID J. Malan: Estas ne pravalorizitaj.
Do nia komputilo ĉiam havas fizikan memoron.
Ĝi ĉiam havas fizikan RAM.
Kaj ĉiam Zero kaj unu estas tie interne, ĉu ne?
Ĉar ni uzas nian komputilo tutan tagon,
vi uzas la CS50 IDE aŭ la serviloj tuttage.
Por ke RAM aŭ havas iuj nuloj aŭ iuj onia aŭ iuj nuloj kaj aĵoj.
Negrave ĉu aŭ Ne vi uzas ilin.
Vi ne povas simple havi malplenan spacoj, kie vi volas bitoj.
Ili estas ĉu nuloj kaj aĵoj.
>> Do rezultas ke temp, ĉar ni ne pravalorizitaj ĝin ankoraŭ,
ni havas tiuj 32 bitoj sed ili ne estis pravalorizitaj al ajna konata valoroj.
Do negrave kion ili plej lastatempe uzata for-- tiuj 32 bits--
ni nur vidante la artefaktoj de iuj antaŭa uzo de tiuj apartaj 32
bitojn.
Apenaŭ mi klakas Transpaŝi kvankam, Phew, temp tuj akiri la valoron 1.
Kaj se mi faros ĝin denove, a estas tuj estos transdonita la valoron 2
kaj tiam b tuj estos donita la valoro 1.
>> Kaj do kio estas bela hodiaŭ je tiu punkto en la rakonto
estas ke la erarserĉilo estas montrante min súper malrapide
ĉe mia propra ritmo, kio la stato de Swap estas.
Sed rimarki ĉe la supro tie, rimarki ke la alvoko stako reale
havas du tavolojn al ĝi.
Nun kiu estas elstarigita kiel Swap, se mi klakas sur Ĉefa anstataŭe,
Rimarku kiel la lokaj variabloj ŝanĝi ĉar la ellaboranto povas simple hop
ĉirkaŭe kaj iri en ajna malsama medio.
Do kvankam ni faras ĉion ĉi labori kaj korekte interŝanĝante a kaj b,
se mi iras tien kaj reen inter Swap kie a estas 2 kaj b estas 1 kaj Main,
jam Ĉefa estis trafitaj entute?
No.
Do kio estas la takeaway tie?
Nu, Ĝi rezultas ke ajna momento vi nomas funkcio kiel Swap,
kaj vi pasi ĝin argumentoj, kio vi pasas al la Swap funkcio
en tiu kazo estas kopio de tiuj argumentoj.
Do se x kaj y estas ĉiu respektive 32 bitoj, kio Swap fariĝas
Estas du novaj lokaj variabloj, aŭ argumentoj,
nomis kaj b-- sed tiuj estas arbitra names-- sed la mastro de nuloj
kaj aĵoj ene de a kaj b estas vicigita al esti identa al x kaj y
Sed ili ne estas la samon kiel x kaj y.
>> Estas kvazaŭ Ĉefa havas sur lia peco de papero la nombro 1 kaj 2 por x kaj y,
kaj tiam kiam mano tion peco de papero al Permuta,
Permuta tre rapide ricevas lia propra plumo, skribas malsupren
1 kaj 2 sur ĝia propra paperfolion, manoj malantaŭeniri la originalan xy al Main
kaj tiam faras sian propran afero kun a kaj b.
Kaj estas nun super grava ĉar tiu havas netriviala implikaĵoj
por vere skribi korektan kodon ĉar ĝi similus ni ne povas interŝanĝi
du variabloj.
>> Mi skribis ĝentilan Swap funkcio.
Ni implementado ĝin kun Lauren kiel ĝentilan interŝanĝa funkcio en realo,
sed ŝajne neniu el kiuj aferoj se vi ne povas reale
interŝanĝi du valoroj konstante.
Do ni bezonas alian vojon por fakte atingi tion,
kaj ni bezonas por povi reale solvi tiun problemon.
Kaj ĝi rezultas fjordon kaj ni venos reen al tiu aparta bildo
antaŭ long-- ĉi estas unu vojo, ke vi eble desegni via komputilo memoro.
Estas nur rektangulo.
Vi povus desegni ĝin ajnan nombro de manieroj sed estas
konvena desegni ĝin kiel rektangulo pro jena kialo.
>> Ni tuj komencos hodiaŭ kaj pretere parolas pri la tn pilo.
Kaj la stako estas nur eron de RAM-- eron de memory--
ke funkcioj havas aliron al kiam ili estas nomata.
Kaj tiel rezultas ke ĉe la tre malsupro de tiu pilo
estas kie ĉiuj Ĉefa loka variabloj kaj org C kaj org V kaj ĉiuj tiu aĵo
tuj iri defaŭlte. Kaj se Ĉefa vokas alian funkcion kiel Swap,
bone, Swap estas iranta akiri alian tavolo de memoro super ĝi.
>> Kaj tiel nur por doni al vi rapidan supraĵa bildo de tiu, se mi transiru here--
kaj mi speguli tiun sur la superkape kiel well-- kio vere mi havas,
se ni zorgas nur pri la fundo de tiu bildo nun,
estas ke kiam mi kuras programon kaj Main gets vokis,
Ĉefa ricevas eron de RAM en mia komputilo kiu estas
ĉe la malsupro de tiu tn pilo.
Kaj mi tuj desegni ĝin intence kiel kvadrato.
Do estas kiel 32 bitoj aŭ kvar bitokoj.
Se tiu ĉefa funkcio havas variablo nomata x kun valoro de 1
kaj ĝi havas variablo nomita y kun la valoro de 2, tio estas
kiel preni ĉi Sliver de memoro kiu Ĉefa doniĝis per la mastruma
sistemo kaj dividante ĝin supren tiel ke la unua loka variablo iras tie,
la dua unu iras tien, kaj jen ĝi.
>> Kiam Ĉefa nomas Swap, Swap ricevas sian propran tranĉaĵo de memoro
ke ni desegni ŝatas tion de la mastruma sistemo,
kaj ĝi tuj havos lia propra loka variabloj bazitaj
sur nia pli frua efektivigo kun lokaj variabloj a
kaj b kiuj komence akiri la valoroj 1 kaj 2.
Sed tiam, tuj kiam la Swap kodo ekzekutas,
kaj Lauren reale interŝanĝas la OJ kaj lakto, kio okazas?
Nu, tiu 2 iĝas 1, ĉi 1 iĝas 2, kaj, cetere,
estas temp variablo ke tio estas uzis tiun tutan tempon ke eventuale
iras.
Sed ne gravas kiom da laboro vi faras
en tiu linio of-- en ĉi memorspaco, x kaj y estas tute netuŝita.
>> Do ni bezonas iel donadon Swap kaj funkcioj kiel ĝi
sekreta aliro, se vi volas, al funkcioj like-- al memoro kiel x kaj y.
Do ni rigardu ekzemplo kiu helpas
nin vidi ĝuste kio estas estita irante sur tiu tuta tempo.
Mi tuj iros antaŭen kaj malfermu Komparu Nulo.
Kaj mi tuj fermi nia erarserĉilo, mi tuj
fermi ĉi timiga rigardanta mesaĝon la nur diras, atendu minuton,
vi estas en la mezo elpuriganta.
Mi tuj kaŝi tiun langeto tie nur reiri al simpleco.
Do ne maltrankviliĝu se GDB estas mortigita.
Tio simple signifas ke la programo havas estis rezignis, intence en tiu kazo,
apud mi.
>> Kaj nun Komparu Zero tion faras.
Mi uzas la CS50 biblioteko en normo / S.
Mi havas ĉefan funkcion kiu unua diras, ekparoli, kaj ricevas ŝnuro.
Tiam diras ĝin denove kaj ricevas alian ĉenon.
Kaj rimarki ke ĉi tiuj du kordoj nomas s kaj t, respektive.
Kaj nun ĉi tiu programo, Compare Nulo, lia celo en la vivo,
ĝi estas supozeble diru al mi, cxu mi tajpu la saman aferon?
Kaj do mi tuj reen al semajno unu.
Mi uzas mian egala egala operatoro kiu estas la kvalito operatoro.
Ne la asigno operatoro, la egaleco operatoro.
Mi simple komparante s kaj t.
>> Do ni vere iru antaŭen kaj fari tion.
Kaj mi tuj iros antaŭen kaj fari Komparu Nulo.
Mi tuj faros ./comparezero.
Kaj mi tuj iri antaŭen kaj diru ion
kiel, ni faru panjo en minuskla kaj kion pri panjo en majuskle.
Kaj kompreneble mi tajpas malsamaj aferoj.
Bone.
Tio atendi.
>> Ni ruli ĝin denove.
Ambaŭ fojojn fari minuskla, minuskla.
Tio aspektas súper identaj al mi.
Enter.
BONE.
Eble estas nur stranga ĉar ĝi ne ŝatante mia gramatiko.
Do ni faru majuskla MOM, ĉefurbo MOM, identaj.
Malsamaj aferoj.
>> Do kial estas tio?
Nu, kio efektive iranta sur sub la kapuĉo ĉi tie?
Do ni iru reen super tie por nur momento
kaj pripensu kion GetString fakte faras.
Kiam vi nomas GetString, jen funkcio ni
mem skribis kaj ĝi iel ricevas sekvenco de karakteroj de la uzanto.
Kaj ni supozu, ke la unuajn tempo mi vokas GetString, kiuj donas al mi
eron de memoro kiu similas ĉi.
Kaj se mi tajpis en ĉiuj minuskla m-o-m-- kaj kio iras post ĝi?
Nur rapidan prudento ĉeko.
>> Backslash nulo.
Ni scias tion.
Kaj memoras ke ni ludis ĉirkaŭe kun Zamila nomon
kaj estas multaj aliaj nomoj kiam Rob estis tie rigardante
ĉe kio daŭriĝas ene de memoro.
Por ke rakonto estas ekzakte la sama.
Jen kion GetString estas reveni al mi.
Nun, mia kodo antaŭ momento stokitaj la reveno valoro de GetString
en variablo nomita s.
Kaj tiam la dua tempo mi nomis ĝin, ĝi gardis ŝin en variablo nomas t.
>> Do, se mi iros tien, mi bezonas desegni ĉi lokaj variable--
kaj mi ĝenerale iranta tiri ŝnuron kiel just-- ni
nomas ĝin s-- kiel kvadrateto tie.
Nun somehow-- kiel faras panjo iri ene de tiu variablo s?
Nu, ni devas iri reen al unuaj principoj tie.
Kio GetString vere reveni?
>> Do rezultas ke M-Aŭ-M backslash nulo, kaj ajna nombro
de aliaj kordoj en memoro kiel Zamila kaj Rob aŭ Andy aŭ ajna aliaj,
estas kompreneble en nia komputilo RAM aŭ memoro.
Kaj via memoro RAM havas like-- vi havas koncerton de RAM, du koncertoj de RAM,
aŭ miliardo aux du miliardoj bajtoj, aŭ eble eĉ pli ĉi tiuj tagoj.
Do ni supozu, por hodiaŭa celoj, ke ne gravas kiom ni kalkuli
ilin, sed ni povos kalkuli ĉiun de tiuj miliardoj aŭ du miliardoj
aŭ kvar miliardoj bajtoj.
>> Kaj ni nur arbitre diras ke tiu estas la unua mordo, dua mordo,
tria, kvara.
Mi intence ne uzante nulo por hodiaŭ sed ni revenos al tio.
Do alivorte, se tiu estas la tre unua tempo mi uzas la programon,
Mi nur nun bonŝanca kaj la unua mordo estas ĉe situo unu tiam du
tiam tri ol kvar.
Kaj se mi daŭre desegnado, skatolo nombro du miliardoj estus maniero super tie.
>> Do kio vi do pensas, GetString vere revenas?
Ĝi ne reveni M-Aŭ-M backslash nulo per si ĉar tio klare
ne taŭgas en la skatolo ke mi desegnis.
Do kion alian povus GetString reale revenanta ĉiuj tiuj semajnoj?
La respondo estas en la tabulo tie ie.
Vi ne povas persvadi M-Aŭ-M backslash nulo, do kion povus fari senton anstataŭe?
Se vi devis esti super inteligenta, metante sur la tn inĝenierio ĉapelon,
kion vi povus reveni?
Kio estas la malplej kvanto de informo vi povus reveni kiuj volus ankoraŭ
lasu vi trovas M-Aŭ-M en memoro?
Yeah?
>> Publiko: Unu.
>> DAVID J. Malan: Unu.
Kaj kial unu?
Publiko: Ĉar ĝi rakontus vi kien iri [inaudible].
DAVID J. Malan: Ĝuste.
Mi nur tuj revenos la adreso de la kordo ke Mi akiris.
La adreson en tiu kazo estas loko unu.
Do kio vere estas stokitaj en s-- kaj ĉiun ĉenon variablo tiel far--
ĵus estis la adreso de tiu ĉeno.
>> Dume, se mi nomas GetString duafoje kaj mi
entajpi laŭvorte la sama thing-- M-Aŭ-M kun lowercase-- M-Aŭ-M
kaj alia backslash nulo, kaj nun eble mia programo
kuris por iu tempo do eble tiu Estas 10, tio estas loko 11, tio estas 12,
ĉi estas 13.
La komputiloj uzante alian memoro ial ajn.
Kio nun iras en mian duan ŝanĝiĝema en mia programo t?
10.
Ekzakte.
>> Kaj tial kiam ni rigardas la fontkodon de tiu ĉi programo
kie mi simple provas kompari la du valoroj,
estas s egala egala al t, kio estas la evidenta homa respondo?
Nur ne ĉar 1 ne egalas 10.
Kaj tiel ene difinitaj kuŝas ŝanco por ni vere
nur iri reen al, denove, unua principoj kaj pensas pri, nu,
kio okazas sub la kapuĉo?
Ni parolis pri bitoj kaj bajtoj kaj memoro,
sed ĝi estas fakte utila por kompreni ĉar kiam vi vokas GetString,
eĉ se ni pensas lin estas reveninte M-Aŭ-M aŭ ŝnuro panjo
aŭ Andy aŭ Zamila aŭ simile, teknike
ĝi estas nur reveni la adreso de tiu bloko de memoro.
>> Sed tio estas bone.
Ĉar kiel mi scias kie la ŝnuro finiĝas?
Se mi nur donita la komenco?
Nu, la backslash nulo, ĉu ne?
Ĝuste en lineara tempo mi povas presi kun presitaj def M-Aŭ-M.
Kaj kiam mi vidos backslash nulo, Mi ne zorgas, kie mi komencis,
Mi jam scias implice kie mi devas fini.
>> Kaj tiel hodiaŭ markas la beginning-- kaj permesu min fari tion draste ĉar ni
trairis multajn ĝenojn al akiri tiujn ĉi tie trejni wheels--
tial hodiaŭ la trejnado radoj komenci elspezi kaj ni malkaŝi en least--
>> [Aplaŭdo]
>> Tio estis bone valoras la vojaĝon Celi ĉimatene, jes?
Do now-- ekzistas, rezultas ekstere, ne tia aĵo kiel ŝnuro.
String ne ekzistas.
Estas sinonimo ke ni havis ene de la CS50 biblioteko.
Nun, ni tuj komencu nomante s kaj t ne kordojn sed char steloj.
Kaj la char stelo Ni turmentus aparte antaŭ longe.
Sed tiu estas, ke eĉ se ni daŭre
uzante GetString por nun, teknike mi devas
esti dirante char stelo kaj char stelo.
>> Kaj ĝi rezultas ke kion stelo tuj signifi estas io
nomita puntero aŭ adreson.
Kaj fakte, teaser por kio kuŝas antaŭen
estas tiu 20 dua tranĉeto de nia amiko Noĉjo Parlante Stanford
kiu, vere tempo antaŭ, elspezi ridinda kvanto de tempo,
kiel bona mi povas rakonti en lia kuirejo aŭ lia kelo,
farante Claymation enkondukanta al la mondo
nomita gravulo Binky kun kiu ni volas
enkondukus venontfoje al punteros.
Do tie estas antaŭrigardo de kio estas por veni.
>> [VIDEO reprodukto]
>> -Hey, Binky.
Vekiĝu.
Estas tempo por montrilo amuza.
>> -Kio estas tio?
Lernu pri punteros?
Ho, Goody.
>> [FINO reprodukto]
DAVID J. Malan: Kaj sur tiu noto, Ni vidos vin merkredon.
Bone.
Kiu estas dancado?
Venu.
Kiu estas dancado?
Vi volas min akiri ĝin komencis?
Mi havos ĝin komencis.
Woooo!
>> Lauren: Dolĉa imago Moseo.