DAVID J. Malan: Aquest és CS50 i aquest és el començament de la setmana quatre. I, noi, és Volkswagen a problemes tot per culpa de programari. Fem una ullada. [REPRODUCCIÓ DE VÍDEO] -Cars, Els personatges més intel·ligents en les pel·lícules de Ràpid i Furiós. Aquesta setmana fabricant d'automòbils alemany Volkswagen va trobar enmig d'un escàndol de proporcions potencialment criminals. -Volkswagen Es prepara per a milers de milions en multes, possibles càrrecs criminals per als seus executius, com la companyia es disculpa per a la manipulació dels 11 milions de cotxes a l' ajudar-la a vèncer les proves d'emissions. Models dièsel -Certs eren dissenyat amb un sofisticat programari que la informació utilitzada incloent el posició de la direcció i el vehicle accelerar per determinar el cotxe era sotmetre a les proves d'emissions. Sota aquesta circumstància, el motor reduiria les emissions tòxiques. Però el cotxe va ser manipulada a pont que quan s'estava sent conduït. Les emissions van augmentar de 10 a 40 vegades per sobre dels nivells d'EPA acceptables. [FI DE REPRODUCCIÓ] DAVID J. Malan: Així que anem a fer una ullada a aquest i veure exactament com això podria ser implementat i com això podria afectar tants cotxes com aquest. Així que en la meva mà aquí són la premsa llançament que va ser emesa per la EPA-- el Medi Ambient Agència de Protecció qual és l'agència reguladora nord-americana que maneja les preocupacions ambientals, i després el real avís legal que era enviar a Volkswagen fa tot just uns dies. Així que l'EPA escriu, i revela ara públicament, un programari sofisticat algoritme en certa Vehicles Volkswagen detecta quan el cotxe està en proves d'emissions oficials i converteix les emissions complets controla només durant la prova. L'eficàcia de aquests vehicles contaminació dispositius de control d'emissions és enormement reduït durant tota la conducció normal situacions. Això es tradueix en cotxes que compleixen amb la estàndards en el laboratori o proves estació, però durant el funcionament normal emetre oxides-- nitrogen o NOx-- de fins a 40 vegades la norma. El programari produït per Volkswagen és un dispositiu de final de la cita cita, derrota, tal com es defineix pel Clean Llei d'Aire als EUA .. Ells diran que l'EPA i altra agència descobert el dispositiu manipulador programari després d'una anàlisi independent per investigadors de West Universitat de Virgínia. NOx contribueix a la contaminació el diòxid de nitrogen, ozó troposfèric, i les partícules fines. L'exposició a aquests contaminants s'ha relacionat amb una àmplia gamma de efectes greus de salut, incloent augment de l'asma atacs i altres respiratòria malalties que poden ser prou greus enviar a la gent a l'hospital. L'exposició a ozó i matèria en partícules té també s'ha associat amb prematura mort per respiratòria relacionada o cardiovascular efectes relacionats. Els nens, els ancians, les persones amb malaltia respiratòria preexistent estan particularment en risc d' efectes en la salut d'aquests contaminants. Només cal dir, és molt greu. I llegirem només un extracte més i després anem a fer una ullada a les implicacions subjacents d'això en el context d'un cotxe. En concret, Volkswagen fabricat i instal·lat programari en l'anomenada control electrònic module-- o ECM-- de aquests vehicles que detectats quan el vehicle s'està provant per el compliment de les normes d'emissió de l'EPA. Sobre la base de diverses entrades, inclòs el posició de la roda de direcció, vehicle velocitat, la durada del motor de operació, i la pressió baromètrica, aquests inputs precisament seguit dels paràmetres del procediment d'assaig utilitzat per federal les proves d'emissions per a la certificació de l'EPA propòsits. Durant les proves d'emissions de l'EPA, el programari vehicles ECM córrer programari que va produir resultats d'emissions compatibles. La resta del temps, el programari ECM vehicle córrer un camí separat calibratge que va reduir l'eficàcia de la sistema global de control d'emissions, específicament el catalítica selectiva reducció del NOx magra trap-- que ja ho veurem en un moment. Com a resultat, les emissions de NOx augmentat per un factor de 10 a 40 vegades per sobre dels nivells compatibles amb l'EPA depenent del tipus de cicle de conducció. Així que el que això realment significa, i la codi font per al programari de funcionament en el Volkswagen que no té però, donat a conèixer públicament, és que, efectivament, aquest equivalent és en algun lloc a l'interior del codi de Volkswagen. Si vostè està sent provat, i si el cotxe detecta certs factors ambientals de la mateixa manera que el volant posició o el moviment o manca d'ella del cotxe o qualsevol nombre d'altres factors que són la hipòtesi actualment a ser part d'aquesta fórmula, simplement s'encenen controlar les emissions completes. En altres paraules, comencen emetent menys dels contaminants. Altrament, en tots els altres situació quan no es detecta com al laboratori, simplement no ho fan. I així es pot simplificar això en més pseudocodi de formigó amb una mica així. Si les rodes estan donant volta però el volant no és, suggerent que el cotxe està en algun tipus de cilindre giratori però en algun tipus de magatzem està provant, a continuació, es comporten com el EPA li agradaria que vostè. En cas contrari no. Així que anem a fer una ullada en un curt vídeo que fes un cop d'ull al que les implicacions són d'aquest fet mecànicament. [REPRODUCCIÓ DE VÍDEO] -Darrera Divendres l'EPA va anunciar que alguns Actuacions Volkswagen Audi van fer entre 2009 i aquest any estaven usant un dispositiu anomenat derrota moure per les lleis d'emissions dissenyada per mantenir l'aire net. Però, què vol dir això exactament? Bé, els cotxes moderns tenen dotzenes dels ordinadors dins d'ells. I alguns d'aquests equips ajudar a coordinar les funcions del motor per a una òptima el rendiment mentre s'assegura que no hi ha massa escombraries que surt del tub d'escapament. Ells realment han estat treballant d'aquesta manera des de fa dècades. Bàsicament, cada part del motor d'un cotxe modern té un sensor o controlador en ella, i aquestes ordinadors estan llegint en les dades de milers de vegades per segon per preparar ajustos de la mateixa manera que la proporció de combustible a l'aire això va en els cilindres. Aquests Volkswagen engany i models d'Audi són els motors dièsel, i els dièsel tenen una més realment important equip paràmetres controlats, que és la quantitat de combustible no cremat anar en la fuita. Ara que sona malament. No sona com vostè vol combustible no cremat d'entrar al tub d'escapament. Però en el cas d'una dièsel, vostè té alguna cosa anomenat un parany de NOx que és un dispositiu que absorbeix i trampes per als òxids de nitrogen que són contaminants que faria en cas contrari anar a l'atmosfera. I l'efecte d'aquest parany de NOx es veu reforçada amb el combustible sense cremar. Així que un dispositiu manipulador és un programa especial dins d'aquests equips que poden fer que sigui veurà com el cotxe compleix amb les emissions normes fins i tot quan no ho fa. Volkswagen tenia un problema a les mans. Els seus motors dièsel eren coneguts per aconseguir un gran estalvi de combustible, però el parany de NOx només funciona bé quan s'està utilitzant més combustible. Així que el cotxe seria detectar, l'ús d'aquest dispositiu de la derrota, quan s'estava fent una de les emissions prova, seria utilitzar més combustible, fer bé la feina trampa de NOx, emissions estarien bé. Però llavors vostè aconsegueix en el camí, el dispositiu s'apaga, vostè està cremant menys combustible però vostè està posant tant com 40 vegades més contaminants a l'atmosfera. Però, com ho va fer diables el cotxe sap que era s'està provant per al compliment de les emissions? L'EPA diu que va ser un sofisticat sistema que comprova coses com la posició del volant, la velocitat, el temps que el motor estava encès, i fins i tot la pressió atmosfèrica. En altres paraules, hi va haver cap manera això va ser accidental perquè el programari va ser dissenyat amb molta cura per detectar una prova oficial d'emissions. Això és una cosa de molt seriós engany i això és ¿Per Volkswagen està en tals seriosos problemes. De fet, el seu conseller delegat, Martin Winterkorn, simplement va renunciar. Llavors, què passa després? Bé, si ets un dels milions de mitjana Jetta dièsel, Beatles, Golfs, Passat, o Audi A3S efectua, La bona notícia és és que el seu cotxe està encara segur per conduir. No ha de deixar-ho de banda fins que Volkswagen emet un recés. Però en algun moment són probablement va a tenir per actualitzar el programari dins del seu cotxe. Quan això passa vostè pot ser tenir menys milles per tanc. Els advocats ja estan preparant per demandes col·lectives el que els propietaris podrien quedar compensat en algun moment en el futur. Però això no va a succeir en el curt termini. [FI DE REPRODUCCIÓ] DAVID J. Malan: Així que això planteja en realitat una interessant qüestió d'imatge més gran pel que fa a la confiança. Oi? Tots nosaltres tenen iPhones o Androids o alguna cosa en les nostres butxaques més probable aquests dies, o portàtils en els nostres llargs que són programari que s'executa fet per Apple i Microsoft i raïms d'altres empreses. Però, com sabem que el que aquests productes de programari estan fent és en realitat el que aquests companyies diuen que estan fent? Per exemple, qui pot dir que cada vegada que fer una trucada al seu iPhone o telèfon Android o similars, que aquest número de telèfon tampoc és sent pujat al servidor d'alguna empresa a causa d'algun programa que tens escrit, si es tracta de l'operació sistema en si com iOS o Android, o perquè vostè ha descarregat alguna aplicació de tercers que d'alguna manera és escoltar a tot el que estàs escrivint en o tot el que en realitat estàs dient. Com saps que, quan es vostès estan executant Clang O Fer compilar el programari propi a CS50, com ¿Et el mateix personal que CS50, per mitjà de la biblioteca CS50, No ha estat la tala cada cadena que mai ha arribat o cada polzada que has aconseguit? Bé, certament es podria mirar en el codi font d'alguna cosa com la biblioteca CS50, que podria mirar el codi font per al sistema operatiu Linux que s'executa en IDE CS50. Però una presentació increïble se li va donar el 1984 a la recepció del Premi Turing per un informàtic molt famós conegut com-- anomenat Ken Thompson, qui va rebre el Premi Turing, que és una espècie de ciència d'equip Premi Nobel, si es vol, pel seu treball en un sistema operatiu anomenat Unix, que és molt similar a esperit per al que utilitzem, que és Linux. I la pregunta que li va fer al seu discurs d'acceptació, en essència pel qual es fixa el marc per a anys i anys de discussió sobre la confiança i la seguretat, era això. ¿Fins a quin punt si un la confiança d'un declaració que un program-- una peça de software-- està lliure dels cavalls de Troia? Potser és més important confiar la gent que va escriure el programari. I, de fet, ens hem vinculat a la xerrada que ell va donar al acceptar aquest premi en els anys 80 en el lloc web del CS50 a la pàgina de Conferències per avui. Perquè el que veuràs és que en realitat li dóna bastant simple exemple de com fins i tot un compilador com Clang o el que sigui compiladors altres han utilitzat en el passat, ¿I si s'incrusta en el qual el compilador nosaltres estan utilitzant és una mica si condició que essencialment diu, si vostè nota que el codi està utilitzant la funció GetString o la getInt funció, endavant i inseriu una porta del darrere o un cavall de Troia de tal manera que aquest programa ara compta amb alguns zeros i els que ho fan alguna cosa maliciós. Registre de la totalitat del seu pulsacions de teclat, càrrega de les dades a algun servidor, o realment qualsevol cosa. I el que Ken Thompson va fer en la seva xerrada és demostrar que, fins i tot si vostè té accés a la font codi d'un compilador que maliciosament podria estar fent això, no importa perquè hi ha aquest ou i la gallina realitat del passat que molts anys mitjançant el qual els compiladors s'utilitzen per compilar ells mateixos. En altres paraules, camí de tornada quan algú havia d'haver escrit el primer compilador. I a partir de llavors, cada vegada que he actualitzat un compilador canviant el seu codi font, l'addició de característiques i recompilarla per a gent com nosaltres a utilitzar, així, que estan usant la vella versió del compilador per compilar el nou versió del compilador. I si vostè fes un cop d'ull en la xerrada que ha donat, veuràs que ja que la circularitat, en realitat es pot tenir errors o Troians incorporats en el programari estem utilitzant. I fins i tot si ens fixem en la codi font dels programes, ni tan sols podria ser evident pel fet que l'engany és en realitat d'alguna versió anterior d'un compilador que des de llavors ha estat la injecció de l'amenaça al nostre programari. La qual cosa és només per dir, que realment no pot i no ha confiar en el programari que s'executa en els nostres ordinadors portàtils o telèfons o qualsevol nombre de llocs. I, de fet, més endavant en aquest semestre quan vam començar a parlar de la programació web i en realitat començar a construir aplicacions web nosaltres mateixos, parlarem d'aquests amenaces i altres. Ara, és possible que s'hagi preguntat i es va adonar que hi havia un diminut Darth Vader en els clips que The Verge mostrava allà sobre Volkswagen. Si que mai has vist, em pensem que hauria alleugerir l'estat d'ànim, perquè això és tot molt depriment i alarmant. Vaig a mirar cap enrere en el Super Bowl 2011 quan un comercial per Volkswagen-- i això gairebé els fa agradables nou-- sortir a l'aire per primera vegada a la televisió. És el segon clip 60 que crec que vostè gaudirà. [REPRODUCCIÓ DE VÍDEO] [MÚSICA - TEMA DE "STAR WARS"] [Gos borda] [CAR COMENÇA] [FI DE REPRODUCCIÓ] DAVID J. Malan: Sí. Només estava revisant. Aquest cotxe està en la llista de violacions. Tot bé. Així que ens fixem en alguns Pseudocodi fa un moment. I aquí hi ha una més gran fragment de codi pseudocodi que hem vist un parell de vegades fins ara. I farem servir aquesta és una oportunitat ara per introduir una nova programació tècnica que vam fer veure algorítmicament la setmana passada quan mirem fusió tipus. Però anem a formalitzar-lo i veure com podríem utilitzar-lo en codi real, i després utilitzarem aquest tècnica pel camí més probabilitats de resoldre altres problemes. Així que aquest va ser un dels primers programes que mai va escriure, tot i que de Codi pseudocodi. I el que aquest programa ens va permetre fer curs era trobar Mike Smith en una guia telefònica. I compte, en particular, les línies de vuit i 11, que tenia aquesta declaració a Vés a. I de fet, certa idiomes, C entre ells, en realitat tenen un declaració que és, literalment, anar a que li permet saltar a una línia específica. És generalment mal vist perquè que es pot abusar fàcilment i vostè pot començar a saltar de la seva programa per tot el lloc en oposició l'ús de la classe de la lògica i el flux de control que hem utilitzat fins ara amb només bucles i condicions i similars. Però podem simplificar aquest algoritme en el codi de pseudocodi de la següent manera. En lloc d'aquesta iteratiu o bucle enfocament on sempre tornem i d'anada i tornada a la línia de tres, ¿Per què no només tipus de Punt i més en general, diuen en línia de set i 10, només cal substituir aquests dos parells de línies amb, més si Smith és anterior en el llibre que anem a buscar Mike en el mitjana esquerra del llibre. Perquè si Smith és més tard en el llibre, buscar Mike a la dreta la meitat del llibre. I ja notar la circularitat. Oi? Estic a la recerca de Mike en la guia telefònica i després Finalment em vaig enganxar potser línia de set o potser la línia 10 i el meu instrucció per a mi és la recerca Mike en la meitat de la guia telefònica. Bé, com puc cercar Mike? Sóc al mig de la recerca de Mike, per què estàs sort que m'envia en un cercle? Però això està bé perquè el que és succeint a la grandària del problema, com està escrit en la línia 7 i 10? No només estem dient recerca per Mike, buscar Mike. Estem dient específicament què? Cercar per ell en la meitat esquerra de la meitat dreta que és efectivament la meitat de la mida del problema. Així que està bé que estem tipus de participar en aquesta circularitat, aquest argument circular, perquè almenys estem fent que el problema més i més petita. I, finalment, arribarem que l'anomenat cas base, on tenim una sola pàgina esquerra- com el nostre voluntari la setmana passada did-- teníem una pàgina l'esquerra i després no ho fem ha de seguir buscant Mike Smith perquè està bé en aquesta pàgina o no ho és. Llavors, com podem posar en pràctica aquesta idea, aquest mena de circularitat en el codi real? Bé, podem aprofitar una tècnica això és generalment coneguda com recursivitat. I hem vist això en el pseudocodi per l'ordenament per barreja la setmana passada. Recordem que aquest va ser el pseudocodi per a l'ordenament per barreja. Es podria dir que és encara més simple que bombolla o la selecció o l'ordenació per inserció només en termes de la simplicitat amb el que pot expressar-ho. Però això és perquè estem espècie de circular dient: buscar alguna cosa mitjançant la recerca de nou. Però estem buscant, ja sigui en la meitat esquerra o la meitat dreta i després, eventualment estem la fusió en aquest cas. Però aquí, també, amb aquestes dues línies de classificació, ens tornem a tenir present idea de recursivitat. I concretament el que això significa, en el context d'un algoritme, és que un algorisme és recursiu si s'utilitza o es fa dir. O en termes de C, una funció és recursive-- una funció anomenada foo és recursiu si foo, en algun lloc del seu codi font, crida a la pròpia funció foo. I això és dolent si tot foo alguna vegada ho fa és cridar a si mateix una i altra vegada. Està bé si foo s'atura el temps, igual que ordenament per barreja, en dir, espera un minut, si aquest problema és super petita, per exemple, o el vaig trobar qui sóc buscant, simplement tornar. No de forma recursiva, no ho facis cíclicament nou cridar-me. I així anem a fer una ullada a com això podria funcionar. Així que vaig a seguir endavant i obert dos exemples de codi font aquí. Una d'elles es diu sigma 0. I això no és en absolut recursiu, però tirem Un cop d'ull al que fa aquest programa. He despullat tota comentaris d'ella, però tots del codi font en CS50 de pàgina comentaris si voler llegir a través d'ell de nou més tard. I farem un parell de seny comprova aquí. Així que a la part superior d'aquest codi, que tenim són CS50.h. Què fa això? Per què aquí? En termes senzills raonable. Què fa això? Sí. AUDIÈNCIA: ¿Així que la funció getInt funciona. DAVID J. Malan: Perquè la funció getInt funciona. Perquè dins d'aquest arxiu, CS50.h, que veurem en poc temps en termes del seu codi font, té un munt de funcions declared-- getInt, GetString, i un munt de altres- i, llevat en realitat hem de Inclouen línia, el compilador no és Clang va a saber que existeix. I mateix passa amb la línia 2 on es defineix int printf, que és una funció seguim usant una mica. Ara, la línia de quatre sembla una mica estrany perquè és només un acudit. Té un punt i coma, sense arrissat claus, no hi ha codi dins d'ella. Però el que vam fer nosaltres anomenem aquesta cosa de setmana passat? Sí. Així, un prototip. ¿I per què tenim una prototip que sembla a ser una mica redundant normalment perquè normalment veure la funció de nou més endavant a l'arxiu, oi? Així que per què no ets més que tener-- gratant-se el cap, però vaig a prendre. Sí. AUDIÈNCIA: [inaudible] la funció després de la principal. DAVID J. Malan: Exactament. Perquè el compilador et coneix finalment va a definir o implementar després que la funció principal, presumiblement. Així Clang i la majoria compiladors són una mena de ximple i que només sabran el que els diguis. I si voleu utilitzar una funció anomenada sigma, vostè ensenya millor el compilador que hi ha per endavant. Ara, en si principal, fins i tot encara que és un munt de línies, és bastant familiaritzat amb sort per ara. Té un do while el propòsit en la vida aquí aparentment és aconseguir un enter positiu des de l'usuari. I just mantenir molestant o ella fins que cooperar. Després, en la línia 16 que tinc una trucada interessant. IntAnswer. Que a la mà esquerra costat em dóna un Int que pot almacén-- anomenada Answer-- que es va a emmagatzemar, pel que sembla, el valor de retorn de sigma. Així sigma és només una nom arbitrari però significatiu que jo he donat a una funció el propòsit en la vida és prendre 1 argument-- l'anomenarem N en aquest cas-- i acaba de prendre la suma d'aquest número més cada nombre positiu que és menor que ella. Així que si pas en el número 2 de sigma, vull afegir 2 més 1 a més 0-- no 0-- manera que em dóna 3. Si pas de 3 a sigma, vull té 3 més 2 més 1, el que em dóna 6. I així successivament. Per tant, només es suma tot el nombres menors que o iguals a ell. Ara, aquí només vaig per imprimir la resposta. Així com una comprovació de validesa ràpida, anem a fer sigma 0-- sigma slash dot 0-- i m'ho dius a mi escric en 2. I de fet si 3. Permetin-me escric en 3. Jo a la veritat si 6. I si algú pot fer els càlculs ràpidament, si faig 50 ¿què vaig arribar? AUDIÈNCIA: [inaudible]. DAVID J. Malan: Bé, no. Però 1275 que està bastant a prop. Així que això és el resultat de fer 50 més 49, més 48, més 47, més 46 fins al fons a 1. Així que això és tot sigma fa. Però anem a veure com hem implementat ara. Així que aquí és la pròpia funció. I això no sembla tenir res a veure amb la recursivitat encara. De fet, estem utilitzant un tècnica de la vella escola. Estic inicialitzar una variable anomenada suma a zero, llavors tinc una foreloop aquí, i estic declarant un Int anomenada I, fent-la igual a 1-- encara que podria posar-lo igual a zero, però des que estic fent, a més, a qui li importa si és zero o un. Es va a tenir cap efecte. Així que estic iteració sempre que I és menys d'o igual a m, que és l'argument que va ser aprovada en. I llavors jo segueixo incrementant I. I idea del bucle de tot el que estic fent és fer suma més iguals I. I això és deliberat. Jo no vull fer, en aquest cas, com a suma plus plus. Vull afegir realitat el valor actual de R que manté cada vegada més gran i més gran i més gran al compte en execució. I llavors torno suma. I així resposta obté la suma de valor. I després imprimir-lo. Així que hi ha una oportunitat aquí, però, per simplificar tipus de aquest codi conceptualment i el tipus de cop d'un ment en termes de la simplicitat tot i que pren un temps per ordenar d'apreciar per què aquest és de gran abast en aquests petits exemples. Aquí és així que la sigma un-- segona versió d'aquest codi. Tot fins la part superior és idèntica manera la mateixa història s'aplica com abans. Però ara anem a veure el aplicació de sigma que He reduït a només aquests lines-- quatre línies de codi, de veritat, a més d'algunes claus i espais en blanc. Però, què estic fent? Si m és menor o igual a zero, he de gestionar tipus de aquest cas super simple. I si vostè em lliuri zero o gens negativa que és simplement estrany, Jo només vaig a arbitràriament però consistentment tornar a zero. No vull que aquesta cosa entrar en alguns infinita rar bucle causa d'un valor negatiu. Així que estic dient, si em dones zero o menys, vaig a tornar a zero. Però això és bo, perquè això és que sola pàgina de la guia telefònica el que queda. Estic mossegant un problema molt específic i no cridar a alguna cosa de forma recursiva. Però en la línia 31, la qual cosa No em sembla que estic fent? Els parèntesis són només mantenen coses, amb sort, una mica més clar. Però tot el que estic fent és que sóc tornar M-- ho de lliurar mi-- més la valor de M-- ho sento, més el valor de sigma de m almenys 1. Llavors, què vol dir això? Si em dónes el número 3 com a entrada, la resposta que vull aconseguir en última instància, es 6 ia 3 més 2 més 1 juny em dóna. Però, com ho penso com s'està executant el codi? La primera vegada que jo dic sigma i pas en el valor 3, això és com dir que en una peça de paper, aquí hi ha el valor 3 i m'han passat aquest com sigma. 3 és, òbviament, no inferior a 0 pel la condició IF no s'aplica. El més ho fa. Llavors, què faig? Vull tornar m, que és 3, a més de sigma m almenys 1. Així que permetin-me un seguiment d'això. Vaig a posar això tros de paper cap avall. ¿I quin valor, per ser clar, vaig a passar en sigma en aquest punt de la història? Quin nombre? 2, oi? 3 menys 1 és 2. Així que només necessito una mica tros de paper aquí. Així que ara sigma s'està cridat de nou. I m'he posat deliberadament això baix perquè és una mena de pausa aquesta versió de la història perquè ara estic centrat en senyal de m almenys 1. Així que era m 3, m mínim 1 és 2. Així que aquí és 2, que he estat vaig passar. 2 és, òbviament, no menys de 0 perquè el cas no s'aplica. Else torno m, que és això cosa, a més de sigma del que de valor? Així que si sigma de 1-- perquè m és en aquest moment 2 per a 2 menys 1 es 1. Així que ara tinc només el valor 1. Estic passant simplement el nombre 1 a la funció sigma-- o jo mateix aquí-- manera 1 no és, òbviament, menor que zero, encara no s'aplica. Retorn Else 1 més sigma de què? 0. Així que permetin-me record. Vaig a tornar a això més endavant. Ara vaig a seguir endavant i jota el nombre 0, perquè això és el meu argument o paràmetre. Estic vaig passar el nombre 0 i, finalment, aquest procés tot just de repetir-me anunci nauseum cessa perquè el Què faig una vegada que veig això 0? Torno zero. Així que ara vostè ha de rebobinar la història. Si ara vaig cap enrere en el temps, Què va ser el més recent Vaig fer si estigués literalment rebobinar un vídeo? Vaig a recollir el més recent 1 i això em dóna 1 més 0 es 1. Si segueixo rebobinat de la història, això em va donar 2 plus aquest valor corrent, que és 1. Així que això és 3. I llavors jo seguiré rebobinat. La primera vegada que vaig posar el nombre 3-- mode 3 més 3 em fa 6. I ara, si ha rebobinat el vídeo fins a aquest punt, aquesta era la molt primera pregunta que vaig fer. Quan va passar 3, el que és de 3 sigma? És de fet 6, la suma de tots aquests trossos de paper. Així que si això pren una mica de temps per a embolicar la seva ment al voltant, això està bé. Però consideren que ser un poc-- que era molt deliberada que apili aquests números a la part superior d'un a l'altre. És una mica com tenir un memory-- un registre en el temps, com un depurador en un vídeo, que, efectivament, puc retrocedir en. I tornarem a aquesta metàfora en només una mica. Però primer, resulta que hi ha un munt de geeks i gent divertida, Suposo que, a Google. Tant de bo algú que és molt bo en la ment de buscar a Google pujant per un moment i ajudeu-me busco alguna cosa? Clau molt, molt baix. Algú que mai és arribar abans, potser. D'ACORD. Sí? Vine. Anem cap avall. Com et dius? SAM: Sam. DAVID J. Malan: Sam, anem cap avall. Aquest és el mateix. Encantat de conéixer-te. Hey. Anem una altra vegada. Així que tot el que necessito que facis, si vostè podria, Sam, aquí és Google. ¿Es pot buscar el terme recursivitat? No ho espatllis. I ara let's-- si. Acceptar Feu clic en això. Millor que faci clic. Ah, ho aconsegueix. No? D'ACORD. Així que farem un parell dels altres. No tant relacionada acadèmicament aquí, però han de mai buscat a Google per anagrama? SAM: No. DAVID J. Malan: OK. Cerca d'anagrama en lloc de recursivitat. Què et sembla torta. Alguna vegada has buscat torta? Ara, aquest és una mica difícil de veure però espero everything's-- acord. És només tu i jo gaudint d'això. D'ACORD. Així que finalment, aquest one's-- que és una mica torta. Ara feu un rotllo de barril. Meravellós. Tot bé. Moltíssimes gràcies a Sam. Aquí tens. Gràcies. Llavors, què està passant en tot d'aquests exemples tontos? Així que en realitat, sota de la caputxa de Milions de línies de codi de Google pel que sembla és una mica ximple SI condicions que són essencialment comprovar si l'usuari té escrit en aquesta frase, fer alguna cosa que probablement va tenir una quantitat no trivial de temps per posar en pràctica només per ser divertit d'aquesta manera. Però això és tot el que es redueix fins a sota de la campana. Però, per descomptat, la recursivitat és més dels més geeks exemple entre aquests trucs especials. I segur que hi ha altres per aquí així que potser ni tan sols hem descobert de moment. Així que mireu, o considerar Ara el següent programa, i certament agafar qualsevol d'aquests en la seva sortida. Vaig a seguir endavant i obrir un programa que és va a tractar d'intercanviar dos valors. Però abans d'anar-hi, farem això. Podríem aconseguir un més voluntari, que penso? Vols ser voluntari? No? Anem cap amunt. Anem cap amunt. Tot bé. Així que el seu nom és què? LAUREN: Lauren. DAVID J. Malan: Lauren. Anem amunt, Lauren. Així que Lauren està sent desafiat aquí com segueix. Encantat de conéixer-te. Així Lauren aquí té davant de les seves dues tasses buides. I tenim alguns de taronja suc i llet i anirem endavant i fer el següent. Només anem a omplir aquest. Unes unces de llet per aquí i anem a omplir una mica de suc de taronja per aquí. I davant de tots aquests membres de l'audiència, intercanviar els dos valors d'aquestes tasses. Posar el suc de taronja en el got de llet i la llet a la tassa de suc de taronja. Com es fa això si estigués en casa i tenia accés a altres materials? LAUREN: Posa-ho en una altra tassa. DAVID J. Malan: OK. Així que anem a fer una temporal variables, si ho farem. I seguir endavant ara i posar en pràctica aquest mateix procediment d'intercanvi. Molt bo. Hem posat DO al temporal variables, la llet en la variable DO, i ara la variable temporal en la variable llet. D'ACORD. Així que molt ben fet fins ara. Així que resulta fora-- sostenir que pensat per un moment. Aquí, només friki que una mica, aquest seria el codi C corresponent que simplement implementem. Teníem dues entrades, A i B, tots dos que només haurem de dir amb senzillesa són int de. I notar aquí, si vull canviar els valors de dues variables, a i b, que en veritat necessitem un intermediari, un variable temporal, una tassa temporal, en el qual l'abocament un dels valors per la qual cosa tenim un marcador de posició per a ell. Però llavors el codi és exactament com Lauren aquí implementat. Ara, només per obtenir una poc més boig, resulta que vostè pot fer això sense una variable temporal. Per fer això correctament, però, anem a haver de fer trampa amb una mica de química. Tenim algunes copes de més aquí. Així que la cosa més propera que es veu com la llet i l'aigua perhaps-- o llet i OJ-- és que tenim alguna aigua, de manera que anem a omplir aquest un amb unes quantes unces d'aigua clara. Això és probablement massa. Sí. Això és definitivament massa. Mantingui en un segon. I ara tenim petroli, que, segons record de la classe de química de l'escola secundària, espero que no es barreja amb aigua. Però quin tipus de classe de s'assembla a la llet i suc de taronja. Així que ara, sense utilitzar una variable temporal, pots intercanviar aquests dos valors? Així olis entra a la tassa d'aigua, l'aigua entra a la tassa d'oli. LAUREN: No hi ha altres copes? DAVID J. Malan: No hi ha altres copes. I jo no he fet provat això abans d'aquest any així que no sé si això va a realment treballar químicament. Això no havia de passar. Està funcionant? Tot bé. Així que separar? Bé. Ara arribem a obtenir la aigua a l'altra copa. Concentradors de química més intel·ligents possible probablement fer això millor que jo. LAUREN: L'aigua està a la part inferior. DAVID J. Malan: El aigua- que era el que és clau l'última vegada que vam fer això. Has de fer-ho en l'ordre correcte. Sí. Està bé. Així que ara tenim dues tasses d'oli. D'ACORD. Està bé. Però químicament si això va funcionar de jo-- LAUREN: Aquesta és l'aigua. DAVID J. Malan: Això és tot aigua. Tot bé. Però això segueix sent la mateixa copa que abans. Així aboqui it-- intentar allà. D'ACORD. Aquest és un bon ús del temps de classe avui. D'ACORD. Així que ara nosaltres-- agradable. Una mena de. Tot bé. Així que és molt bo. Gràcies a Lauren. Molt ben fet. Així que per fer esclatar les seves ments, i això és potser una mica jugar amb si t'agrada en I + D CS50, pot, de fet, intercanviar dues variables sense utilitzar un nombre enter temporal. I aquest és el codi C corresponent. I si et recordes de l'última Dimecres, hem introduït, encara que breument, alguns dels nous operadors en C. I ho fa Algú recorda el que la petita pastanaga símbol és, aquest petit triangular símbol des del teclat representa? Què operador de bits? AUDIÈNCIA: EXOR. DAVID J. Malan: EXOR. Exclusiva O. Així que si vols, només per diversió en casa, per donar a i b de dos arbitrària valors com qualsevol eight-- i jo triaria un valor de vuit bits. Si vostè fa això amb 32 bits, obtindrà molt ràpidament avorrit. Però acaba de donar una de vuit bits valor que és el que sigui, un o dos, i donar-li b un valor similar. I a continuació, utilitzant la definició de XOR des de dimecres passat, sol·licitar que a poc a poc, cadascun aquests vuit bits en cada un a i b, i després fer exactament per aquest codi. I no és el correcte que es veu aquí a la pantalla. En efecte, es redueix a tres operacions XOR i d'alguna manera màgicament a i b intercanviaran posicions sense perdre cap informació. Així que el truc oli i l'aigua és el més proper encarnació món real Es va acudir per imitar això. Però és segurament més fàcil utilitzar una variable temporal, com en aquest cas. I això també es diu una oportunitat, també, aquest tipus de micro optimització, com un científic de la computació diria, mentre que tipus de diversió presumir de com es va fer això sense com l'intercanvi amb una variable addicional, que no és tan convincent. A causa de estalviar 32 bits, com en el cas d'un int real, No és tot el que convincent en un sistema on vostè podria estar utilitzant desenes de megabytes o encara més com memòria aquests dies. I de fet, quan arribem a un conjunt de problemes més endavant i s'implementa encanteri corrector i vostè el repte de fer-ho amb això com a mínim RAM i tan poc temps possible en el que computer-- encara tenir una setmana per implementar it-- podràs tener-- podràs el repte de minimitzar aquests recursos. I això és realment l'única ocasionar aquest semestre on se l'anima a afaitar- fora fins i tot el millor rendiment costa el contrari. Així que-- com podem veure això en codi real? Déjame anar per davant ara i obrir un exemple que deliberadament es diu No swap, perquè no ho fa De fet canviar les variables com en realitat es podria esperar. Així que anem a fer una ullada. Heus aquí un programa que no té CS50 biblioteca passant, simplement estàndard d'E / S. Ara tenim un prototip per sobre de la tapa d'intercanvi que acaba de significa que ha de ser definit més endavant. I aquí és principal. Em van assignar arbitràriament x i y, respectivament, els valors d'un i dos només perquè són petites i fàcil de pensar. I llavors només tinc un munt de printfs on tinc una comprovació de validesa. x és 1 ei és 2 és presumiblement el que aquests printfs diran. Així que no hi ha màgia fins al moment. Llavors em vaig a reclamar amb imprimir def, intercanviant dot dot dot. Vaig a trucar a la permuta funció, passant en x i y. I suposem per ara que intercanvi es du a terme exactament com ho era fa un moment amb una variable temporal. I pel que pretenc amb valentia, vaig canviar. x és ara això e i és ara que. Però l'arxiu, és clar, es diu n swap. Així que anem a veure realment el que succeeix. Si Va compilar sense swap i després fer ./noswap, x és 1, i és 2. Intercanvi de cases intercanviat. x és 1, i és 2. Així que en realitat sembla estar viciat fins i tot encara que swap-- anem a desplaçar-se cap avall ara-- s'implementa exactament per la codi que va proposar fa un moment. Així que no anem a aconseguir la suposició amb les coses XOR per ara. Això també hauria de funcionar igual que amb la llet i suc de taronja, però no sembla estar funcionant. Així que anem a fer això una altra vegada. Potser jo no estava corrent bé. Així que anem a córrer No Intercanviar nou. Potser jo-- no. Així que és simplement no funciona. Així que farem una mica de comprovació de validesa. Déjame anar per davant aquí a Intercanviar i acaba d'afegir, espera un minut, a és% i / n i anem plug-in el valor d'una. Perquè realment vull per veure el que està passant. I, en efecte, es tracta de una tècnica de depuració que vostè podria estar utilitzant en hores d'oficina oa casa ja, similar a la primera meitat de Dan Vídeo de Armendáriz en PSET3 on vam introduir print def com una tècnica recomanada, almenys per als casos simples. Déjame anar endavant i corro fer sense intercanvi de nou, ./noswap. Interessant. Així compte del que sembla ser cert. x és 1, i és 2, però a és 2 quan b és 1. Així que aquests dos d'alguna manera es van canviar però x i y no estan sent intercanviats. Així que per ser clars, el que està passant és, aquí tinc xii i aquestes són les variables locals en el abast de principal, estic passant x i y intercanviar. Ara, swap, com una funció separada, és lliure de cridar als seus arguments o la seva paràmetres del que vulgui. Foo o bar o XOY o aob. Només per deixar clar que ells són no idèntica a x i y per se, Ho he dit a i b. Però podríem anomenar el que vulguem. I pel que sembla s'està passant d'intercanvi x-- conegut com A-- i és es passa I- conegut com b. D'alguna manera, aquestes tres línies són el bescanvi d'aquests valors exactament com Lauren va fer amb la llet i suc de taronja. Però quan imprimim els valors, a i b són de fet canviar però xi I tenen cap canvi a ells. Recordem que x i y són aquí. Així que podem veure això a través de Una altra tècnica també. I això també és una tècnica incrustat en un problema establert tres. Seguirem endavant i fer això en CS50 Identificació si vostè no té ja. En el costat dret que tenir aquesta pestanya depurador. I si obre això, hi ha una mica d'informació arcana això és llançat en vostè al principi. Però anem a burlen d'això a part molt ràpid. Així que un, veure les variables locals. Resulta que construir a IDE CS50, i una gran quantitat d'entorns de programació més en general, és un depurador. Una eina que et permet veure visualment el que està passant dins del seu programa sense haver de recórrer a l'addició printfs i compilar i executar i l'addició de printf i compilar i córrer, que ja, en horari d'oficina oa la llar, és probable que fent bastant tediós. Així que aquí, en un moment, estem va a veure en temps real els valors de les nostres variables locals. També serem capaços d'establir els anomenats punts de ruptura que oportunitats en el meu programa per fer una pausa execució en una línia específica de codi que tinc curiositat per saber. Oi? Aquests programes s'executen en una fracció de segon. És una mica agradable per a nosaltres els éssers humans més lentes per ser capaç de fer una pausa, prendre un moment, consulteu el que està succeint al seu voltant una certa línia de codi sense l'arada programa a través d'ell i acabat del tot. Així que als punts de ruptura ens va a permetre trencar i fer una pausa en un punt determinat. Pila de trucades és una forma elegant de dient quines funcions són actualment sent cridat en el moment. Principal es diu sempre primer. Però si Principal diu funció anomenada swap, estem en realitat va a veure això Torre de les funcions que han estat crida en ordre cronològic invers. Així que anem a veure això. Me'n vaig a allunyar. Vaig a tornar al meu codi. I només perquè vull ser pedant aquí, Vaig a seguir endavant i feu clic just a l'esquerra de la línia cinc. I això crea un punt vermell. I noti en el costat dret que el depurador sap, bé, Que acabo de dir un punt d'interrupció en línia noswap.c 5, específicament en aquesta línia de codi. Així que el depurador sap que jo han sol·licitat que la propera vegada Tinc el meu programa es pausa execució no en lloc de només corrent tot super ràpid. Així que ara vaig a fer clic al Depurar botó a la part superior de l'IDE i això va a fer el següent. Es va a obrir un principi una mica por segon terminal mirant window-- depuració remota des acollir tal tal-- i anem a tornar al que tot el que significa en poc temps. Però el que és important, per ara és que aquest punt vermell va ser copejat, el depurador té deliberadament pausa execution-- no en aquesta línia en si, sinó en la primera línia de codi real en aquesta funció. I per això la línia 7 és ara ressaltat en groc. I ara anem a fer una ullada en el costat dret. Sembla que, per defecte, prou bé, x té el que de valor? 0. E i té el que de valor? Zero. I això és d'esperar en el sentit que x i I- que line-- groga té encara no executat. Així que x no han de tenir el valor 1. Podria tenir qualsevol altre valor, un valor anomenat d'escombraries. I tenim la sort que és zero en aquest punt, essencialment. Així que ara només hi ha uns pocs botons hem de cuidar sobre l'depurar d'aquesta manera. Cal notar aquí, tenim un botó Reproduir. I si juguem o colpejar reprendre, això és només va executar a través de la resta del programa o fins que xoca amb un altre punt d'interrupció. Però jo no he posat cap altre punts de ruptura pel que és just va a córrer fins al final. Aquest tipus de derrotes les propòsit de furgar. Així que en comptes, m'importa aquestes icones a la dreta. I si hi ha sobre ells, com es deu també, veuràs petits consells eina tips--. Aquest és un pas més. Ara això no vol dir salt la següent línia de codi. Això només vol dir executar-lo i passar a la següent, passar a la següent, passar a la següent. En altres paraules, a través de aquest botó, puc caminar a través del meu codi d'un pas a la vegada. Línia per línia, literalment. Ara, a la dreta de això, hi ha un altre que veurem en un moment. Aquesta és l'anomenada Step Into icona que és em permetrà busseig en una altra funció. Però anem a veure això en un moment. Així que vaig a fer clic passar per sobre. I ara noti, com faig clic aquest botó a la part superior dreta, mantenir els ulls més o menys sota Local Variables i veure què passa amb x. x és ara 1 perquè el línia groga s'ha executat i ens hem traslladat a la línia 8. I en un moment i esperem que hauria de convertir-2. Ara, res tan interessant que passa per una mica. Tot això és és printf. I compte, al meu terminal secundària finestra, veig la sortida de definició d'impressió. I ara he de fer una decisió del programador. Puc passar per sobre d'aquesta línia de codi, executar-lo, però no aconseguir curiós sobre el que hi ha dins. O puc pas realment en ell i anar dins d'Intercanvi de si mateix. Així que anem a fer el segon. Déjame anar endavant i feu clic a No Step Over però Step Into. Avís, de sobte, els canvis en les finestres per ressaltar la primera línia de codi a Canvia. Aquesta és la línia 21. I ara, quina classe de covard és que, si es mira per aquí, com s'esperava, una coma b és 1 i 2, respectivament. Per què és temp 32767? Recordant que la temperatura, de la mateixa manera que la tassa buida fa un moment, es declara aquí a la línia 21. Per què 32.000 Vull dir, per què és només algun valor estrany? Sí? AUDIÈNCIA: No és inicialitzat. DAVID J. Malan: És No s'ha inicialitzat. Així que el nostre equip sempre té memòria física. Fins i tot de RAM física. I sempre de zero i un està aquí, oi? A causa de que estem fent servir la nostra ordinador tot el dia, utilitzeu el CS50 IDE o els servidors de tot el dia. Així que la memòria RAM o bé té alguns zeros o algú d'o alguns zeros i uns. No importa si és o no els estiguis utilitzant. No es pot tenir en blanc espais en què volen bits. Són ja sigui zeros i uns. Així resulta que la temperatura, ja que no hem inicialitzat encara, tenim aquests 32 bits, però no he ha inicialitzat als valors coneguts. Així que el que fossin més recentment utilitzat para-- els 32 bits-- només estem veient els artefactes d'alguns ús previ d'aquells particulars 32 trossets. Tan aviat com faci clic a Pas a pas per això, uf, temperatura es posarà el valor 1. I si ho faig de nou, a és serà donat el valor 2 i després b va a ser donat el valor 1. I així, el que és bo ara en aquest punt de la història és que el depurador és mostrant-me, super lenta al meu propi ritme, el que l'estat de Swap és. Però fixa't en la part superior aquí, previ avís que la pila de trucades en realitat té dues capes a la mateixa. Ara el que ha destacat com a Swap, si faig clic a Principal lloc, observi com canvien les variables locals pel fet que el desenvolupador pot simplement hop volta i entrar en qualsevol àmbit diferent. Així que tot i que estem fent tot això treballar i intercanviar correctament a i b, si vaig a anar i venir entre Permuta on a és 2 i b és 1 i Main, ha Principal vist afectada en absolut? No. Quina és el menjar per emportar en aquesta llista? Bé, resulta que qualsevol moment es diu a una funció com swap, i se li passa arguments, el que estàs passant a la funció swap en aquest cas és una còpia d'aquests arguments. Així que si x i i són cada un, respectivament 32 bits, el swap és aconseguir és dos nous locals variables o arguments, anomenat i B-- però aquells són arbitràries noms-- però el patró de zeros i estimats a l'interior de A i B són fila per ser idèntica a x i y però no són la el mateix que x i y. És com si té Principal en el seu tros de paper el número 1 i 2 per x i y, i després quan mans que tros de paper per a intercanvi, Intercanviar posa molt ràpidament seva pròpia ploma, escriu 1 i 2 en el seu propi full de paper, mans enrere xi original Principal i després fa la seva pròpia cosa amb a i b. I ara això és super important perquè això té implicacions no trivials per realment escriure codi correcte perquè semblaria que no podem canviar dues variables. He escrit una funció Intercanviar correcta. Hem implementat amb Lauren com una funció d'intercanvi correcte en la realitat, però aparentment res d'això assumptes si no pot en realitat intercanviar dos valors de forma permanent. Així que tenim una altra manera per aconseguir realment en això, i hem de ser capaços de realment resoldre aquest problema. I resulta fora-- i ens vindrà tornar a aquesta imatge en particular abans long-- aquesta és una manera de que pot dibuixar la memòria de l'equip. És només un rectangle. Vostè podria dibuixar qualsevol nombre de maneres, però és convenient per a dibuixar com un rectangle per la següent raó. Anem a començar avui i més enllà parlant de l'anomenada pila. I la pila és només un tros d'RAM-- un tros de memory-- funcions que tenen accés quan se'ls crida. I així resulta que en la part inferior d'aquesta pila és on totes les variables locals de principals i org C i org V i totes aquestes coses es va a anar per defecte. I si Principal demana alguna altra funció com swap, així, Empassa va a aconseguir una altra capa de la memòria per sobre d'ella. I pel que acaba de donar-li una succinta ràpida foto d'això, si jo vaig aquí-- i vaig deixar la meva Mirall això en el les despeses generals com bé-- el que realment tinc, si ens preocupem només de la part inferior d'aquesta imatge, per ara, és que quan va executar un programa de i Main es diu, Principal se li dóna un tros de RAM en el meu equip que és a la part inferior d'aquesta anomenada pila. I jo vaig a dibuixar- deliberadament com un quadrat. Així que és com 32 bits o quatre bytes. I si aquesta funció principal té una variable anomenada x amb un valor d'1 i té una variable anomenada i amb el valor de 2, que és com prendre aquesta estella de memòria que Principal ha estat proposada per l'operatiu sistema i dividint de manera que la primera variable local va aquí, el segon va aquí, i això és tot. Quan principal diu swap, Intercanviar obté el seu propi tros de la memòria que anem a dibuixar com aquest des del sistema operatiu, i que va a tenir la seva variables locals propis basats en la nostra aplicació anterior amb variables locals un i b que al principi obtenir els valors 1 i 2. Però llavors, tan aviat com sigui el codi de Swap executa, i Lauren realitat intercanvia el DO i la llet, el que està passant? Doncs bé, aquest 2 està convertint en un 1, aquest 1 està convertint en un 2, i, per cert, hi ha una variable temporal que està sent usat tot aquest temps que amb el temps desapareix. Però no importa la quantitat de treball que vostè fa en aquesta línia de-- en aquest espai de memòria, x i y són completament intacta. Així que necessitem alguna manera de donar Intercanviar i funciona com si accés secret, si es vol, a funcions com-- a la memòria com x i y. Així que donem una ullada a un exemple que ajuda a veure exactament el que ha estat passant tot aquest temps. Vaig a seguir endavant i obrir Comparar Zero. I jo vaig a tancar la nostra depurador, vaig per tancar aquest missatge a la recerca de por els justos diu, espera un minut, estàs en la depuració mitjana. Vaig a ocultar aquesta pestanya aquí només per tornar a la simplicitat. Així que no et preocupis si GDB és assassinat. Això només significa que el programa té estat deixar de fumar, deliberadament, en aquest cas, per mi. I ara Comparar Zero fa això. Estic usant el CS50 biblioteca d'E / S estàndard. Tinc una funció principal que primer diu, diuen alguna cosa, i obté una cadena. Després diu una i altra aconsegueix una altra cadena. I notar que aquestes dues cadenes es diuen s i t, respectivament. I ara aquest programa, Comparar Zero, el seu propòsit a la vida, se suposa que em diuen, ho escric el mateix? I així em vaig a tornar a la setmana un. Estic fent servir el meu operador d'igualtat iguals que és l'operador de la qualitat. No és l'operador d'assignació, l'operador d'igualtat. Només estic comparant s i t. Així que anem a realment seguir endavant i fer això. I vaig a seguir endavant i fer comparació Zero. Jo faré ./comparezero. I jo vaig a anar endavant i dir alguna cosa com, farem mare en minúscules i què hi ha de la mare en majúscules. I per descomptat que escric coses diferents. Tot bé. Això és d'esperar. Anem a córrer de nou. Les dues vegades ho fan en minúscula, minúscula. Això es veu súper idèntica a mi. Retorn. D'ACORD. Potser és només estrany perquè no està agradant la meva gramàtica. Així que anem a fer un MOM de capital, capital de MOM, idèntics. Diferents coses. Llavors per què és això? Bé, el que realment està passant de sota el capó aquí? Així que anem a tornar més aquí per un moment i considerar el GetString és en realitat fent. Quan es diu a GetString, que és una funció que ens va escriure i que arriba d'alguna manera una seqüència de caràcters de l'usuari. I anem a suposar que la primera vegada que dic GetString, això em dóna un tros de memòria que són aquestes. I si he escrit en minúscules m-o-M-- i el que va després d'ell? Només una comprovació de validesa ràpid. Zero barra invertida. Sabem això. I recordem que vam jugar tot amb el nom de Zamila i un munt d'altres noms quan Rob era aquí buscant al que està passant dins de la memòria. Així que la història és exactament la mateixa. Això és el que GetString està tornant a mi. Ara, el meu codi fa un moment emmagatzema el valor de retorn de GetString en una variable anomenada s. I llavors la segona vegada que em deia, s'emmagatzema en una variable anomenada t. Així que si me'n vaig d'aquí, necessito per dibuixar aquest variable-- locals i estic en general va a dibuixar una cadena com sol-- anem anomenar S-- com una petita plaça aquí. I ara, com somehow-- mare anar dins d'aquesta variable s? Bé, hem de tornar als primers principis aquí. Què està GetString realitat tornava? Així resulta que M-O-M barra invertida zero, i qualsevol nombre d'altres cadenes en memòria com Zamila i Rob o Andy o qualssevol altres, són, per descomptat, en el nostre RAM o memòria d'ordinador. I la memòria RAM té com-- tens una giga de RAM, dos gigues de RAM, o mil milions o Dos mil milions de bytes, o potser encara més en aquests dies. Així que anem a suposar, per als propòsits de l'actualitat, que no importa com numerem ells, però podem numerar cada de dels mil milions o Dos mil milions de o 4000000000 de bytes. I diguem que arbitràriament que aquesta és la primera picada, mossegada segons, tercer, quart. Deliberadament no estic fent servir zero per avui, però anem a tornar a això. Així, en altres paraules, si aquest és el primera vegada que estic fent servir el programa, Només estic tenint sort i la primera mossegada és en la ubicació a una i després dos després tres de quatre. I si seguia dibuix, número de la caixa Dos mil milions seria fins aquí. Llavors, què pensa vostè, llavors, GetString realitat torna? No està tornant H-O-H barra invertida zero per se, ja que clarament no caben a la caixa que he dibuixat. Llavors, ¿què més podria GetString realitat Tornarem totes aquestes setmanes? La resposta està en el tauler d'aquí a algun lloc. No pot cabre H-O-H barra invertida zero, així que el que podria tenir sentit en el seu lloc? Si hagués de ser super intel·ligent, posant en el denominat barret d'enginyeria, ¿Què podries tornar? Quina és la menor quantitat d'informació vostè podria tornar que faria encara li permeten trobar M-O-M a la memòria? Sí? AUDIÈNCIA: Un. DAVID J. Malan: One. I per què un? AUDIÈNCIA: Perquè seria dir-li a on vagis [inaudible]. DAVID J. Malan: Exactament. Jo només vaig a tornar la direcció de la cadena que he aconseguit. La direcció d'aquesta cas és ubicació a un. Així que el que realment està sent emmagatzemada en S-- i cada variable de cadena tant far-- simplement ha estat el direcció d'aquesta cadena. Mentrestant, si dic GetString una segona vegada i jo escriure, literalment, la mateixa cosa-- M-O-M amb lowercase-- M-O-M i una altra barra invertida zero, i ara potser el meu programa de estat funcionant durant algun temps així que potser això és 10, això és la ubicació 11, és a dir 12, això és 13. Els equips que utilitzen algun altre memòria per qualsevol raó. ¿I ara què passa en el meu segon variable en el meu programa de t? 10. Exactament. I així, quan ens fixem en la codi font d'aquest programa on jo simplement estic tractant per comparar els dos valors, és S igual igual at, quin és la resposta humana obvi? Així que no, perquè 1 no és igual a 10. I així, en aquest document es troba un oportunitat per a nosaltres de veritat que només ha d'anar de nou a, de nou, primer principis i pensar, bé, el que està passant sota de la campana? Hem estat parlant sobre bits i bytes i la memòria, però en realitat és útil per entendre perquè quan vostè diu GetString, tot i que pensem que és tornar H-O-H o cadena mare o Andy o Zamila o similars, tècnicament és només tornar la direcció d'aquesta part de la memòria. Però això està bé. Perquè ¿com sé on acaba la cadena? Si tan sols em donen el principi? Bé, la barra invertida zero, no? Just a temps lineal que pugui imprimir amb definició d'impressió M-O-M. I tan aviat com veig barra invertida zero, no m'importa on vaig començar, Ja sé implícitament on haig d'acabar. I pel que avui es compleix el beginning-- i m'ho dius a mi fer això de forma espectacular perquè ens passar per un munt de problemes per aconseguir aquests aquí entrenant wheels-- pel que avui les rodes d'entrenament comencen a desprendre i ens revelen almenys: [Aplaudiments] Això va ser ben val la pena el viatge a Target aquest matí, no? Així ara-- existeix, resulta terme, no hi ha tal cosa com una cadena. Cadena no existeix. És un sinònim que hem tingut a l'interior de la biblioteca CS50. D'ara en endavant, anem a començar a cridar s i t no seqüències però estrelles Char. I l'estrella carbó anem esmicolar poc temps. Però això és a dir, que fins i tot si continuem utilitzant GetString per ara, tècnicament que hauria estar dient estrelles carbó i l'estrella de carbó. I resulta que el que l'estrella significarà alguna cosa anomenat un punter o una adreça. I, de fet, un teaser per al que s'acosta és aquest 20 segon clip de la nostra amic Nick Parlant a Stanford que, fa força temps, passar una quantitat ridícula de temps, el millor que puc dir en el seu cuina o al soterrani de casa seva, fer animació amb plastilina introducció al món un personatge anomenat Binky amb els quals va a s'introduirà la propera vegada per als punters. Així que aquí és un avançament del que està per venir. [REPRODUCCIÓ DE VÍDEO] -Escolta, Binky. Desperta. És temps per a la diversió punter. -Què és això? Assabenti dels punters? Oh, llaminadura. [FI DE REPRODUCCIÓ] DAVID J. Malan: I en aquesta nota, ens veiem dimecres. Tot bé. Qui és el ball? Vine. Qui és el ball? Vols que posar-lo en marxa? Vaig a posar-lo en marxa. Woooo! LAUREN: luxe dolça Moisès.