David J. MALAN: Aceasta este CS50 și acesta este începutul săptămânii patru. Și, băiat, este Volkswagen în probleme toate din cauza software-ului. Să aruncăm o privire. [VIDEO PLAYBACK] -Cars, Cele mai inteligente personajelor în filme rapid si furios. În această săptămână de automobile german Volkswagen sa aflat în mijlocul unui scandal de proporții potențial penale. -Volkswagen Se pregătește de miliarde în amenzi, acuzații penale posibile pentru directori sale, ca compania își cere scuze pentru fraudarea 11 milioane de mașini la ajuta-l bată teste de emisii. Modelele diesel au fost -Certain proiectat cu software-ul sofisticat că informațiile folosite, inclusiv poziție a direcției și vehiculul pentru a determina viteza masina a fost in curs de testare a emisiilor. Sub această împrejurare, motorul ar reduce emisiile toxice. Dar masina a fost aranjat la by-pass că, atunci când a fost condus. Emisiile au crescut 10 până la 40 ori peste nivelurile acceptabile APE. [END PLAYBACK] David J. MALAN: Deci, haideți să aruncăm o privire la acest și a vedea exact cum aceasta ar putea fi puse în aplicare și modul în care acest lucru ar putea afecta atât de multe mașini de acest gen. Deci, în mâna mea aici sunt presa versiune, care a fost emis de EPA-- de Mediu Agenția pentru Protecția care este agenția de reglementare din SUA, care mânere preocupările legate de mediu, și apoi reală Aviz juridic care a fost trimite la Volkswagen la doar câteva zile în urmă. Deci APE scrie, și dezvăluie acum public, un software sofisticat Algoritmul pe anumite Volkswagen detectează atunci cand masina este in curs Testarea emisiilor oficiale și apoi a emisiilor complete controalele privind doar în timpul testului. Eficacitatea acestea poluare vehicule dispozitive de control a emisiilor este foarte redusă pe tot parcursul normale de conducere situații. Acest lucru duce la mașini care îndeplinesc standarde în laborator sau testării stație, dar în timpul funcționării normale emit oxides-- azot sau NOx-- până la 40 de ori Standard. Software-ul produs de Volkswagen este un dispozitiv citat încheiat citatul, înfrângere, astfel cum sunt definite de către Clean Air Act în SUA. Ei merg pe să spun că EPA și o altă agenție de descoperit dispozitivul înfrângere software-ul după o analiză independentă de cercetatorii de la West Universitatea Virginia. Poluarea NOx contribuie la dioxid de azot, ozon la nivelul solului, și particule fine. Expunerea la aceste poluanți a fost legat cu o gamă largă de efecte grave de sanatate, inclusiv astm a crescut atacuri și alte respiratorii boli care pot fi suficient de grave pentru a trimite oameni la spital. Expunerea la ozon și pulberi în suspensie are, de asemenea fost asociată cu prematura moarte din cauza respiratorii legate de sau cardiovasculare legate efecte. Copiii, persoanele în vârstă, persoane cu boli respiratorii preexistente sunt deosebit de expuse riscului de efectele asupra sănătății ale acestor poluanți. Este suficient este de a spune, este destul de grave. Și hai să mergem pe pentru a citi doar una mai mult fragment și apoi vom arunca o privire la implicațiile care stau la baza de acest lucru în cadrul unei mașini. Mai exact, Volkswagen fabricat și instalat software în așa-numitul control electronic module-- sau ECM-- de aceste vehicule care sesizate când vehiculul a fost testat pentru conformitatea cu standardele de emisie EPA. Bazat pe diferite intrări, inclusiv Poziția volanului, vehicul viteza, durata motorului anilor exploatarea, precum și presiunea barometrică, aceste intrări exact senile parametrii a procedurii de testare federal folosi testele de emisii pentru certificare EPA scopuri. În timpul încercărilor de emisii APE, software-ul de vehicule ECM a fugit de software care a produs Rezultatele de emisii conforme. În toate celelalte ori, software ECM vehicul a fugit un drum separat calibrare care a redus Eficacitatea sistem global de control al emisiilor, în mod specific catalitică selectivă reducerea NOx Lean trap-- care vom vedea despre într-un moment. Ca urmare, emisiile de NOx a crescut cu un factor de 10 până la 40 de ori peste nivelurile conforme APE în funcție de tipul de ciclu de acționare. Deci, ce înseamnă acest lucru într-adevăr, și codul sursă pentru funcționarea software pe anii Volkswagen nu are a fost încă făcute publice, este faptul că, în mod eficient, acest echivalent este undeva acolo în interiorul de cod Volkswagen. Dacă sunteți în curs de testare, iar în cazul în care mașina detecteaza anumiti factori de mediu ca volanul poziție sau mișcarea sau lipsa acesteia a masinii sau orice număr de alți factori care sunt în prezent ipoteza să facă parte din această formulă, se transformă pur și simplu pe controla emisiile complete. Cu alte cuvinte, ele încep emit mai puțin de poluanți. Altele, în orice altă situație atunci când nu este detectat ca fiind în laborator, ei doar nu. Și astfel încât să puteți simplifica acest lucru în mai multe pseudocod beton cu ceva asa. Dacă roțile sunt de cotitură, dar volan nu este, sugestiv că mașina este pe unele un fel de cilindru rotativ dar într-un fel de depozit testat, apoi se comportă ca EPA să-ar dori. În caz contrar, nu. Deci, haideți să aruncăm o privire la un scurt videoclip care ia o privire la ceea ce implicațiile sunt de acest fapt mecanic. [VIDEO PLAYBACK] -Ultima Vineri APE a anuntat ca unele Masini Volkswagen Audi a făcut între 2009 și în acest an au fost cu ajutorul un așa-numit dispozitiv de manipulare pentru a obține în jurul valorii de legi privind emisiile concepute pentru a menține aerul curat. Dar ce înseamnă asta exact? Ei bine, masinile moderne au zeci de calculatoare în interiorul ei. Iar unele dintre aceste calculatoare ajuta pentru a coordona funcțiile a motorului pentru optim performanțele, asigurându-vă că nu este prea mult gunoi iese din țeava de eșapament. Au fost într-adevăr de lucru acest fel de mai multe decenii acum. Practic, fiecare parte motorului unei mașini moderne are un senzor sau controler pe ea, și aceste calculatoare citesc în datele de mii de ori pe ajustări de luare a doua ca raportul dintre combustibil la aer ce se intampla in cilindrii. Acestea Volkswagen inseala și modele Audi sunt diesel, și diesel au o mai calculator cu adevarat important Parametrii controlate, care este cantitatea de combustibil nears merge în sistemul de evacuare. Acum, că sună rău. Nu suna ca tine ar vrea combustibil nears a intra în sistemul de evacuare. Dar în cazul unei diesel, ai ceva numit o capcană NOx care este un dispozitiv care absoarbe și capcane pentru oxizi de azot că sunt poluanți care ar în caz contrar du-te în atmosferă. Și efectul pe care capcana NOx este îmbunătățită cu combustibil nears. Deci, un dispozitiv de manipulare este un program special în interiorul acestor computere care pot face arata ca masina corespunde emisiilor Standardele chiar și atunci când nu. Volkswagen a avut o problemă pe mâinile sale. Motoarele diesel s-au cunoscut pentru a obține economia de combustibil mare, dar capcana NOx funcționează numai bine atunci când este utilizat mai mult combustibil. Deci mașina va detecta, folosind acest dispozitiv de manipulare, când a fost obtinerea o emisiilor testare, ar folosi mai mult combustibil, face munca capcana NOx bine, emisiile ar fi bine. Dar apoi te pe drum, dispozitivul se oprește, te arde mai putin combustibil dar ce te pune la fel de mult ca de 40 de ori mai multor poluanți în atmosferă. Dar cum naiba a făcut masina știu că a fost testat pentru conformitate a emisiilor? APE spune ca a fost un sofisticat sistem care verifică lucrurile ca direcție poziția roții, viteza, cât timp motorul a fost pornit, și chiar presiunea atmosferică. Cu alte cuvinte, nu a existat nici un fel acest lucru a fost accidental pentru că software-ul a fost proiectat foarte atent pentru a detecta un test de emisii oficial. Asta e ceva foarte serios înșelăciune și că este de ce Volkswagen este în astfel de probleme serioase. De fapt, CEO-ul lor, Martin Winterkorn, doar a demisionat. Deci, ce se întâmplă în continuare? Ei bine, daca esti unul din jumătate de milion de Jettas diesel, Beatles, volte, modele Passat, sau Audi A3s efectuate, Vestea buna este este ca masina ta este încă în siguranță de a conduce. Nu trebuie să-l pună deoparte până la Volkswagen emite o rechemare. Dar la un moment dat sunt probabil, va avea pentru a actualiza software-ul din interiorul mașinii. Când acest lucru se întâmplă s-ar putea obține mai puține mile pe rezervor. Avocații sunt deja pregatesc pentru procese clasa de acțiune astfel proprietarii s-ar putea obține compensate la un moment dat în viitor. Dar asta nu se va întâmpla în orice moment în curând. [END PLAYBACK] David J. MALAN: Deci acest lucru ridică de fapt o interesantă întrebare mai mare imagine ca să aibă încredere. Dreapta? Toate dintre noi au iPhone sau androizii sau ceva în buzunarele noastre, cel mai probabil Aceste zile, sau laptop-uri pe ture noastre, care sunt software care se execută făcut de Apple si Microsoft și ciorchini de alte companii. Dar cum știm că ceea ce aceste produse software fac este, de fapt ceea ce acestea companii spun că fac? De exemplu, cine e la spun că de fiecare dată când efectua un apel telefonic de pe iPhone sau telefon Android sau altele asemenea, că numărul de telefon nu este, de asemenea, fiind încărcat la server unele companiei din cauza unor programe ai scris, fie că este vorba de operare Sistemul în sine ca iOS sau Android, sau pentru că ați descărcat unele terță app parte că într-un fel este de a asculta pentru tot ceea ce tastați sau tot ceea ce spune de fapt. De unde știi că, atunci când voi se execută zăngănit sau de a face pentru a compila dvs. software proprie în CS50, cum Detii personal care CS50 lui, prin intermediul bibliotecii CS50, nu a fost de logare de fiecare șir ați ajuns vreodată sau fiecare inch ai ajuns vreodată? Ei bine, ai putea sa te uiti cu siguranță la codul sursă pentru ceva ca biblioteca CS50, tu ar putea uita-te la codul sursă pentru sistemul de operare Linux rulează pe IDE CS50. Dar o prezentare uimitoare a fost dat înapoi în 1984 în primirea Premiul Turing printr-o om de stiinta de calculator foarte celebru cunoscut as-- numit Ken Thompson, care a a primit Premiul Turing care este un fel de informatică lui Premiul Nobel, dacă vreți, pentru munca sa pe o sistem de operare numit Unix, care este foarte asemănătoare în spirit de ceea ce le folosim, care este Linux. Și întrebarea a cerut în lucrarea sa discursul de acceptare, în esență de stabilire a cadrului pentru ani și ani de discuții despre încredere și securitate, a fost aceasta. În ce măsură ar trebui să o încredere un declarație că o program-- o piesă de software-- este liber de cai troieni? Poate că este mai important să aibă încredere oamenii care au scris software-ul. Și, de fapt, ne-am legat să vorbesc ca el a dat atunci când acceptă acest premiu in anii '80 pe site-ul lui CS50 în pagina Prelegeri pentru ziua de azi. Pentru că ceea ce veți vedea este că el dă de fapt o destul de simplu exemplu de cum chiar un compilator ca zăngănit sau orice altceva compilatoare alții au folosit în trecut, Ce se întâmplă dacă încorporate în WE compilator noi folosesc este un pic dacă condiție care spune în esență, dacă observați că acest cod este folosind funcția getString sau getint funcție, mergeți mai departe și introduceți o ușă din spate sau un cal troian astfel încât acest program are acum niște zerouri și cei care fac ceva rău intenționat. Logare toate dvs. intrarile de la tastatura, încărcarea că datele la unele servere, sau nimic. Și ce Ken Thompson continuă să facă în discursul său este de a demonstra că, chiar dacă aveți acces la sursa Codul de un compilator care răutate s-ar putea face acest lucru, nu conteaza, deoarece există acest pui și ou realitatea celor mulți trecut ani în cadrul cărora compilatoare sunt folosite pentru a colectate chiar. Cu alte cuvinte, drumul înapoi atunci când cineva a trebuit să fi scris primul compilator. Și, ulterior, în orice moment le-am actualizat un compilator de a schimba codul sursă, adăugarea de caracteristici și recompilarea l pentru oameni ca noi să folosească, ei bine, ei folosind vechi versiune a compilatorului pentru a compila noul versiune a compilatorului. Și dacă aruncăm o privire la discuțiile pe care le-a dat, veți vedea că, din cauza din circularitate, puteți avea de fapt bug-uri sau Cai troieni încorporat în software-ul suntem folosind. Și chiar dacă te uiți la codul sursă pentru aceste programe, ar putea să nu fie chiar evident pentru că viclenia este de fapt în unele versiune mai veche a unui compilator care de atunci a fost injectarea amenințarea în software-ul nostru. Care este doar de a spune, ne-am într-adevăr nu se poate și nu trebuie să software-ul de încredere care rulează pe laptop-uri noastre sau telefoane sau orice număr de locuri. Și, de fapt, mai târziu în acest semestru, atunci când începem să vorbim despre programare web și de fapt, începe construirea aplicatii web noi, vom vorbi despre acestea amenințări și altele. Acum, s-ar putea s-au intrebat si am observat că a existat un mic mic Darth Vader în clipurile pe care Acostament arăta acolo despre Volkswagen. Dacă nu ați mai văzut, m-am crezut ar trebui să ne lumineze starea de spirit pentru că acest lucru este tot foarte deprimant și înfricoșătoare. Am de gând să se uite înapoi la Super Bowl 2011 atunci când un comercial de Volkswagen-- și acest aproape le face simpatic again-- difuzat pentru prima dată la televizor. Este al doilea clip 60 care cred că vă veți bucura de. [VIDEO PLAYBACK] [MUSIC - temă din "Star Wars"] [Caine latra] [Mașina începe] [END PLAYBACK] David J. MALAN: Da. Am fost doar de verificare. Mașina se află pe lista de încălcări. In regula. Deci, ne uităm la unele pseudocod un moment în urmă. Și aici e un mare fragment de cod pseudocod pe care le-am văzut de câteva ori până acum. Și să folosim aceasta este o oportunitate acum de a introduce o nouă programare tehnica pe care am făcut-o vezi algoritmic săptămâna trecută, când ne-am uitat la fel merge. Dar să-l oficializeze și a vedea cum am putea folosi în codul actual, și apoi vom folosi acest Tehnica pe drum mai susceptibile de a rezolva anumite alte probleme. Deci, aceasta a fost una dintre primele programe noi a scris vreodată, deși în codul pseudocod. Și ce acest program ne-a permis să facem curs a fost de a găsi Mike Smith într-o carte de telefon. Și observa in special linii opt și 11 care a avut această declarație Go To. Și, de fapt, anumite limbi, C printre ei, de fapt, nu au o declarație că este literalmente du-te la care vă permite să sări la o anumită linie. Este, în general, se încruntă la cauza Ea poate fi foarte ușor abuzate și puteți începe sărituri dvs. Programul peste tot, spre deosebire pentru utilizarea tipul de logică și fluxul de control pe care le-am folosit pana acum doar cu bucle și condițiile și altele asemenea. Dar putem simplifica acest algoritm în cod pseudocod, după cum urmează. In loc de aceasta iterativ sau abordare looping în cazul în care ne-am tot merge înapoi și înapoi și înapoi la linia de trei, de ce nu ne-am un fel de punt și mai spun, în general, în conformitate șapte și 10, doar doi le înlocuiesc pe cele perechi de linii cu, altceva în cazul în care Smith este anterioară în cartea ne vom caută Mike în jumătate din stânga a cărții. Altfel, dacă Smith este mai târziu, în carte, căutați Mike în dreapta jumătate din carte. Și observați deja circularitatea. Dreapta? Sunt interesat de Mike în cartea de telefon și apoi În cele din urmă l-am lovit, poate line șapte sau poate linia 10 și instruire mea pentru mine este de căutare pentru Mike în jumătate din cartea de telefon. Ei bine, cum am căuta Mike? Sunt în mijlocul căutarea Mike, de ce ai un fel de mine trimite într-un cerc? Dar asta e OK, deoarece ceea ce este întâmplă la dimensiunea problemei, cum este scris în linia 7 și 10? Noi nu spunem doar de căutare pentru Mike, caută Mike. Suntem ceea ce spun în mod special? Căutați-l în jumătatea stângă a jumătatea dreaptă care este efectiv jumătate din dimensiunea problemei. Deci e în regulă că suntem un fel de angajarea în această circularitate, acest argument circular, deoarece cel puțin suntem ceea ce face problema în ce mai mici. Și, eventual, vom ajunge la că așa-numitul caz de bază în cazul în care avem doar o singură pagină left-- ca voluntar nostru săptămâna trecută did-- am avut o singură pagină stânga și apoi noi nu Trebuie să continuați căutarea pentru Mike Smith pentru că e fie pe pagina sau el nu este. Deci, cum putem pune în aplicare această idee, această un fel de circularitate în codul actual? Ei bine, putem parghie o tehnică care este, în general, cunoscut sub numele de recursivitate. Și am văzut acest lucru în pseudocod pentru Merge fel săptămâna trecută. Amintiți-vă că aceasta a fost pseudocod pentru Merge fel. Este, fără îndoială, chiar mai simplu decât bule sau selecție sau sortare prin inserție doar în ceea ce privește simplitatea cu care puteți exprima. Dar asta e, deoarece suntem un fel de circular spunând căuta ceva căutând din nou. Dar suntem în căutarea fie pe jumătatea stângă sau jumătatea din dreapta și apoi în cele din urmă suntem fuzionează în acest caz. Dar aici, de asemenea, cu cele două linii de sortare, am avea din nou acest Ideea de recursivitate. Și concret ce înseamnă acest lucru, în contextul unui algoritm, este că un algoritm este recursiv dacă se folosește sau se numește. Sau în ceea ce privește C, o funcție este recursive-- o funcție numită foo este recursiv dacă foo, undeva în codul sursă, solicită funcția în sine foo. Și asta e de rău, dacă tot foo face vreodată este ea însăși apel nou și din nou. E în regulă, dacă în cele din urmă se oprește foo, la fel ca merge sort, spunând, așteptați un minut, Dacă această problemă este super mici, de exemplu, sau l-am găsit pe care eu sunt cauta, doar întoarce. Nu recursiv, nu ciclic mă numesc din nou. Și Să aruncăm o privire la cum acest lucru ar putea lucra efectiv. Deci, am de gând să merg mai departe și deschis a două exemple de cod sursă de aici. Una dintre care este numit sigma 0. Și acest lucru nu este deloc recursiv, dar haideți să aruncăm O privire la ceea ce face acest program. Am dezbrăcat tot comentarii de la ea, dar toate a codului sursă pe de CS50 site-ul are Comentariul Dacă doriți să citiți prin ea din nou mai târziu. Și să facem un cuplu de bun-simț verifica aici. Deci, la partea de sus a acestui cod, avem includ CS50.h. Ce face acest lucru? De ce este aici? În termeni de nespecialist rezonabil lui. Ce face? Da. Audiența: Așa că funcția getint funcționează. David J. MALAN: Așa că funcția getint funcționează. Din cauza acestei interior fișier, CS50.h, care vom vedea înainte de mult timp în punct de vedere al codului sursă, are o grămadă de funcții declared-- getint, getString, și o grămadă de others-- și cu excepția cazului în avem de fapt care includ linie, zăngăni compilator nu este O să știe că ea există. Și același lucru este valabil pentru linia doua unde int este definit printf, care este o funcție păstrăm folosind destul de un pic. Acum, linia patru pare un pic funky, pentru ca este doar o linie singur. Are un punct și virgulă, nu buclat bretele, nici un cod în interiorul acestuia. Dar ce a făcut noi numim acest lucru în săptămâna trecut? Da. Deci, un prototip. Și de ce nu avem un prototip care pare pentru a fi un pic redundant de obicei pentru că, de obicei, ne-am vezi din nou funcția mai târziu, în dosar, nu? Deci, de ce ne have-- esti doar lamureste dar voi lua. Da. Audiența: [inaudibil] Funcția după principal. David J. MALAN: Exact. Astfel încât compilatorul vă cunoaște va defini în cele din urmă să pună în aplicare sau această funcție după principal, probabil. Deci, zăngănit și mai compilatoare sunt un fel de prost și vor ști numai ceea ce le spui. Și, dacă doriți să utilizați o funcție numită Sigma, mai bine invata compilatorul că există în avans. Acum, se principală, chiar deși este o grămadă de linii, este destul de familiar, sperăm, de acum. Are o face în timp ce buclă al cărei scop în viață aici se pare că este de a obtine o număr întreg pozitiv din partea utilizatorului. Și chiar a păstra bat la cap să-l sau ei până când cooperează. Apoi, în linie 16 am un apel interesant. IntAnswer. Care, pe mâna stângă parte îmi dă un Int care poate store-- numit Answer-- care va stoca, aparent, valoarea de returnare a sigma. Deci, Sigma este doar un Numele arbitrar dar semnificativ care l-am dat la o funcție al cărei scop în viață este de a lua un argument-- vom numi N în acest case-- și doar pentru a lua suma care numărul plus orice număr pozitiv care este mai mică decât aceasta. Deci, dacă am trece în numărul 2 a sigma, vreau să adăugați 2 plus 1 plus 0-- nu 0-- astfel încât îmi dă 3. Dacă trec în 3 la sigma, vreau să au 3 plus 2 plus 1, care îmi dă 6. Si asa mai departe. Deci, doar adaugă Toate numere mai mici sau egale la acesta. Acum, aici Mă duc pentru a imprima răspunsul. Deci, ca o verificare rapidă bun-simț, să face sigma 0-- punct sigma slash 0-- și lasă-mă să tastați 2. Și într-adevăr mă 3. Lasă-mă să tastați în 3. Într-adevăr, mă 6. Și dacă cineva poate face matematica rapid, dacă fac 50 ce voi lua? Audiența: [neauzit]. David J. MALAN: Ei bine, nu. Dar 1275 care este destul de aproape. Deci acest lucru este rezultatul de a face 50 plus 49 plus 48, plus 47 plus 46 tot drumul până la 1. Deci asta e tot sigma face. Dar să vedem cum ne-am implementat acum. Deci, aici este funcția în sine. Și acest lucru nu pare să aibă nimic de a face cu recursivitate încă. De fapt, suntem cu ajutorul unui Tehnica de școală veche. Am initializarea o sumă variabilă numită la zero, atunci am o foreloop aici, și eu sunt de declarare a unei Int numit I, stabilind că egală cu 1-- deși am putea stabili o egală cu zero, dar din moment ce fac plus, Cui îi pasă dacă e zero sau unu. Se va avea nici un efect. Deci, eu sunt iterarea atâta timp cât I este mai mică sau egală cu m, care este argumentul care a fost adoptată în. Și apoi am păstra incrementarea I. și înțelegere din bucla tot ce fac este de a face sumă plus este egal cu I. Și asta în mod deliberat. Nu vreau să fac, în acest caz, cum ar fi suma, plus, plus. Vreau să adăugați de fapt valoarea curentă a I care din ce în ce mai mare și mai mare și mai mare de a concordanța funcționare. Și apoi mă voi întoarce suma. Și astfel răspuns devine suma valorii. Și apoi l-am imprima. Deci, există o oportunitate aici, deși, la fel de a simplifica acest cod conceptual și tipul de lovitură un e minte în ceea ce privește simplitate, chiar dacă nevoie de un timp pentru a sorta a aprecia ce acest este puternic în aceste exemple mici. Iată sigma Unu, astfel încât a doua versiune a acestui cod. Totul de sus este identic atât de aceeași poveste se aplică la fel ca înainte. Dar acum să ne uităm la punerea în aplicare a sigma care Am diminuate până la doar acestea lines-- patru linii de cod, într-adevăr, plus unele acolade și spațiu alb. Dar ce fac? Dacă m este mai mică sau egală cu la zero, trebuie să se ocupe de un fel de acest caz super-simplu. Și dacă-mi dai zero sau nimic negativă care este doar ciudat, Mă duc la arbitrar dar în mod constant a reveni la zero. Nu vreau acest lucru să intra in unele infinit ciudat buclă din cauza unei valori negative. Deci, Spun doar că, dacă-mi dai zero sau mai puțin, mă întorc la zero. Dar asta e bine, pentru că este că singură pagină a cărții de telefon ce a mai rămas. Am mușcat o problemă foarte specifică și nu de asteptare ceva recursiv. Dar, în linie 31, ceea ce nu mi se pare a fi faci? Parantezele sunt doar păstrarea lucruri, sperăm, un pic mai clar. Dar tot ce fac este că sunt revenind M-- indiferent tu mana mine-- plus Valoarea de M-- Ne pare rău, plus valoarea Sigma a m minus 1. Deci, ce înseamnă asta? Dacă-mi dai numărul 3 ca intrare, răspunsul Vreau să ajung în cele din urmă este de 6 deoarece 3 plus 2, plus 1 mi dă 6. Dar cum mă gândesc modul în care acest cod se execută? Prima dată când am sun sigma și trec în valoarea de 3, asta e cum ai spune pe o bucata de hârtie, aici e valoarea 3 și am fost trecut de acest lucru ca pe sigma. 3 este, evident, nu mai puțin de 0, astfel condiția dacă nu se aplică. Else face. Deci, ce să fac? Vreau să se întoarcă m, care este 3, plus sigma de m minus 1. Deci, să-mi urmări acest lucru. Am de gând să pun această bucată de hârtie în jos. Și ce valoare, pentru a fi clar, am de gând să treacă în sigma în acest moment în povestea? Ce număr? 2, nu? 3 minus 1 este 2. Așa că am nevoie de un pic de resturi de hârtie aici. Deci, acum sigma este obtinerea sunat din nou. Și am pus în mod deliberat acest jos pentru că este un fel de pauză această versiune a poveștii pentru că acum sunt concentrat pe semnalul de m minus 1. Deci m era 3, m minus 1 este 2. Deci, aici este de 2 că am fost trecut. 2 este, evident, nu mai puțin de 0 astfel acest caz nu se aplică. Altceva am reveni m, care este acest lucru, plus sigma de ce valoare? Deci, dacă sigma de 1-- deoarece m este acum 2 SO 2 minus 1 este 1. Deci, acum am doar valoarea 1. Eu trece doar numărul 1 la funcția sigma-- sau mă here-- așa 1 nu este, evident, mai mică decât zero, încă nu se aplică. Întoarcere altceva 1 plus sigma de ce? 0. Deci, permiteți-mi să amintesc doar că. Voi reveni la asta mai târziu. Acum am de gând să merg mai departe și iotă jos numărul 0 pentru că asta e argument sau parametru meu. Am trecut numărul 0 și, în final acest proces de doar repeta mine anunț nauseum nu încetează pentru că ceea ce fac imediat ce văd acest lucru 0? Mă întorc la zero. Deci, acum trebuie să înapoi povestea. Dacă acum mă duc înapoi în timp, ceea ce a fost cel mai recent lucru Am făcut dacă ai fi fost literalmente rebobinare un videoclip? Am de gând să ridic cele mai recente 1 și care îmi dă un plus 0 este 1. Dacă am păstra rebobinarea poveste, care va să-mi dea 2 plus această valoare de funcționare, care este de 1. Așa că e 3. Și apoi am de gând să păstreze rebobinare. Când am pus prima jos numărul 3-- astfel 3 plus 3 îmi dă 6. Și acum, dacă ați rebobinat video până în acest moment, acest lucru a fost foarte prima întrebare am întrebat. Când a trecut 3, ceea ce este sigma de 3? E într-adevăr 6, suma de toate aceste bucăți de hârtie. Deci, dacă faptul că nevoie de un pic de timp pentru înfășurați în jurul valorii de mintea ta, e în regulă. Dar consideră că a fost un little-- ea a fost foarte deliberat ca am stivuite aceste numere pe partea de sus a reciproc. E un fel de a avea un memory-- un record în timp, ca un scruber într-un videoclip, că pot derula într-adevăr, în. Și ne vom întoarce la că metafora în doar un pic. Dar mai întâi, se pare că nu există o mulțime de geeks si oameni amuzant, Cred că, la Google. Ar fi cineva care e foarte bun la minte Googling vine doar pentru un moment și ajută-mă căuta ceva? Foarte, cheie foarte scăzut. Cineva care nu e veni înainte, poate. BINE. Da? Haide. Haide jos. Care e numele tău? SAM: Sam. David J. MALAN: Sam, haide jos. Aceasta este același. Îmi pare bine să te cunosc. Hei. Vino pe aici. Deci, tot ce trebuie să faci, dacă ai putea, Sam, aici e Google. Poți căuta recursivitatea termen? Nu strica. Și acum let's-- da. OK Faceți clic pe asta. Mai bine faceți clic pe asta. Ah, înțeleg. Nu? BINE. Deci, hai sa facem un cuplu alții. Nu atât de mult legate de academic aici, dar trebuie cautat vreodata Google pentru anagramă? SAM: Nu. David J. MALAN: OK. Căutați anagrama loc de recursivitate. Cum despre strâmb. Ati cautat vreodata pentru strâmb? Acum, asta e un pic cam greu de vezi dar sperăm everything's-- OK. E doar tu și cu mine se bucură de acest lucru. BINE. Deci, în final, acest one's-- e un pic strâmb. Acum face o rola baril. Minunat. In regula. Mare vă mulțumesc pentru Sam. Poftim. Mulțumesc. Deci, ce se întâmplă în toate din aceste exemple stupide? Deci într-adevăr, sub capota de Milioane Google de linii de cod aparent este o prostie câteva IF condiții care sunt, în esență, a verifica dacă utilizatorul are scris în această frază, face ceva care, probabil, a avut o sumă trivial de timp să pună în aplicare doar la fie amuzant în acest fel. Dar asta e tot ce se reduce până la sub capota. Dar, desigur, recursivitate este mai de geekier exemplu printre aceste trucuri speciale. Și cu siguranță nu e alții acolo precum și că, probabil, nu au nici descoperit încă. Astfel încât să ia o privire, sau ia în considerare acum programul următor, și cu siguranță apuca orice dintre acestea pe calea ta afară. Am de gând să merg mai departe și deschide un program care este O să încerc să schimb două valori. Dar, înainte de mergem acolo, să facem acest lucru. Am putea obține o mai voluntar, cred? Doriți să voluntar? Nu? Haide sus. Haide sus. In regula. Deci, numele tău este ceea ce? LAUREN: Lauren. David J. MALAN: Lauren. Hai sus, Lauren. Deci, Lauren este în curs de contestat aici, după cum urmează. Îmi pare bine să te cunosc. Deci, Lauren are aici, în fața de cei doi cupe goale. Și avem niște portocale suc și lapte și vom merge înainte și de a face următoarele. Noi doar o să umple acest lucru. Câteva uncii de lapte aici și să umple un suc de portocale pic aici. Și în fața tuturor acești membri audiență, schimba cele două valori ale acestor cupe. Pune sucul de portocale în cana de lapte și laptele în cupa suc de portocale. Cum ați face acest lucru, dacă ai fost la acasă și au avut acces la alte bunuri? LAUREN: Pune-l într-o altă ceașcă. David J. MALAN: OK. Deci, haideți să aruncăm o temporar variabilă, dacă o vom face. Și merge mai departe acum și punerea în aplicare această procedură pompare aceeași. Asa de bine. Ne-am pus în JO temporar variabilă, laptele în JO variabila, iar acum variabila temporară în variabila lapte. BINE. Deci, foarte bine făcut până acum. Deci, se dovedește că out-- țineți gândit pentru o clipă. Aici, la doar un pic tocilar, acest ar fi codul C corespunzător că ne-am pus în aplicare. Am avut două intrări, A și B, ambele care vom spune doar pentru simplitate sunt lui Int. Și observați aici, dacă vreau să schimb valorile două variabile, a și b, într-adevăr avem nevoie de un intermediar, un variabilă temporară, o ceașcă temporar, în care turnarea una dintre valorile astfel încât să avem un înlocuitor pentru ea. Dar apoi codul este exact ca Lauren aici implementate. Acum, doar pentru a obține o puțin mai nebun, se dovedește pe care le puteți face acest lucru fără o variabilă temporară. Pentru a face acest lucru în mod corespunzător, deși, vom să aibă de a trișa cu unele chimie. Avem câteva cupe plus aici. Deci cel mai apropiat lucru care arată ca lapte și apă perhaps-- sau lapte și OJ-- este avem o apă, așa că vom umple asta până cu câteva uncii de apă limpede. Asta e, probabil, prea mult. Da. Asta e cu siguranță prea mult. Stai o secundă. Și acum avem petrol, care, după cum îmi amintesc din clasa de mijloc de chimie școală, sperăm că nu se amesteca cu apa. Dar un fel de fel de arata ca laptele și JO. Deci, acum, fără a utiliza o variabilă temporară, puteți schimba aceste două valori? Deci, uleiuri merge în ceașcă de apă, apa merge în ceașcă de ulei. LAUREN: Nici un alt cupe? David J. MALAN: Nici un alt cupe. Și nu am de fapt eu testat aceasta înainte de acest an așa că nu știu dacă acest lucru va fi de fapt locul de muncă chimic. Asta nu trebuia să se întâmple. Functioneaza? In regula. Deci separare? Bine. Acum am ajuns pentru a obține apă în cealaltă cupa. Concentratoare chimie inteligente ar putea probabil face acest lucru mai bine decât mine. LAUREN: Apa este pe partea de jos. David J. MALAN: a water-- care a fost ceea ce este esențial ultima dată când am făcut asta. Trebuie să o fac în ordinea corectă. Da. Asta e ok. Deci, acum avem două cești de ulei. BINE. Asta e ok. Dar chimic dacă aceasta a lucrat mult Eu-- LAUREN: Aceasta este apa. David J. MALAN: Asta-i cea mai mare parte de apă. In regula. Dar asta e încă același pahar ca înainte. Deci, se toarnă it-- încerca acolo. BINE. Aceasta este o buna utilizare a timpului de clasă astăzi. BINE. Deci, acum we-- frumos. Un fel de. In regula. Deci, foarte bun. Vă mulțumesc pentru Lauren. Foarte bine facut. Deci, doar pentru a sufla mintea voastră, și aceasta este, probabil, ceva să se joace cu, dacă doriți în CS50 ID, puteți, de fapt, schimba două variabile fără a utiliza un număr întreg temporară. Și aceasta este codul C corespunzător. Și dacă vă amintiți de la ultima Miercuri, am introdus, în cazul în care pe scurt, unor noi operatori în C și nu oricine amintesc ce mic morcov simbol este, că puțin triunghiular simbol de la tastatură reprezintă? Ce nivel de bit operatorul? Audiența: EXOR. David J. MALAN: EXOR. Exclusive sau. Deci, dacă doriți, doar pentru distracție la acasă, pentru a da un și b două arbitrară valori ca orice eight-- și eu ar alege o valoare de opt biți. Dacă veți face acest lucru cu 32 de biți, veți obține foarte repede plictisit. Dar da doar un pic de opt valoare care este orice, unul sau doi, și să dea b o valoare similară. Și apoi folosind definiția de XOR din miercurea trecută, aplică că puțin câte puțin, fiecare dintre aceste opt biți în fiecare dintre a și b, și apoi face exact pe acest cod. Și nu e incorect ceea ce vedeți aici pe ecran. Aceasta, într-adevăr se reduce la trei operațiuni de XOR și într-un fel magic o și b va schimba pozițiile fără a pierde nici o informație. Deci truc ulei și apă este Cel mai apropiat reală incarnare lumea Am putut gândi a imita acest lucru. Dar e sigur mai ușor să utiliza o variabilă temporară, ca în acest caz aici. Și acest lucru este prea spune o oportunitate, de asemenea, acest tip de optimizare micro, ca un om de stiinta de calculator ar spune, în timp ce un fel de distracție să se laude despre cum ai făcut asta fără ca schimbarea cu o variabilă în plus, nu e tot ce convingătoare. Deoarece pentru a salva 32 de biți, ar fi în cazul int real, nu este tot ceea ce convingătoare pe un sistem unde s-ar putea folosi zeci de megabytes sau chiar mai mult, cum ar memorie în aceste zile. Și, de fapt, când ajungem la un set de probleme mai târziu și să pună în aplicare vraja te verificatorul și veți fi invitați să facă acest lucru cu acest cât mai puțin RAM și cât mai puțin timp posibil cu privire la te computer-- încă au o săptămână pentru a pune în aplicare it-- vei have-- vei contestat pentru a minimiza aceste resurse. Și că este într-adevăr singura prilejui acest semestru în cazul în care veți fi încurajați să-și radă off chiar cel mai bun performanța Costuri în caz contrar. Deci, cum putem what-- vedea acest lucru în codul actual? Lasă-mă să merg mai departe acum și deschide un exemplu care în mod deliberat se numeste Nu Swap pentru că nu De fapt, schimba variabilele ca de fapt s-ar putea aștepta. Deci, haideți să aruncăm o privire. Iata un program care nu are nici o CS50 Biblioteca întâmplă, eu doar standardul / O. Acum avem un prototip pentru schimb până sus care tocmai înseamnă că Trebuie să fie definite mai târziu. Și aici e principala. Am alocat arbitrar x și y, respectiv, cea valori și doi doar pentru că sunt mici și ușor să se gândească. Și apoi doar am o grămadă de printfs în cazul în care am o verificare bun-simț. x este 1 și y este 2 este probabil ceea ce aceste printfs va spune. Deci, nici o magie până acum. Apoi am de gând să susțin cu imprima def, schimbarea punct punct punct. Am de gând să apela swap funcția, trecând în x și y. Și să presupunem că pentru moment de swap este implementat exact așa cum a fost acum un moment cu o variabilă temporară. Și așa am pretind cu îndrăzneală, schimbat. X este acum acest lucru și y este acum asta. Dar fișierul, desigur, se numeste Nu Swap. Deci, haideți să vedem ce se întâmplă de fapt. Dacă am compila nu de swap și apoi face ./noswap, X este 1, Y este 2. Schimbarea schimbat. x este 1, y este 2. Deci, este de fapt pare a fi greșită, chiar deși swap-- să derulați în jos now-- este pus în aplicare exact conform Codul am propus acum un moment. Deci nu mergi la a lua de lux cu chestii XOR pentru acum. Aceasta, de asemenea, ar trebui să funcționeze doar ca și cu lapte și JO, dar nu pare a fi de lucru. Deci, hai sa facem asta din nou. Poate că pur și simplu nu-i așa difuzate corect. Deci, haideți să executați din nou Nu Swap. Poate Eu-- nr. Deci, e doar nu de lucru. Deci, hai sa facem o verificare bun-simț pic. Lasă-mă să merg mai departe aici, în Swap și trebuie doar să adăugați, așteptați un minut, a este% i / n și să plug-in valoarea unui. Pentru că vreau într-adevăr pentru a vedea ce se întâmplă. Și într-adevăr, acest lucru este o tehnica de depanare că ați putea fi utilizați în ore birou sau acasă, deja înrudită cu prima jumătate a lui Dan Video de Armendariz în PSET3 în care am introdus imprimare def ca o tehnică recomandată, cel puțin pentru cazuri simple. Lasă-mă să mergeți mai departe și a alerga să nu de swap din nou, ./noswap. Interesant. Deci, observați ceea ce pare a fi adevărat. X este 1, y este 2, dar un este 2, atunci când b este 1. Deci, cei doi într-un fel s-au schimbat dar x și y nu sunt obtinerea schimbate. Deci, să fie clar, ce se întâmplă este, aici am x și y și acestea sunt variabile locale în Domeniul de aplicare al principal, am trece în x și y a schimba. Acum, schimb, ca o funcție separată, este liber de a apela argumentele sale sau parametrii orice vrea. Foo sau bar sau x sau y sau a sau b. Doar pentru a face clar faptul că acestea sunt nu sunt identice cu x și y în sine, Am spus-o și b. Dar am putea le numim orice vrem. Și așa se pare ca de swap este trecut X- AKA un-- și este fiind trecut y-- AKA b. Cumva aceste trei linii sunt schimbarea acestor valori exact așa cum a făcut Lauren cu laptele și JO. Dar când am imprima valorile, o și b sunt într-adevăr, dar schimb X și Y au nici o schimbare pentru ei. Amintiți-vă că x și y sunt aici. Astfel încât să putem vedea acest lucru prin intermediul O alta tehnica de asemenea. Și aceasta este de asemenea o tehnică încorporate în problema set de trei. Să mergem mai departe și să facă acest lucru în CS50 ID dacă nu ați făcut deja. Pe partea dreaptă WE au această filă Debugger. Și dacă deschideți asta, există unele informații arcane care este aruncat la tine inițial. Dar să tachineze acest afară foarte repede. Deci unul, vedeți variabile locale. Se pare că construi în IDE CS50, și o mulțime de medii de programare mai în general, este un debugger. Un instrument care vă permite să vedeți vizual ce se întâmplă în interiorul a programului fără a fi nevoie să recurgă la adăugarea printfs și compilarea și rularea și adăugarea printf și compilarea și funcționare, care deja, în ore de birou sau de origine, este, probabil, obtinerea destul de plictisitor. Deci, aici, în doar un moment, suntem va pentru a vedea în timp real valorile variabilelor noastre locale. Vom de asemenea, va fi în măsură să stabilească ceea ce se numesc puncte de întrerupere, care oportunități în programul meu pentru a întrerupe execuție la o linie specifică de cod că sunt curiosi. Dreapta? Aceste programe rula in o fracțiune de secundă. E un fel de frumos pentru noi, oamenii, mai lent pentru a putea întrerupe, ia un moment, a se vedea ce se întâmplă în jurul o anumită linie de cod fără aratura programului prin ea și finisare în întregime. Deci, un puncte de întrerupere să ne permite să rupe si pauză la un moment dat. Stiva de apel este un mod fantezist de spune ce funcții sunt în prezent fiind numit în acest moment. Principal este numit întotdeauna pe primul loc. Dar dacă principal solicită o functie numita Swap, ne de fapt de gând să privească acest turn de funcții care au fost în ordine cronologică inversă. Deci, haideți să vedem asta. Am de gând pentru a micșora. Am de gând să mă întorc la codul meu. Și doar pentru că vreau să fie pedant aici, Am de gând să mergeți mai departe și faceți clic pe doar la stânga liniei cinci. Și care creează un punct roșu. Și observați pe partea dreaptă că debugger știe, hei, Tocmai am spus un punct de întrerupere la linie noswap.c cinci, în special la această linie de cod. Deci, debugger știe că eu au solicitat ca data viitoare Am rulat mea program de pauză execuție există mai degrabă decât doar rulează totul super rapid. Asa ca acum am de gând să faceți clic pe Debug buton în partea superioară a IDE și că va face următoarele. Se va deschide o inițial oarecum infricosator caută al doilea terminal window-- depanarea la distanță de la gazdă și astfel such-- și vom reveni la ceea ce tot ceea ce înseamnă înainte de mult timp. Dar ceea ce este important pentru acum este că această red dot a fost lovit, debugger are în mod deliberat pauză execution-- nu pe linia în sine, ci pe primul linie de cod real în această funcție. Și de aceea este linia de șapte acum evidențiate în galben. Și acum să aruncăm o privire la dreapta. Se pare ca, în mod implicit, destul de frumos, x are ce valoare? 0. Și y are ce valoare? Zero. Și asta e de așteptat, în sensul că X și y-- care line-- galben are nu executat încă. Deci X nu ar trebui să aibă valoarea 1. S-ar putea avea orice altă valoare, un așa-numita valoare gunoi. Și am avut noroc în care este zero, în acest moment, în esență. Deci, acum există doar câteva butoane trebuie să aibă grijă când depanare în acest mod. Observați aici, avem un buton Redare. Și dacă am juca sau lovit relua, asta e doar de gând să ruleze prin restul programului sau până când se lovește un alt punct de întrerupere. Dar eu nu am setat orice alt puncte de întrerupere așa că este doar de gând să ruleze până la sfârșitul. Acest tip de învinge Scopul poking în jurul valorii de. Deci, în loc, îmi pasă Aceste pictograme la dreapta. Și dacă am treceți peste ei, ca ar trebui de asemenea, veți vedea mici tool tips tips--. Acesta este un pas peste. Acum, asta nu înseamnă Skip următoarea linie de cod. Asta înseamnă doar executa și muta la alta, trece la următoarea, a trece la următorul. Cu alte cuvinte, prin acel buton, pot umbla prin intermediul meu de cod cu un pas la un moment dat. Linie cu linie, literalmente. Acum, la dreapta că, există un altul că vom vedea intr-o clipa. Aceasta este așa-numitul Pășește în pictogramă care este O să-mi permită Dive într-o altă funcție. Dar să vedem acest lucru intr-un moment. Deci, am de gând să faceți clic pe pasul peste. Și acum observați, așa cum am faceți clic pe acest buton din dreapta sus, ține ochii aproximativ sub Local Variabile și a vedea ce se întâmplă cu X. X este acum o pentru că linie galbenă a executat acum și ne-am mutat la linia 8. Și într-o clipă y ar trebui să devină sperăm 2. Acum, nimic din ceea ce interesant se întâmplă pentru un pic. Toate acestea sunt este printf. Și observă, în terminalul meu secundar fereastră, văd producția de def imprimare. Și acum trebuie să facă o decizie ca programator. Pot pas peste această linie de cod, aceasta executare dar nu obtinerea curiosi ce e înăuntru. Sau pot pas de fapt în el și du-te în interiorul Swap sine. Deci, hai sa facem aceasta din urmă. Lasă-mă să mergeți mai departe și faceți clic pe Nu mult, dar Pasul Step Into. Aviz, toate dintr-o dată modificările fereastra pentru a evidenția prima linie de cod în Swap. Asta e linia 21. Și acum, ce fel de funky, este faptul că, dacă te uiți aici, cum era de așteptat, o virgulă b este 1 și 2, respectiv. De ce este temp 32767? Reamintind că temp, la fel ca gol cupa acum o clipă, este declarat aici, pe line 21. De ce 32,000- Adică, de ce este doar o valoare ciudat? Da? Audiența: Nu este inițializat. David J. MALAN: E nu a fost inițializat. Deci calculatorul nostru întotdeauna are memorie fizică. Ea are întotdeauna RAM fizică. Și există întotdeauna Zero și unul e acolo, nu? Pentru că suntem folosind nostru calculator toată ziua, pe care îl utilizați IDE CS50 sau serverele pe tot parcursul zilei. Astfel încât RAM, fie are unele zerouri sau unele de una sau câteva zerouri și cele. Nu contează dacă sau nu te le utilizați. Nu poți să avea gol spații în care doriți biți. Sunt fie zerouri și cele. Deci, se dovedește că temp, deoarece noi nu am o inițializat încă, avem acele 32 de biți, dar nu am fost inițializat la orice valori cunoscute. Deci, indiferent că erau mai recent utilizate for-- cei 32 bits-- suntem doar vazut artefacte ale unor utilizarea anterioară a celor special 32 biți. De îndată ce am click Step Over, deși, Pfiu, temp este mergi la a lua valoarea 1. Și dacă o fac din nou, un e O să fie, având în vedere valoarea de 2 și apoi b este de gând să să se acorde valoarea 1. Și ce e frumos acum la acest punct în povestea este faptul că este debugger arată-mi, super lent in ritmul meu, ceea ce starea de swap este. Dar observați în partea de sus de aici, o notificare că stiva de apel, de fapt are doua straturi la acesta. Acum, cea care a subliniat ca Swap, în cazul în care dau click pe Main în schimb, observați cum schimba variabilele locale deoarece dezvoltatorul poate hamei doar în jurul și du-te în orice domeniu de aplicare diferit. Deci, chiar dacă facem toate astea de muncă și schimbarea în mod corect A și B, dacă mă duc înainte și înapoi între Swap unde a este 2 și b este 1 și Main, a fost afectată principal, la toate? Nu. Deci, ce este MENIUL aici? Ei bine, se pare că în orice moment te sun o funcție cum ar fi swap, și treci argumente IT, ceea ce te trece la funcția Swap în acest caz, este o copie de aceste argumente. Deci, dacă X și Y sunt fiecare, respectiv, 32 de biți, ceea ce Swap este obtinerea este de două noi locală variabile, sau argumente, numit și B-, dar acestea sunt arbitrare names-- dar modelul de zerouri și cele interioare ale a și b sunt aliniat pentru a fi identic cu x și y dar ele sunt nu de același lucru ca x și y. E ca și cum Main are pe bucata sa de hârtie numărul 1 și 2 pentru x și y, și apoi atunci când mâinile care bucată de hârtie pentru a schimba, Swap devine foarte repede propria stilou, notează 1 și 2, din proprie foaie de hârtie, mâinile înapoi xy original pentru Main și apoi face propriul lucru cu a și b. Și acest lucru este important, deoarece acum super- acest lucru are implicații netriviale pentru scrierea de fapt codul corect pentru că s-ar părea că nu putem schimba două variabile. Am scris o funcție Swap corectă. Ne-am pus în aplicare cu Lauren ca o funcție de swap corectă, în realitate, dar se pare că nimic din toate astea probleme dacă nu se poate de fapt schimba permanent două valori. Deci, avem nevoie un alt mod pentru a obține de fapt la asta, si avem nevoie pentru a fi în măsură să rezolva de fapt această problemă. Și se pare out-- și vom veni înapoi la această imagine special înainte long-- aceasta este o modalitate prin care s-ar putea trage memoria computerului. E doar un dreptunghi. Ai putea trage orice număr de moduri, dar este convenabil să-l trage ca un dreptunghiul din următorul motiv. Vom începe astăzi și dincolo de vorbind despre așa-numita stiva. Și stiva este doar o bucată de RAM-- o bucată de memory-- că funcțiile au acces atunci când se numesc. Și așa se pare că la foarte partea de jos a acestei stivă este în cazul în care toate variabilele locale principale de și org C și org V și toate chestiile astea sunt de gând să meargă în mod implicit. Și dacă principal solicită o altă funcție ca Swap, Ei bine, de swap este mergi la a lua un alt strat de memorie de până mai sus. Și așa doar pentru a vă oferi o sumară rapid imagine de acest lucru, dacă mă duc peste here-- și lasă-mă să reflecte acest lucru pe aeriene ca well-- ce sa am, dacă ne pasă doar despre partea de jos a această imagine pentru acum, este că atunci când am rulat un program și principal este chemat, Principal este dat o bucată de RAM în calculatorul meu, care este în partea de jos a acestui așa-numitele stivă. Și am de gând să-l atragă în mod deliberat ca un pătrat. Deci e ca 32 de biți sau patru octeți. Și dacă această funcție principală are o variabile numit X, cu o valoare de 1 și are o variabilă numită y cu valoarea 2, care este ca să luați acest țeapă de memorie care Principal a fost dat de operare sistem și împărțind-o în sus, astfel încât prima variabilă locală merge aici, al doilea se duce aici, și asta este. Când principal solicită Swap, Swap devine propria felie de memorie că vom trage ca aceasta din sistemul de operare, și că va avea de variabile locale proprii bazate pe privind punerea în aplicare noastre anterioare cu variabile locale o și b, care inițial obține valorile 1 și 2. Dar apoi, de îndată ce codul Swap executa, și Lauren swap de fapt JO și lapte, ce se întâmplă? Ei bine, acest lucru 2 devine un 1, aceasta 1 este de a deveni un 2, și, de altfel, există o variabilă temp care fiind folosit ca tot timpul că în cele din urmă pleaca. Dar nu contează cât de mult de lucru sa faci în această linie de-- în acest spațiu de memorie, x și y sunt complet neatinse. Asa ca am nevoie de un mod de a da Swap și funcții cum ar fi o acces secrete, dacă vreți, să Funcțiile like-- la memorie ca x și y. Deci, haideți să aruncăm o privire la un exemplu care ajută ne vedem exact ce a fost întâmplă în tot acest timp. Am de gând să merg mai departe și să se deschidă Compară Zero. Și am de gând să închidă debugger nostru, am de gând pentru a închide acest mesaj infricosator caută Just spune, așteptați un minut, ești în depanare mijloc. Am de gând să ascundă această filă aici doar pentru a reveni la simplitate. Deci, nu vă faceți griji dacă GDB este ucis. Asta înseamnă doar că programul are fost renuntat, în mod deliberat, în acest caz, de către mine. Și acum Compara Zero face acest lucru. Sunt folosind CS50 bibliotecă în standardul I / O. Am o funcție principală care primul spune, spune ceva, și devine un șir. Apoi, se spune din nou și devine un alt șir. Și observați că aceste două șiruri sunt numite S și T, respectiv. Și acum acest program, Comparați Zero, scopul său în viață, se presupune să-mi spună, am tastați același lucru? Și așa am de gând înapoi la o saptamana. Sunt folosind operatorul meu egal egal care este operatorul de calitate. Nu este operatorul de atribuire, operatorul de egalitate. Sunt doar compararea S și T. Deci, haideți să de fapt merge mai departe și a face acest lucru. Și am de gând să merg mai departe și să facă Compara Zero. Am de gând să fac ./comparezero. Și am de gând să merg înainte și spune ceva cum ar fi, să facem mama cu litere mici Și cum despre mama cu majuscule. Și, desigur, eu de tip lucruri diferite. In regula. Asta e de așteptat. Să-l executați din nou. Ambele ori face cu litere mici, litere mici. Care arata super-identic cu mine. Enter. BINE. Poate e doar ciudat pentru că nu e place gramatica mea. Deci, hai sa facem o mama de capital, de capital MOM, identice. Lucruri diferite. Deci, de ce este asta? Ei bine, ce se intampla de fapt pe sub capota aici? Deci, să ne întoarcem peste aici pentru un moment și ia în considerare ce getString este, de fapt face. Când apelați getString, asta e un ne funcție ne a scris și devine într-un fel o secventa de caractere din partea utilizatorului. Și să presupunem că primul timp eu numesc getString, că îmi dă o bucată de memorie care arata ca acest lucru. Și dacă am scris în toate litere mici m-o-M-- și ce se întâmplă după asta? Doar o verificare bun-simț rapid. Zero, backslash. Noi stim aia. Și reamintească faptul că ne-am jucat în jurul valorii de cu numele lui Zamila și o grămadă de alte nume când Rob a fost aici în căutarea la ce se întâmplă în interiorul memorie. Așa că povestea e exact la fel. Aceasta este ceea ce getString se întoarce la mine. Acum, codul meu un moment în urmă stocat valoarea de returnare a getString într-o variabilă numită s. Și apoi a doua oară l-am numit, îl stocate într-o variabilă numită T. Deci, dacă mă duc aici, am nevoie de să elaboreze acest variable-- locale și am de gând să, în general, trage un șir ca doar-- ne vom numesc S- ca un mic pătrat aici. Și acum, somehow-- cum se mama du-te în interiorul acestei variabile s? Ei bine, trebuie să ne întoarcem la primul principiilor de aici. Ce este de fapt getString întoarce? Deci, se dovedește că M-O-M backslash la zero, și orice număr de alte siruri de caractere in memorie ca Zamila și Rob sau Andy sau orice alte, sunt, desigur, în nostru RAM sau memoria calculatorului. Și RAM-ul are like-- aveți un concert de RAM, două concerte de RAM, sau un miliard sau două miliarde de bytes, sau poate chiar mai mult in aceste zile. Deci, să presupunem, în scopuri de astăzi, că nu contează cum am număra ei, dar putem număra fiecare din cei miliarde de euro sau două miliarde sau patru miliarde de bytes. Și să spunem că arbitrar aceasta este prima muscatura, muscatura a doua, al treilea, al patrulea. În mod deliberat nu sunt utilizați zero pentru azi, dar ne vom reveni la asta. Deci, cu alte cuvinte, dacă acest lucru este prima dată Sunt folosind programul, Sunt doar obtinerea norocos și primul muscatura este la locația unul, apoi doi apoi trei de patru. Și dacă am păstrat desen, numărul cutie două miliarde ar fi mult aici. Deci, ce crezi, atunci, GetString de fapt se întoarce? Nu e întoarce M-O-M backslash zero, în sine, pentru că în mod clar nu se va potrivi în caseta pe care am desenat. Deci, ce altceva s-ar putea de fapt getString întoarce toate aceste săptămâni? Răspunsul este pe bord pe aici pe undeva. Nu puteți potrivi M-O-M backslash la zero, Deci, ce s-ar putea face sens în schimb? Dacă ar trebui să fie foarte inteligent, punând pe așa-numita pălărie inginerie, ceea ce ar putea reveni? Care este cel mai puțin cantitatea de informații ai putea intoarce care ar încă vă permit să găsiți M-O-M în memorie? Da? Audiența: One. David J. MALAN: One. Și de ce unul? Audiența: Pentru ca ar spune te unde să meargă [neauzit]. David J. MALAN: Exact. Sunt doar de gând să se întoarcă adresa din șirul pe care am ajuns. Adresa în acest caz este unul de locație. Deci, ceea ce este într-adevăr a fi depozitate în S- și fiecare variabilă string astfel far-- a fost tocmai Adresa din șir. Între timp, în cazul în care eu numesc GetString a doua oară și am tastați în literalmente același thing-- M-O-M cu lowercase-- M-O-M și un alt backslash la zero, și acum poate programul meu fost difuzate de ceva timp asa ca poate acest este de 10, aceasta este locația 11, aceasta este de 12, aceasta este 13. Calculatoarele care utilizează un alt memorie pentru orice motiv. Ce acum se în a doua mea variabilă în programul T mea? 10. Exact. Așa că atunci când ne uităm la codul sursă al acestui program în cazul în care pur și simplu încerc eu pentru a compara cele două valori, este S egal egal cu t, ceea ce este Răspunsul evident uman? Doar nu pentru că 1 nu este egal 10. Și astfel aici se află un oportunitate pentru noi într-adevăr pentru a merge doar înapoi la, din nou, în primul rând principii și cred despre, bine, ce se întâmplă sub capota? Am vorbit despre biți și bytes și memorie, dar este de fapt util pentru a înțelege pentru că atunci când te sun getString, chiar dacă ne gândim la ea este revenind M-O-M sau mama șir sau Andy sau Zamila sau similare, tehnic e doar returnarea adresa de care bucată de memorie. Dar asta e în regulă. Pentru că știu cum în cazul în care șirul se termină? Dacă am dat doar începutul? Ei bine, backslash la zero, nu? Tocmai la timp liniar pot imprima cu def imprimare M-O-M. Și, de îndată ce văd backslash la zero, nu-mi pasă unde am început, Știu deja implicit în cazul în care am nevoie pentru a termina. Și așa astăzi marchează beginning-- și lasă-mă să fac acest lucru în mod dramatic deoarece noi a trecut printr-o mulțime de probleme la obține aceste aici formare wheels-- așa că astăzi roțile de formare începe să intre pe noi și dezvăluie la least-- [Aplauze] Asta a fost bine în valoare de călătorie la Target în această dimineață, da? Deci now-- există, se pare out, un astfel de lucru ca șir. String nu există. Este un sinonim care am avut în interiorul bibliotecii CS50. De acum înainte, vom începe de asteptare S și ​​T nu siruri de caractere, ci stele char. Și steaua char am să tachineze pe langa înainte de mult timp. Dar acest lucru este de a spune, că, chiar dacă vom continua folosind getString pentru acum, punct de vedere tehnic că ar trebui putea spune stele char și stele char. Și se pare că ceea ce stea va pentru a indica ceva numit un pointer sau o adresă. Și, de fapt, un teaser pentru ceea ce se află în fața este acest clip 20 secunde de la noastră prieten Nick Parlante la Stanford care, de ceva timp în urmă, petrece o sumă ridicol de timp, ca cel mai bun pot spune în lucrarea sa bucătărie sau subsol lui, face claymation introducerea în lume un personaj pe nume Binky cu care vom fi introduse data viitoare la indicii. Deci, aici este o previzualizare a ceea ce este de a veni. [VIDEO PLAYBACK] Hei, Binky. Trezeste-te. E timpul pentru distracție pointer. -Ce-i asta? Aflați mai multe despre indicii? Oh, Goody. [END PLAYBACK] David J. MALAN: Și pe această notă, vă vom vedea miercuri. In regula. Cine e dans? Haide. Cine e dans? Vrei să-l început? Aduc a început. Woooo! LAUREN: fantezie dulce Moise.