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. 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.