1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> David J. MALAN: Aceasta este CS50 și acesta este începutul săptămânii patru. 3 00:00:14,050 --> 00:00:18,630 Și, băiat, este Volkswagen în probleme toate din cauza software-ului. 4 00:00:18,630 --> 00:00:20,264 Să aruncăm o privire. 5 00:00:20,264 --> 00:00:20,930 [VIDEO PLAYBACK] 6 00:00:20,930 --> 00:00:25,560 -Cars, Cele mai inteligente personajelor în filme rapid si furios. 7 00:00:25,560 --> 00:00:29,100 În această săptămână de automobile german Volkswagen sa aflat 8 00:00:29,100 --> 00:00:32,490 în mijlocul unui scandal de proporții potențial penale. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Se pregătește de miliarde în amenzi, acuzații penale posibile 10 00:00:36,060 --> 00:00:38,560 pentru directori sale, ca compania își cere scuze 11 00:00:38,560 --> 00:00:41,840 pentru fraudarea 11 milioane de mașini la ajuta-l bată teste de emisii. 12 00:00:41,840 --> 00:00:44,950 >> Modelele diesel au fost -Certain proiectat cu software-ul sofisticat 13 00:00:44,950 --> 00:00:48,440 că informațiile folosite, inclusiv poziție a direcției și vehiculul 14 00:00:48,440 --> 00:00:51,870 pentru a determina viteza masina a fost in curs de testare a emisiilor. 15 00:00:51,870 --> 00:00:55,650 Sub această împrejurare, motorul ar reduce emisiile toxice. 16 00:00:55,650 --> 00:00:59,070 Dar masina a fost aranjat la by-pass că, atunci când a fost condus. 17 00:00:59,070 --> 00:01:03,320 Emisiile au crescut 10 până la 40 ori peste nivelurile acceptabile APE. 18 00:01:03,320 --> 00:01:04,280 >> [END PLAYBACK] 19 00:01:04,280 --> 00:01:05,220 >> David J. MALAN: Deci, haideți să aruncăm o privire la acest 20 00:01:05,220 --> 00:01:07,250 și a vedea exact cum aceasta ar putea fi puse în aplicare 21 00:01:07,250 --> 00:01:09,680 și modul în care acest lucru ar putea afecta atât de multe mașini de acest gen. 22 00:01:09,680 --> 00:01:12,840 Deci, în mâna mea aici sunt presa versiune, care a fost emis de EPA-- 23 00:01:12,840 --> 00:01:14,620 de Mediu Agenția pentru Protecția care 24 00:01:14,620 --> 00:01:18,032 este agenția de reglementare din SUA, care mânere preocupările legate de mediu, 25 00:01:18,032 --> 00:01:19,740 și apoi reală Aviz juridic care a fost 26 00:01:19,740 --> 00:01:22,420 trimite la Volkswagen la doar câteva zile în urmă. 27 00:01:22,420 --> 00:01:26,530 >> Deci APE scrie, și dezvăluie acum public, un software sofisticat 28 00:01:26,530 --> 00:01:29,390 Algoritmul pe anumite Volkswagen detectează 29 00:01:29,390 --> 00:01:32,630 atunci cand masina este in curs Testarea emisiilor oficiale 30 00:01:32,630 --> 00:01:36,505 și apoi a emisiilor complete controalele privind doar în timpul testului. 31 00:01:36,505 --> 00:01:38,380 Eficacitatea acestea poluare vehicule 32 00:01:38,380 --> 00:01:43,260 dispozitive de control a emisiilor este foarte redusă pe tot parcursul normale de conducere 33 00:01:43,260 --> 00:01:44,320 situații. 34 00:01:44,320 --> 00:01:48,190 Acest lucru duce la mașini care îndeplinesc standarde în laborator sau testării 35 00:01:48,190 --> 00:01:52,790 stație, dar în timpul funcționării normale emit oxides-- azot sau NOx-- 36 00:01:52,790 --> 00:01:54,950 până la 40 de ori Standard. 37 00:01:54,950 --> 00:01:58,220 Software-ul produs de Volkswagen este un dispozitiv citat încheiat citatul, înfrângere, 38 00:01:58,220 --> 00:02:00,650 astfel cum sunt definite de către Clean Air Act în SUA. 39 00:02:00,650 --> 00:02:03,410 >> Ei merg pe să spun că EPA și o altă agenție de 40 00:02:03,410 --> 00:02:07,020 descoperit dispozitivul înfrângere software-ul după o analiză independentă 41 00:02:07,020 --> 00:02:09,660 de cercetatorii de la West Universitatea Virginia. 42 00:02:09,660 --> 00:02:14,160 Poluarea NOx contribuie la dioxid de azot, ozon la nivelul solului, 43 00:02:14,160 --> 00:02:15,700 și particule fine. 44 00:02:15,700 --> 00:02:18,090 Expunerea la aceste poluanți a fost legat 45 00:02:18,090 --> 00:02:20,870 cu o gamă largă de efecte grave de sanatate, 46 00:02:20,870 --> 00:02:23,637 inclusiv astm a crescut atacuri și alte respiratorii 47 00:02:23,637 --> 00:02:26,470 boli care pot fi suficient de grave pentru a trimite oameni la spital. 48 00:02:26,470 --> 00:02:28,660 Expunerea la ozon și pulberi în suspensie are, de asemenea 49 00:02:28,660 --> 00:02:31,960 fost asociată cu prematura moarte din cauza respiratorii legate de 50 00:02:31,960 --> 00:02:35,690 sau cardiovasculare legate efecte. 51 00:02:35,690 --> 00:02:38,940 Copiii, persoanele în vârstă, persoane cu boli respiratorii preexistente 52 00:02:38,940 --> 00:02:42,840 sunt deosebit de expuse riscului de efectele asupra sănătății ale acestor poluanți. 53 00:02:42,840 --> 00:02:45,056 >> Este suficient este de a spune, este destul de grave. 54 00:02:45,056 --> 00:02:46,930 Și hai să mergem pe pentru a citi doar una mai mult fragment 55 00:02:46,930 --> 00:02:49,370 și apoi vom arunca o privire la implicațiile care stau la baza 56 00:02:49,370 --> 00:02:50,920 de acest lucru în cadrul unei mașini. 57 00:02:50,920 --> 00:02:53,730 Mai exact, Volkswagen fabricat și instalat 58 00:02:53,730 --> 00:02:56,210 software în așa-numitul control electronic 59 00:02:56,210 --> 00:02:59,320 module-- sau ECM-- de aceste vehicule care sesizate 60 00:02:59,320 --> 00:03:03,580 când vehiculul a fost testat pentru conformitatea cu standardele de emisie EPA. 61 00:03:03,580 --> 00:03:07,510 Bazat pe diferite intrări, inclusiv Poziția volanului, vehicul 62 00:03:07,510 --> 00:03:11,280 viteza, durata motorului anilor exploatarea, precum și presiunea barometrică, 63 00:03:11,280 --> 00:03:13,720 aceste intrări exact senile parametrii 64 00:03:13,720 --> 00:03:17,600 a procedurii de testare federal folosi testele de emisii pentru certificare EPA 65 00:03:17,600 --> 00:03:18,400 scopuri. 66 00:03:18,400 --> 00:03:21,850 >> În timpul încercărilor de emisii APE, software-ul de vehicule ECM 67 00:03:21,850 --> 00:03:25,060 a fugit de software care a produs Rezultatele de emisii conforme. 68 00:03:25,060 --> 00:03:28,340 În toate celelalte ori, software ECM vehicul 69 00:03:28,340 --> 00:03:31,090 a fugit un drum separat calibrare care a redus 70 00:03:31,090 --> 00:03:34,360 Eficacitatea sistem global de control al emisiilor, 71 00:03:34,360 --> 00:03:37,864 în mod specific catalitică selectivă reducerea NOx Lean trap-- 72 00:03:37,864 --> 00:03:39,280 care vom vedea despre într-un moment. 73 00:03:39,280 --> 00:03:43,040 Ca urmare, emisiile de NOx a crescut cu un factor de 10 până la 40 de ori 74 00:03:43,040 --> 00:03:47,450 peste nivelurile conforme APE în funcție de tipul de ciclu de acționare. 75 00:03:47,450 --> 00:03:50,800 >> Deci, ce înseamnă acest lucru într-adevăr, și codul sursă pentru funcționarea software 76 00:03:50,800 --> 00:03:53,190 pe anii Volkswagen nu are a fost încă făcute publice, 77 00:03:53,190 --> 00:03:56,460 este faptul că, în mod eficient, acest echivalent este undeva acolo în interiorul 78 00:03:56,460 --> 00:03:57,830 de cod Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Dacă sunteți în curs de testare, iar în cazul în care mașina detecteaza anumiti factori de mediu 80 00:04:02,200 --> 00:04:04,330 ca volanul poziție sau mișcarea 81 00:04:04,330 --> 00:04:06,710 sau lipsa acesteia a masinii sau orice număr de alți factori 82 00:04:06,710 --> 00:04:09,940 care sunt în prezent ipoteza să facă parte din această formulă, 83 00:04:09,940 --> 00:04:12,370 se transformă pur și simplu pe controla emisiile complete. 84 00:04:12,370 --> 00:04:15,670 Cu alte cuvinte, ele încep emit mai puțin de poluanți. 85 00:04:15,670 --> 00:04:18,769 >> Altele, în orice altă situație atunci când nu este detectat ca fiind 86 00:04:18,769 --> 00:04:20,790 în laborator, ei doar nu. 87 00:04:20,790 --> 00:04:24,320 Și astfel încât să puteți simplifica acest lucru în mai multe pseudocod beton cu ceva 88 00:04:24,320 --> 00:04:24,820 asa. 89 00:04:24,820 --> 00:04:27,810 Dacă roțile sunt de cotitură, dar volan nu este, sugestiv 90 00:04:27,810 --> 00:04:30,060 că mașina este pe unele un fel de cilindru rotativ 91 00:04:30,060 --> 00:04:32,550 dar într-un fel de depozit testat, 92 00:04:32,550 --> 00:04:36,070 apoi se comportă ca EPA să-ar dori. 93 00:04:36,070 --> 00:04:37,960 În caz contrar, nu. 94 00:04:37,960 --> 00:04:40,420 Deci, haideți să aruncăm o privire la un scurt videoclip care 95 00:04:40,420 --> 00:04:45,391 ia o privire la ceea ce implicațiile sunt de acest fapt mecanic. 96 00:04:45,391 --> 00:04:48,620 >> [VIDEO PLAYBACK] 97 00:04:48,620 --> 00:04:52,800 >> -Ultima Vineri APE a anuntat ca unele Masini Volkswagen Audi a făcut între 2009 98 00:04:52,800 --> 00:04:55,840 și în acest an au fost cu ajutorul un așa-numit dispozitiv de manipulare 99 00:04:55,840 --> 00:04:59,060 pentru a obține în jurul valorii de legi privind emisiile concepute pentru a menține aerul curat. 100 00:04:59,060 --> 00:05:01,700 Dar ce înseamnă asta exact? 101 00:05:01,700 --> 00:05:04,666 >> Ei bine, masinile moderne au zeci de calculatoare în interiorul ei. 102 00:05:04,666 --> 00:05:07,040 Iar unele dintre aceste calculatoare ajuta pentru a coordona funcțiile 103 00:05:07,040 --> 00:05:09,590 a motorului pentru optim performanțele, asigurându-vă 104 00:05:09,590 --> 00:05:12,340 că nu este prea mult gunoi iese din țeava de eșapament. 105 00:05:12,340 --> 00:05:15,170 Au fost într-adevăr de lucru acest fel de mai multe decenii acum. 106 00:05:15,170 --> 00:05:17,380 Practic, fiecare parte motorului unei mașini moderne 107 00:05:17,380 --> 00:05:20,080 are un senzor sau controler pe ea, și aceste calculatoare 108 00:05:20,080 --> 00:05:23,460 citesc în datele de mii de ori pe ajustări de luare a doua 109 00:05:23,460 --> 00:05:26,220 ca raportul dintre combustibil la aer ce se intampla in cilindrii. 110 00:05:26,220 --> 00:05:28,730 >> Acestea Volkswagen inseala și modele Audi sunt diesel, 111 00:05:28,730 --> 00:05:30,890 și diesel au o mai calculator cu adevarat important 112 00:05:30,890 --> 00:05:34,030 Parametrii controlate, care este cantitatea de combustibil nears merge 113 00:05:34,030 --> 00:05:35,200 în sistemul de evacuare. 114 00:05:35,200 --> 00:05:36,310 Acum, că sună rău. 115 00:05:36,310 --> 00:05:39,642 Nu suna ca tine ar vrea combustibil nears a intra în sistemul de evacuare. 116 00:05:39,642 --> 00:05:41,600 Dar în cazul unei diesel, ai ceva 117 00:05:41,600 --> 00:05:46,110 numit o capcană NOx care este un dispozitiv care absoarbe și capcane pentru oxizi de azot 118 00:05:46,110 --> 00:05:48,880 că sunt poluanți care ar în caz contrar du-te în atmosferă. 119 00:05:48,880 --> 00:05:53,040 Și efectul pe care capcana NOx este îmbunătățită cu combustibil nears. 120 00:05:53,040 --> 00:05:56,650 Deci, un dispozitiv de manipulare este un program special în interiorul acestor computere care pot face 121 00:05:56,650 --> 00:05:59,527 arata ca masina corespunde emisiilor Standardele chiar și atunci când nu. 122 00:05:59,527 --> 00:06:01,110 Volkswagen a avut o problemă pe mâinile sale. 123 00:06:01,110 --> 00:06:04,050 Motoarele diesel s-au cunoscut pentru a obține economia de combustibil mare, 124 00:06:04,050 --> 00:06:07,510 dar capcana NOx funcționează numai bine atunci când este utilizat mai mult combustibil. 125 00:06:07,510 --> 00:06:10,460 Deci mașina va detecta, folosind acest dispozitiv de manipulare, 126 00:06:10,460 --> 00:06:13,870 când a fost obtinerea o emisiilor testare, ar folosi mai mult combustibil, 127 00:06:13,870 --> 00:06:16,830 face munca capcana NOx bine, emisiile ar fi bine. 128 00:06:16,830 --> 00:06:21,130 Dar apoi te pe drum, dispozitivul se oprește, te arde mai putin combustibil 129 00:06:21,130 --> 00:06:24,256 dar ce te pune la fel de mult ca de 40 de ori mai multor poluanți în atmosferă. 130 00:06:24,256 --> 00:06:26,130 Dar cum naiba a făcut masina știu că a fost 131 00:06:26,130 --> 00:06:27,720 testat pentru conformitate a emisiilor? 132 00:06:27,720 --> 00:06:30,590 APE spune ca a fost un sofisticat sistem care verifică lucrurile 133 00:06:30,590 --> 00:06:34,090 ca direcție poziția roții, viteza, cât timp motorul a fost pornit, 134 00:06:34,090 --> 00:06:35,507 și chiar presiunea atmosferică. 135 00:06:35,507 --> 00:06:37,673 Cu alte cuvinte, nu a existat nici un fel acest lucru a fost accidental 136 00:06:37,673 --> 00:06:40,260 pentru că software-ul a fost proiectat foarte atent pentru a detecta 137 00:06:40,260 --> 00:06:41,630 un test de emisii oficial. 138 00:06:41,630 --> 00:06:43,588 Asta e ceva foarte serios înșelăciune și că este 139 00:06:43,588 --> 00:06:45,420 de ce Volkswagen este în astfel de probleme serioase. 140 00:06:45,420 --> 00:06:48,600 De fapt, CEO-ul lor, Martin Winterkorn, doar a demisionat. 141 00:06:48,600 --> 00:06:49,820 >> Deci, ce se întâmplă în continuare? 142 00:06:49,820 --> 00:06:53,900 Ei bine, daca esti unul din jumătate de milion de Jettas diesel, Beatles, volte, modele Passat, 143 00:06:53,900 --> 00:06:56,220 sau Audi A3s efectuate, Vestea buna este este 144 00:06:56,220 --> 00:06:57,886 ca masina ta este încă în siguranță de a conduce. 145 00:06:57,886 --> 00:07:00,510 Nu trebuie să-l pună deoparte până la Volkswagen emite o rechemare. 146 00:07:00,510 --> 00:07:02,509 Dar la un moment dat sunt probabil, va avea 147 00:07:02,509 --> 00:07:04,230 pentru a actualiza software-ul din interiorul mașinii. 148 00:07:04,230 --> 00:07:06,927 Când acest lucru se întâmplă s-ar putea obține mai puține mile pe rezervor. 149 00:07:06,927 --> 00:07:09,260 Avocații sunt deja pregatesc pentru procese clasa de acțiune 150 00:07:09,260 --> 00:07:12,500 astfel proprietarii s-ar putea obține compensate la un moment dat în viitor. 151 00:07:12,500 --> 00:07:15,832 Dar asta nu se va întâmpla în orice moment în curând. 152 00:07:15,832 --> 00:07:16,711 >> [END PLAYBACK] 153 00:07:16,711 --> 00:07:19,960 David J. MALAN: Deci acest lucru ridică de fapt o interesantă întrebare mai mare imagine 154 00:07:19,960 --> 00:07:20,660 ca să aibă încredere. 155 00:07:20,660 --> 00:07:21,160 Dreapta? 156 00:07:21,160 --> 00:07:24,300 Toate dintre noi au iPhone sau androizii sau ceva în buzunarele noastre, cel mai probabil 157 00:07:24,300 --> 00:07:26,500 Aceste zile, sau laptop-uri pe ture noastre, care sunt 158 00:07:26,500 --> 00:07:28,510 software care se execută făcut de Apple si Microsoft 159 00:07:28,510 --> 00:07:30,710 și ciorchini de alte companii. 160 00:07:30,710 --> 00:07:34,240 Dar cum știm că ceea ce aceste produse software fac 161 00:07:34,240 --> 00:07:37,680 este, de fapt ceea ce acestea companii spun că fac? 162 00:07:37,680 --> 00:07:39,610 >> De exemplu, cine e la spun că de fiecare dată când 163 00:07:39,610 --> 00:07:42,200 efectua un apel telefonic de pe iPhone sau telefon Android sau altele asemenea, 164 00:07:42,200 --> 00:07:45,650 că numărul de telefon nu este, de asemenea, fiind încărcat la server unele companiei 165 00:07:45,650 --> 00:07:48,399 din cauza unor programe ai scris, fie că este vorba de operare 166 00:07:48,399 --> 00:07:51,070 Sistemul în sine ca iOS sau Android, sau pentru că ați descărcat 167 00:07:51,070 --> 00:07:53,880 unele terță app parte că într-un fel este de a asculta 168 00:07:53,880 --> 00:07:57,120 pentru tot ceea ce tastați sau tot ceea ce spune de fapt. 169 00:07:57,120 --> 00:07:59,500 De unde știi că, atunci când voi se execută zăngănit 170 00:07:59,500 --> 00:08:02,590 sau de a face pentru a compila dvs. software proprie în CS50, cum 171 00:08:02,590 --> 00:08:06,080 Detii personal care CS50 lui, prin intermediul bibliotecii CS50, 172 00:08:06,080 --> 00:08:08,690 nu a fost de logare de fiecare șir ați ajuns vreodată 173 00:08:08,690 --> 00:08:10,276 sau fiecare inch ai ajuns vreodată? 174 00:08:10,276 --> 00:08:12,900 Ei bine, ai putea sa te uiti cu siguranță la codul sursă pentru ceva 175 00:08:12,900 --> 00:08:15,233 ca biblioteca CS50, tu ar putea uita-te la codul sursă 176 00:08:15,233 --> 00:08:18,170 pentru sistemul de operare Linux rulează pe IDE CS50. 177 00:08:18,170 --> 00:08:23,090 Dar o prezentare uimitoare a fost dat înapoi în 1984 178 00:08:23,090 --> 00:08:26,730 în primirea Premiul Turing printr-o om de stiinta de calculator foarte celebru cunoscut 179 00:08:26,730 --> 00:08:29,750 as-- numit Ken Thompson, care a a primit Premiul Turing care 180 00:08:29,750 --> 00:08:33,500 este un fel de informatică lui Premiul Nobel, dacă vreți, 181 00:08:33,500 --> 00:08:35,309 pentru munca sa pe o sistem de operare numit 182 00:08:35,309 --> 00:08:39,039 Unix, care este foarte asemănătoare în spirit de ceea ce le folosim, care este Linux. 183 00:08:39,039 --> 00:08:41,960 Și întrebarea a cerut în lucrarea sa discursul de acceptare, în esență 184 00:08:41,960 --> 00:08:44,910 de stabilire a cadrului pentru ani și ani de discuții 185 00:08:44,910 --> 00:08:46,970 despre încredere și securitate, a fost aceasta. 186 00:08:46,970 --> 00:08:50,410 În ce măsură ar trebui să o încredere un declarație că o program-- o piesă 187 00:08:50,410 --> 00:08:53,010 de software-- este liber de cai troieni? 188 00:08:53,010 --> 00:08:56,500 Poate că este mai important să aibă încredere oamenii care au scris software-ul. 189 00:08:56,500 --> 00:08:58,650 >> Și, de fapt, ne-am legat să vorbesc ca el 190 00:08:58,650 --> 00:09:02,400 a dat atunci când acceptă acest premiu in anii '80 pe site-ul lui CS50 191 00:09:02,400 --> 00:09:04,030 în pagina Prelegeri pentru ziua de azi. 192 00:09:04,030 --> 00:09:06,071 Pentru că ceea ce veți vedea este că el dă de fapt 193 00:09:06,071 --> 00:09:09,430 o destul de simplu exemplu de cum chiar un compilator ca zăngănit sau orice altceva 194 00:09:09,430 --> 00:09:13,950 compilatoare alții au folosit în trecut, Ce se întâmplă dacă încorporate în WE compilator 195 00:09:13,950 --> 00:09:18,190 noi folosesc este un pic dacă condiție care spune în esență, 196 00:09:18,190 --> 00:09:22,360 dacă observați că acest cod este folosind funcția getString sau getint 197 00:09:22,360 --> 00:09:26,600 funcție, mergeți mai departe și introduceți o ușă din spate sau un cal troian 198 00:09:26,600 --> 00:09:29,340 astfel încât acest program are acum niște zerouri 199 00:09:29,340 --> 00:09:30,930 și cei care fac ceva rău intenționat. 200 00:09:30,930 --> 00:09:33,080 Logare toate dvs. intrarile de la tastatura, încărcarea că datele 201 00:09:33,080 --> 00:09:35,100 la unele servere, sau nimic. 202 00:09:35,100 --> 00:09:37,290 >> Și ce Ken Thompson continuă să facă în discursul său 203 00:09:37,290 --> 00:09:40,580 este de a demonstra că, chiar dacă aveți acces la sursa 204 00:09:40,580 --> 00:09:43,794 Codul de un compilator care răutate s-ar putea face acest lucru, 205 00:09:43,794 --> 00:09:46,210 nu conteaza, deoarece există acest pui și ou 206 00:09:46,210 --> 00:09:49,500 realitatea celor mulți trecut ani în cadrul cărora compilatoare 207 00:09:49,500 --> 00:09:51,960 sunt folosite pentru a colectate chiar. 208 00:09:51,960 --> 00:09:55,440 Cu alte cuvinte, drumul înapoi atunci când cineva a trebuit să fi scris primul compilator. 209 00:09:55,440 --> 00:09:59,060 Și, ulterior, în orice moment le-am actualizat un compilator de a schimba codul sursă, 210 00:09:59,060 --> 00:10:02,020 adăugarea de caracteristici și recompilarea l pentru oameni ca noi să folosească, ei bine, 211 00:10:02,020 --> 00:10:04,270 ei folosind vechi versiune a compilatorului 212 00:10:04,270 --> 00:10:06,370 pentru a compila noul versiune a compilatorului. 213 00:10:06,370 --> 00:10:08,370 Și dacă aruncăm o privire la discuțiile pe care le-a dat, 214 00:10:08,370 --> 00:10:10,970 veți vedea că, din cauza din circularitate, 215 00:10:10,970 --> 00:10:14,330 puteți avea de fapt bug-uri sau Cai troieni încorporat în software-ul 216 00:10:14,330 --> 00:10:14,990 suntem folosind. 217 00:10:14,990 --> 00:10:18,010 Și chiar dacă te uiți la codul sursă pentru aceste programe, 218 00:10:18,010 --> 00:10:21,550 ar putea să nu fie chiar evident pentru că viclenia este de fapt 219 00:10:21,550 --> 00:10:24,710 în unele versiune mai veche a unui compilator care de atunci a fost 220 00:10:24,710 --> 00:10:27,340 injectarea amenințarea în software-ul nostru. 221 00:10:27,340 --> 00:10:29,740 >> Care este doar de a spune, ne-am într-adevăr nu se poate și nu trebuie să 222 00:10:29,740 --> 00:10:32,939 software-ul de încredere care rulează pe laptop-uri noastre sau telefoane sau orice număr de locuri. 223 00:10:32,939 --> 00:10:36,230 Și, de fapt, mai târziu în acest semestru, atunci când începem să vorbim despre programare web 224 00:10:36,230 --> 00:10:38,521 și de fapt, începe construirea aplicatii web noi, 225 00:10:38,521 --> 00:10:40,285 vom vorbi despre acestea amenințări și altele. 226 00:10:40,285 --> 00:10:43,410 Acum, s-ar putea s-au intrebat si am observat că a existat un mic mic Darth 227 00:10:43,410 --> 00:10:45,842 Vader în clipurile pe care Acostament arăta acolo 228 00:10:45,842 --> 00:10:47,550 despre Volkswagen. Dacă nu ați mai văzut, m-am 229 00:10:47,550 --> 00:10:49,190 crezut ar trebui să ne lumineze starea de spirit pentru că acest lucru este tot 230 00:10:49,190 --> 00:10:50,780 foarte deprimant și înfricoșătoare. 231 00:10:50,780 --> 00:10:52,910 Am de gând să se uite înapoi la Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 atunci când un comercial de Volkswagen-- și acest 233 00:10:55,300 --> 00:10:59,620 aproape le face simpatic again-- difuzat pentru prima dată la televizor. 234 00:10:59,620 --> 00:11:04,039 Este al doilea clip 60 care cred că vă veți bucura de. 235 00:11:04,039 --> 00:11:04,705 [VIDEO PLAYBACK] 236 00:11:04,705 --> 00:11:08,198 [MUSIC - temă din "Star Wars"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [Caine latra] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [Mașina începe] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [END PLAYBACK] 243 00:12:05,955 --> 00:12:06,830 David J. MALAN: Da. 244 00:12:06,830 --> 00:12:07,663 Am fost doar de verificare. 245 00:12:07,663 --> 00:12:11,360 Mașina se află pe lista de încălcări. 246 00:12:11,360 --> 00:12:12,000 In regula. 247 00:12:12,000 --> 00:12:14,040 Deci, ne uităm la unele pseudocod un moment în urmă. 248 00:12:14,040 --> 00:12:15,380 Și aici e un mare fragment de cod pseudocod 249 00:12:15,380 --> 00:12:16,921 pe care le-am văzut de câteva ori până acum. 250 00:12:16,921 --> 00:12:19,970 Și să folosim aceasta este o oportunitate acum de a introduce o nouă programare 251 00:12:19,970 --> 00:12:23,776 tehnica pe care am făcut-o vezi algoritmic 252 00:12:23,776 --> 00:12:25,400 săptămâna trecută, când ne-am uitat la fel merge. 253 00:12:25,400 --> 00:12:28,270 Dar să-l oficializeze și a vedea cum am putea folosi în codul actual, 254 00:12:28,270 --> 00:12:30,350 și apoi vom folosi acest Tehnica pe drum mai 255 00:12:30,350 --> 00:12:32,000 susceptibile de a rezolva anumite alte probleme. 256 00:12:32,000 --> 00:12:35,790 >> Deci, aceasta a fost una dintre primele programe noi a scris vreodată, deși în codul pseudocod. 257 00:12:35,790 --> 00:12:37,790 Și ce acest program ne-a permis să facem curs 258 00:12:37,790 --> 00:12:41,510 a fost de a găsi Mike Smith într-o carte de telefon. 259 00:12:41,510 --> 00:12:46,216 Și observa in special linii opt și 11 care a avut această declarație Go To. 260 00:12:46,216 --> 00:12:48,090 Și, de fapt, anumite limbi, C printre ei, 261 00:12:48,090 --> 00:12:50,006 de fapt, nu au o declarație că este literalmente 262 00:12:50,006 --> 00:12:52,710 du-te la care vă permite să sări la o anumită linie. 263 00:12:52,710 --> 00:12:55,470 Este, în general, se încruntă la cauza Ea poate fi foarte ușor abuzate 264 00:12:55,470 --> 00:12:58,490 și puteți începe sărituri dvs. Programul peste tot, spre deosebire 265 00:12:58,490 --> 00:13:00,690 pentru utilizarea tipul de logică și fluxul de control 266 00:13:00,690 --> 00:13:04,000 pe care le-am folosit pana acum doar cu bucle și condițiile și altele asemenea. 267 00:13:04,000 --> 00:13:08,660 >> Dar putem simplifica acest algoritm în cod pseudocod, după cum urmează. 268 00:13:08,660 --> 00:13:11,250 In loc de aceasta iterativ sau abordare looping 269 00:13:11,250 --> 00:13:14,160 în cazul în care ne-am tot merge înapoi și înapoi și înapoi la linia de trei, 270 00:13:14,160 --> 00:13:18,300 de ce nu ne-am un fel de punt și mai spun, în general, în conformitate șapte și 10, 271 00:13:18,300 --> 00:13:20,570 doar doi le înlocuiesc pe cele perechi de linii cu, 272 00:13:20,570 --> 00:13:22,810 altceva în cazul în care Smith este anterioară în cartea ne vom 273 00:13:22,810 --> 00:13:25,110 caută Mike în jumătate din stânga a cărții. 274 00:13:25,110 --> 00:13:28,560 Altfel, dacă Smith este mai târziu, în carte, căutați Mike în dreapta 275 00:13:28,560 --> 00:13:29,540 jumătate din carte. 276 00:13:29,540 --> 00:13:31,180 Și observați deja circularitatea. 277 00:13:31,180 --> 00:13:31,680 Dreapta? 278 00:13:31,680 --> 00:13:34,250 Sunt interesat de Mike în cartea de telefon și apoi 279 00:13:34,250 --> 00:13:37,090 În cele din urmă l-am lovit, poate line șapte sau poate linia 10 280 00:13:37,090 --> 00:13:41,089 și instruire mea pentru mine este de căutare pentru Mike în jumătate din cartea de telefon. 281 00:13:41,089 --> 00:13:42,380 Ei bine, cum am căuta Mike? 282 00:13:42,380 --> 00:13:44,213 Sunt în mijlocul căutarea Mike, de ce 283 00:13:44,213 --> 00:13:45,860 ai un fel de mine trimite într-un cerc? 284 00:13:45,860 --> 00:13:49,590 Dar asta e OK, deoarece ceea ce este întâmplă la dimensiunea problemei, 285 00:13:49,590 --> 00:13:52,630 cum este scris în linia 7 și 10? 286 00:13:52,630 --> 00:13:54,989 Noi nu spunem doar de căutare pentru Mike, caută Mike. 287 00:13:54,989 --> 00:13:56,280 Suntem ceea ce spun în mod special? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Căutați-l în jumătatea stângă a jumătatea dreaptă care este efectiv 290 00:14:01,610 --> 00:14:03,440 jumătate din dimensiunea problemei. 291 00:14:03,440 --> 00:14:07,170 Deci e în regulă că suntem un fel de angajarea în această circularitate, 292 00:14:07,170 --> 00:14:09,180 acest argument circular, deoarece cel puțin suntem 293 00:14:09,180 --> 00:14:11,090 ceea ce face problema în ce mai mici. 294 00:14:11,090 --> 00:14:14,220 Și, eventual, vom ajunge la că așa-numitul caz de bază în cazul în care 295 00:14:14,220 --> 00:14:16,780 avem doar o singură pagină left-- ca voluntar nostru săptămâna trecută 296 00:14:16,780 --> 00:14:18,684 did-- am avut o singură pagină stânga și apoi noi nu 297 00:14:18,684 --> 00:14:21,600 Trebuie să continuați căutarea pentru Mike Smith pentru că e fie pe pagina 298 00:14:21,600 --> 00:14:23,080 sau el nu este. 299 00:14:23,080 --> 00:14:27,480 >> Deci, cum putem pune în aplicare această idee, această un fel de circularitate în codul actual? 300 00:14:27,480 --> 00:14:31,030 Ei bine, putem parghie o tehnică care este, în general, cunoscut sub numele de recursivitate. 301 00:14:31,030 --> 00:14:33,960 Și am văzut acest lucru în pseudocod pentru Merge fel săptămâna trecută. 302 00:14:33,960 --> 00:14:37,190 Amintiți-vă că aceasta a fost pseudocod pentru Merge fel. 303 00:14:37,190 --> 00:14:40,560 Este, fără îndoială, chiar mai simplu decât bule sau selecție sau sortare prin inserție 304 00:14:40,560 --> 00:14:43,310 doar în ceea ce privește simplitatea cu care puteți exprima. 305 00:14:43,310 --> 00:14:46,750 >> Dar asta e, deoarece suntem un fel de circular 306 00:14:46,750 --> 00:14:51,350 spunând căuta ceva căutând din nou. 307 00:14:51,350 --> 00:14:53,960 Dar suntem în căutarea fie pe jumătatea stângă sau jumătatea din dreapta 308 00:14:53,960 --> 00:14:56,070 și apoi în cele din urmă suntem fuzionează în acest caz. 309 00:14:56,070 --> 00:14:58,520 Dar aici, de asemenea, cu cele două linii de sortare, 310 00:14:58,520 --> 00:15:01,320 am avea din nou acest Ideea de recursivitate. 311 00:15:01,320 --> 00:15:05,350 Și concret ce înseamnă acest lucru, în contextul unui algoritm, 312 00:15:05,350 --> 00:15:10,880 este că un algoritm este recursiv dacă se folosește sau se numește. 313 00:15:10,880 --> 00:15:14,330 >> Sau în ceea ce privește C, o funcție este recursive-- o funcție numită 314 00:15:14,330 --> 00:15:18,510 foo este recursiv dacă foo, undeva în codul sursă, 315 00:15:18,510 --> 00:15:21,250 solicită funcția în sine foo. 316 00:15:21,250 --> 00:15:25,790 Și asta e de rău, dacă tot foo face vreodată este ea însăși apel nou și din nou. 317 00:15:25,790 --> 00:15:30,600 E în regulă, dacă în cele din urmă se oprește foo, la fel ca merge sort, spunând, așteptați un minut, 318 00:15:30,600 --> 00:15:32,980 Dacă această problemă este super mici, de exemplu, 319 00:15:32,980 --> 00:15:35,840 sau l-am găsit pe care eu sunt cauta, doar întoarce. 320 00:15:35,840 --> 00:15:41,000 Nu recursiv, nu ciclic mă numesc din nou. 321 00:15:41,000 --> 00:15:44,200 >> Și Să aruncăm o privire la cum acest lucru ar putea lucra efectiv. 322 00:15:44,200 --> 00:15:48,430 Deci, am de gând să merg mai departe și deschis a două exemple de cod sursă de aici. 323 00:15:48,430 --> 00:15:50,321 Una dintre care este numit sigma 0. 324 00:15:50,321 --> 00:15:52,320 Și acest lucru nu este deloc recursiv, dar haideți să aruncăm 325 00:15:52,320 --> 00:15:53,694 O privire la ceea ce face acest program. 326 00:15:53,694 --> 00:15:55,737 Am dezbrăcat tot comentarii de la ea, dar toate 327 00:15:55,737 --> 00:15:58,070 a codului sursă pe de CS50 site-ul are Comentariul Dacă 328 00:15:58,070 --> 00:15:59,570 doriți să citiți prin ea din nou mai târziu. 329 00:15:59,570 --> 00:16:02,010 Și să facem un cuplu de bun-simț verifica aici. 330 00:16:02,010 --> 00:16:06,640 >> Deci, la partea de sus a acestui cod, avem includ CS50.h. 331 00:16:06,640 --> 00:16:07,650 Ce face acest lucru? 332 00:16:07,650 --> 00:16:08,990 De ce este aici? 333 00:16:08,990 --> 00:16:11,740 În termeni de nespecialist rezonabil lui. 334 00:16:11,740 --> 00:16:12,424 Ce face? 335 00:16:12,424 --> 00:16:12,858 Da. 336 00:16:12,858 --> 00:16:14,160 >> Audiența: Așa că funcția getint funcționează. 337 00:16:14,160 --> 00:16:16,243 >> David J. MALAN: Așa că funcția getint funcționează. 338 00:16:16,243 --> 00:16:18,115 Din cauza acestei interior fișier, CS50.h, care 339 00:16:18,115 --> 00:16:20,950 vom vedea înainte de mult timp în punct de vedere al codului sursă, 340 00:16:20,950 --> 00:16:23,270 are o grămadă de funcții declared-- getint, getString, 341 00:16:23,270 --> 00:16:26,950 și o grămadă de others-- și cu excepția cazului în avem de fapt care includ linie, 342 00:16:26,950 --> 00:16:29,320 zăngăni compilator nu este O să știe că ea există. 343 00:16:29,320 --> 00:16:32,400 Și același lucru este valabil pentru linia doua unde int este definit 344 00:16:32,400 --> 00:16:35,101 printf, care este o funcție păstrăm folosind destul de un pic. 345 00:16:35,101 --> 00:16:37,850 Acum, linia patru pare un pic funky, pentru ca este doar o linie singur. 346 00:16:37,850 --> 00:16:41,570 Are un punct și virgulă, nu buclat bretele, nici un cod în interiorul acestuia. 347 00:16:41,570 --> 00:16:44,640 Dar ce a făcut noi numim acest lucru în săptămâna trecut? 348 00:16:44,640 --> 00:16:45,140 Da. 349 00:16:45,140 --> 00:16:46,060 Deci, un prototip. 350 00:16:46,060 --> 00:16:48,390 Și de ce nu avem un prototip care pare 351 00:16:48,390 --> 00:16:51,050 pentru a fi un pic redundant de obicei pentru că, de obicei, ne-am 352 00:16:51,050 --> 00:16:53,474 vezi din nou funcția mai târziu, în dosar, nu? 353 00:16:53,474 --> 00:16:56,390 Deci, de ce ne have-- esti doar lamureste dar voi lua. 354 00:16:56,390 --> 00:16:57,302 Da. 355 00:16:57,302 --> 00:17:00,000 >> Audiența: [inaudibil] Funcția după principal. 356 00:17:00,000 --> 00:17:01,000 David J. MALAN: Exact. 357 00:17:01,000 --> 00:17:04,089 Astfel încât compilatorul vă cunoaște va defini în cele din urmă să pună în aplicare sau 358 00:17:04,089 --> 00:17:06,579 această funcție după principal, probabil. 359 00:17:06,579 --> 00:17:08,462 Deci, zăngănit și mai compilatoare sunt un fel de prost 360 00:17:08,462 --> 00:17:10,510 și vor ști numai ceea ce le spui. 361 00:17:10,510 --> 00:17:12,569 Și, dacă doriți să utilizați o funcție numită Sigma, 362 00:17:12,569 --> 00:17:15,710 mai bine invata compilatorul că există în avans. 363 00:17:15,710 --> 00:17:17,970 >> Acum, se principală, chiar deși este o grămadă de linii, 364 00:17:17,970 --> 00:17:19,839 este destul de familiar, sperăm, de acum. 365 00:17:19,839 --> 00:17:21,942 Are o face în timp ce buclă al cărei scop în viață 366 00:17:21,942 --> 00:17:24,400 aici se pare că este de a obtine o număr întreg pozitiv din partea utilizatorului. 367 00:17:24,400 --> 00:17:27,349 Și chiar a păstra bat la cap să-l sau ei până când cooperează. 368 00:17:27,349 --> 00:17:30,670 Apoi, în linie 16 am un apel interesant. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Care, pe mâna stângă parte îmi dă un Int 371 00:17:33,710 --> 00:17:36,650 care poate store-- numit Answer-- care va stoca, aparent, 372 00:17:36,650 --> 00:17:39,090 valoarea de returnare a sigma. 373 00:17:39,090 --> 00:17:41,840 Deci, Sigma este doar un Numele arbitrar dar semnificativ 374 00:17:41,840 --> 00:17:44,500 care l-am dat la o funcție al cărei scop în viață 375 00:17:44,500 --> 00:17:47,680 este de a lua un argument-- vom numi N în acest case-- 376 00:17:47,680 --> 00:17:52,280 și doar pentru a lua suma care numărul plus orice număr pozitiv care este 377 00:17:52,280 --> 00:17:53,200 mai mică decât aceasta. 378 00:17:53,200 --> 00:17:58,140 >> Deci, dacă am trece în numărul 2 a sigma, vreau să adăugați 2 plus 1 379 00:17:58,140 --> 00:18:00,240 plus 0-- nu 0-- astfel încât îmi dă 3. 380 00:18:00,240 --> 00:18:05,320 Dacă trec în 3 la sigma, vreau să au 3 plus 2 plus 1, care îmi dă 6. 381 00:18:05,320 --> 00:18:05,900 Si asa mai departe. 382 00:18:05,900 --> 00:18:09,750 Deci, doar adaugă Toate numere mai mici sau egale la acesta. 383 00:18:09,750 --> 00:18:12,040 >> Acum, aici Mă duc pentru a imprima răspunsul. 384 00:18:12,040 --> 00:18:17,330 Deci, ca o verificare rapidă bun-simț, să face sigma 0-- punct sigma slash 0-- 385 00:18:17,330 --> 00:18:18,690 și lasă-mă să tastați 2. 386 00:18:18,690 --> 00:18:19,960 Și într-adevăr mă 3. 387 00:18:19,960 --> 00:18:21,240 Lasă-mă să tastați în 3. 388 00:18:21,240 --> 00:18:22,860 Într-adevăr, mă 6. 389 00:18:22,860 --> 00:18:27,636 Și dacă cineva poate face matematica rapid, dacă fac 50 ce voi lua? 390 00:18:27,636 --> 00:18:29,839 >> Audiența: [neauzit]. 391 00:18:29,839 --> 00:18:30,880 David J. MALAN: Ei bine, nu. 392 00:18:30,880 --> 00:18:33,340 Dar 1275 care este destul de aproape. 393 00:18:33,340 --> 00:18:38,850 Deci acest lucru este rezultatul de a face 50 plus 49 plus 48, plus 47 plus 46 394 00:18:38,850 --> 00:18:40,349 tot drumul până la 1. 395 00:18:40,349 --> 00:18:41,390 Deci asta e tot sigma face. 396 00:18:41,390 --> 00:18:43,350 Dar să vedem cum ne-am implementat acum. 397 00:18:43,350 --> 00:18:45,790 Deci, aici este funcția în sine. 398 00:18:45,790 --> 00:18:49,000 Și acest lucru nu pare să aibă nimic de a face cu recursivitate încă. 399 00:18:49,000 --> 00:18:51,070 De fapt, suntem cu ajutorul unui Tehnica de școală veche. 400 00:18:51,070 --> 00:18:56,680 Am initializarea o sumă variabilă numită la zero, atunci am o foreloop aici, 401 00:18:56,680 --> 00:19:00,790 și eu sunt de declarare a unei Int numit I, stabilind că egală cu 1-- 402 00:19:00,790 --> 00:19:04,080 deși am putea stabili o egală cu zero, dar din moment ce fac plus, 403 00:19:04,080 --> 00:19:05,340 Cui îi pasă dacă e zero sau unu. 404 00:19:05,340 --> 00:19:06,660 Se va avea nici un efect. 405 00:19:06,660 --> 00:19:10,110 >> Deci, eu sunt iterarea atâta timp cât I este mai mică sau egală cu m, care 406 00:19:10,110 --> 00:19:11,671 este argumentul care a fost adoptată în. 407 00:19:11,671 --> 00:19:13,670 Și apoi am păstra incrementarea I. și înțelegere 408 00:19:13,670 --> 00:19:20,010 din bucla tot ce fac este de a face sumă plus este egal cu I. Și asta în mod deliberat. 409 00:19:20,010 --> 00:19:22,326 Nu vreau să fac, în acest caz, cum ar fi suma, plus, plus. 410 00:19:22,326 --> 00:19:24,790 Vreau să adăugați de fapt valoarea curentă a I 411 00:19:24,790 --> 00:19:28,190 care din ce în ce mai mare și mai mare și mai mare de a concordanța funcționare. 412 00:19:28,190 --> 00:19:30,210 >> Și apoi mă voi întoarce suma. 413 00:19:30,210 --> 00:19:33,850 Și astfel răspuns devine suma valorii. 414 00:19:33,850 --> 00:19:35,282 Și apoi l-am imprima. 415 00:19:35,282 --> 00:19:37,740 Deci, există o oportunitate aici, deși, la fel de a simplifica 416 00:19:37,740 --> 00:19:41,260 acest cod conceptual și tipul de lovitură un e 417 00:19:41,260 --> 00:19:43,250 minte în ceea ce privește simplitate, chiar dacă 418 00:19:43,250 --> 00:19:45,700 nevoie de un timp pentru a sorta a aprecia ce acest 419 00:19:45,700 --> 00:19:47,330 este puternic în aceste exemple mici. 420 00:19:47,330 --> 00:19:50,380 Iată sigma Unu, astfel încât a doua versiune a acestui cod. 421 00:19:50,380 --> 00:19:55,290 Totul de sus este identic atât de aceeași poveste se aplică la fel ca înainte. 422 00:19:55,290 --> 00:19:59,220 Dar acum să ne uităm la punerea în aplicare a sigma care 423 00:19:59,220 --> 00:20:05,040 Am diminuate până la doar acestea lines-- patru linii de cod, într-adevăr, 424 00:20:05,040 --> 00:20:06,980 plus unele acolade și spațiu alb. 425 00:20:06,980 --> 00:20:07,930 >> Dar ce fac? 426 00:20:07,930 --> 00:20:11,050 Dacă m este mai mică sau egală cu la zero, trebuie să se ocupe de un fel de 427 00:20:11,050 --> 00:20:12,490 acest caz super-simplu. 428 00:20:12,490 --> 00:20:15,450 Și dacă-mi dai zero sau nimic negativă care este doar ciudat, 429 00:20:15,450 --> 00:20:17,909 Mă duc la arbitrar dar în mod constant a reveni la zero. 430 00:20:17,909 --> 00:20:20,200 Nu vreau acest lucru să intra in unele infinit ciudat 431 00:20:20,200 --> 00:20:21,810 buclă din cauza unei valori negative. 432 00:20:21,810 --> 00:20:25,070 Deci, Spun doar că, dacă-mi dai zero sau mai puțin, mă întorc la zero. 433 00:20:25,070 --> 00:20:28,220 >> Dar asta e bine, pentru că este că singură pagină a cărții de telefon 434 00:20:28,220 --> 00:20:28,790 ce a mai rămas. 435 00:20:28,790 --> 00:20:32,660 Am mușcat o problemă foarte specifică și nu de asteptare ceva recursiv. 436 00:20:32,660 --> 00:20:36,580 Dar, în linie 31, ceea ce nu mi se pare a fi faci? 437 00:20:36,580 --> 00:20:39,780 Parantezele sunt doar păstrarea lucruri, sperăm, un pic mai clar. 438 00:20:39,780 --> 00:20:42,110 Dar tot ce fac este că sunt revenind M-- indiferent 439 00:20:42,110 --> 00:20:45,790 tu mana mine-- plus Valoarea de M-- Ne pare rău, 440 00:20:45,790 --> 00:20:49,052 plus valoarea Sigma a m minus 1. 441 00:20:49,052 --> 00:20:50,010 Deci, ce înseamnă asta? 442 00:20:50,010 --> 00:20:53,965 Dacă-mi dai numărul 3 ca intrare, răspunsul Vreau să ajung în cele din urmă 443 00:20:53,965 --> 00:20:57,307 este de 6 deoarece 3 plus 2, plus 1 mi dă 6. 444 00:20:57,307 --> 00:20:59,390 Dar cum mă gândesc modul în care acest cod se execută? 445 00:20:59,390 --> 00:21:03,070 Prima dată când am sun sigma și trec în valoarea de 3, 446 00:21:03,070 --> 00:21:07,960 asta e cum ai spune pe o bucata de hârtie, aici e valoarea 3 447 00:21:07,960 --> 00:21:09,920 și am fost trecut de acest lucru ca pe sigma. 448 00:21:09,920 --> 00:21:13,090 3 este, evident, nu mai puțin de 0, astfel condiția dacă nu se aplică. 449 00:21:13,090 --> 00:21:14,020 Else face. 450 00:21:14,020 --> 00:21:14,990 Deci, ce să fac? 451 00:21:14,990 --> 00:21:19,902 Vreau să se întoarcă m, care este 3, plus sigma de m minus 1. 452 00:21:19,902 --> 00:21:21,110 Deci, să-mi urmări acest lucru. 453 00:21:21,110 --> 00:21:22,710 Am de gând să pun această bucată de hârtie în jos. 454 00:21:22,710 --> 00:21:24,668 Și ce valoare, pentru a fi clar, am de gând să treacă 455 00:21:24,668 --> 00:21:26,540 în sigma în acest moment în povestea? 456 00:21:26,540 --> 00:21:28,080 Ce număr? 457 00:21:28,080 --> 00:21:28,610 2, nu? 458 00:21:28,610 --> 00:21:29,670 3 minus 1 este 2. 459 00:21:29,670 --> 00:21:32,000 Așa că am nevoie de un pic de resturi de hârtie aici. 460 00:21:32,000 --> 00:21:33,931 Deci, acum sigma este obtinerea sunat din nou. 461 00:21:33,931 --> 00:21:35,930 Și am pus în mod deliberat acest jos pentru că este 462 00:21:35,930 --> 00:21:38,070 un fel de pauză această versiune a poveștii 463 00:21:38,070 --> 00:21:40,720 pentru că acum sunt concentrat pe semnalul de m minus 1. 464 00:21:40,720 --> 00:21:42,660 Deci m era 3, m minus 1 este 2. 465 00:21:42,660 --> 00:21:45,110 Deci, aici este de 2 că am fost trecut. 466 00:21:45,110 --> 00:21:48,510 2 este, evident, nu mai puțin de 0 astfel acest caz nu se aplică. 467 00:21:48,510 --> 00:21:53,445 Altceva am reveni m, care este acest lucru, plus sigma de ce valoare? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Deci, dacă sigma de 1-- deoarece m este acum 2 SO 2 minus 1 este 1. 470 00:21:59,650 --> 00:22:01,950 Deci, acum am doar valoarea 1. 471 00:22:01,950 --> 00:22:04,810 Eu trece doar numărul 1 la funcția sigma-- 472 00:22:04,810 --> 00:22:09,120 sau mă here-- așa 1 nu este, evident, mai mică decât zero, încă nu se aplică. 473 00:22:09,120 --> 00:22:12,970 >> Întoarcere altceva 1 plus sigma de ce? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Deci, permiteți-mi să amintesc doar că. 476 00:22:14,678 --> 00:22:15,920 Voi reveni la asta mai târziu. 477 00:22:15,920 --> 00:22:18,060 Acum am de gând să merg mai departe și iotă jos numărul 0 pentru că asta e 478 00:22:18,060 --> 00:22:19,470 argument sau parametru meu. 479 00:22:19,470 --> 00:22:22,400 Am trecut numărul 0 și, în final acest proces 480 00:22:22,400 --> 00:22:25,760 de doar repeta mine anunț nauseum nu încetează pentru că ceea ce 481 00:22:25,760 --> 00:22:28,820 fac imediat ce văd acest lucru 0? 482 00:22:28,820 --> 00:22:29,790 Mă întorc la zero. 483 00:22:29,790 --> 00:22:31,790 Deci, acum trebuie să înapoi povestea. 484 00:22:31,790 --> 00:22:34,430 >> Dacă acum mă duc înapoi în timp, ceea ce a fost cel mai recent lucru 485 00:22:34,430 --> 00:22:36,670 Am făcut dacă ai fi fost literalmente rebobinare un videoclip? 486 00:22:36,670 --> 00:22:41,630 Am de gând să ridic cele mai recente 1 și care îmi dă un plus 0 este 1. 487 00:22:41,630 --> 00:22:44,100 Dacă am păstra rebobinarea poveste, care va să-mi dea 488 00:22:44,100 --> 00:22:46,880 2 plus această valoare de funcționare, care este de 1. 489 00:22:46,880 --> 00:22:47,789 Așa că e 3. 490 00:22:47,789 --> 00:22:49,330 Și apoi am de gând să păstreze rebobinare. 491 00:22:49,330 --> 00:22:54,220 Când am pus prima jos numărul 3-- astfel 3 plus 3 îmi dă 6. 492 00:22:54,220 --> 00:22:57,272 >> Și acum, dacă ați rebobinat video până în acest moment, 493 00:22:57,272 --> 00:22:58,980 acest lucru a fost foarte prima întrebare am întrebat. 494 00:22:58,980 --> 00:23:01,450 Când a trecut 3, ceea ce este sigma de 3? 495 00:23:01,450 --> 00:23:04,204 E într-adevăr 6, suma de toate aceste bucăți de hârtie. 496 00:23:04,204 --> 00:23:07,120 Deci, dacă faptul că nevoie de un pic de timp pentru înfășurați în jurul valorii de mintea ta, e în regulă. 497 00:23:07,120 --> 00:23:10,700 Dar consideră că a fost un little-- ea a fost foarte deliberat ca am stivuite 498 00:23:10,700 --> 00:23:12,990 aceste numere pe partea de sus a reciproc. 499 00:23:12,990 --> 00:23:17,440 E un fel de a avea un memory-- un record în timp, 500 00:23:17,440 --> 00:23:19,940 ca un scruber într-un videoclip, că pot derula într-adevăr, în. 501 00:23:19,940 --> 00:23:24,350 Și ne vom întoarce la că metafora în doar un pic. 502 00:23:24,350 --> 00:23:28,240 >> Dar mai întâi, se pare că nu există o mulțime de geeks si oameni amuzant, 503 00:23:28,240 --> 00:23:29,614 Cred că, la Google. 504 00:23:29,614 --> 00:23:31,530 Ar fi cineva care e foarte bun la minte Googling 505 00:23:31,530 --> 00:23:34,270 vine doar pentru un moment și ajută-mă căuta ceva? 506 00:23:34,270 --> 00:23:35,650 Foarte, cheie foarte scăzut. 507 00:23:35,650 --> 00:23:37,870 Cineva care nu e veni înainte, poate. 508 00:23:37,870 --> 00:23:38,370 BINE. 509 00:23:38,370 --> 00:23:39,030 Da? 510 00:23:39,030 --> 00:23:39,530 Haide. 511 00:23:39,530 --> 00:23:41,410 Haide jos. 512 00:23:41,410 --> 00:23:42,183 Care e numele tău? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> David J. MALAN: Sam, haide jos. 515 00:23:44,290 --> 00:23:45,320 Aceasta este același. 516 00:23:45,320 --> 00:23:46,280 Îmi pare bine să te cunosc. 517 00:23:46,280 --> 00:23:46,780 Hei. 518 00:23:46,780 --> 00:23:47,580 Vino pe aici. 519 00:23:47,580 --> 00:23:51,290 Deci, tot ce trebuie să faci, dacă ai putea, Sam, aici e Google. 520 00:23:51,290 --> 00:23:53,240 Poți căuta recursivitatea termen? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Nu strica. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> Și acum let's-- da. 525 00:24:00,970 --> 00:24:03,380 OK Faceți clic pe asta. 526 00:24:03,380 --> 00:24:04,315 Mai bine faceți clic pe asta. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ah, înțeleg. 529 00:24:08,020 --> 00:24:08,520 Nu? 530 00:24:08,520 --> 00:24:09,050 BINE. 531 00:24:09,050 --> 00:24:10,430 Deci, hai sa facem un cuplu alții. 532 00:24:10,430 --> 00:24:12,830 Nu atât de mult legate de academic aici, dar trebuie 533 00:24:12,830 --> 00:24:14,520 cautat vreodata Google pentru anagramă? 534 00:24:14,520 --> 00:24:15,280 >> SAM: Nu. 535 00:24:15,280 --> 00:24:15,520 >> David J. MALAN: OK. 536 00:24:15,520 --> 00:24:17,186 Căutați anagrama loc de recursivitate. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Cum despre strâmb. 539 00:24:23,790 --> 00:24:25,515 Ati cautat vreodata pentru strâmb? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Acum, asta e un pic cam greu de vezi dar sperăm everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 E doar tu și cu mine se bucură de acest lucru. 543 00:24:34,150 --> 00:24:34,690 BINE. 544 00:24:34,690 --> 00:24:38,950 >> Deci, în final, acest one's-- e un pic strâmb. 545 00:24:38,950 --> 00:24:40,810 Acum face o rola baril. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Minunat. 548 00:24:45,310 --> 00:24:45,910 In regula. 549 00:24:45,910 --> 00:24:47,110 Mare vă mulțumesc pentru Sam. 550 00:24:47,110 --> 00:24:49,416 Poftim. 551 00:24:49,416 --> 00:24:50,400 Mulțumesc. 552 00:24:50,400 --> 00:24:52,807 >> Deci, ce se întâmplă în toate din aceste exemple stupide? 553 00:24:52,807 --> 00:24:55,640 Deci într-adevăr, sub capota de Milioane Google de linii de cod 554 00:24:55,640 --> 00:24:58,860 aparent este o prostie câteva IF condiții care sunt, în esență, 555 00:24:58,860 --> 00:25:01,160 a verifica dacă utilizatorul are scris în această frază, 556 00:25:01,160 --> 00:25:03,760 face ceva care, probabil, a avut o sumă trivial de timp 557 00:25:03,760 --> 00:25:06,080 să pună în aplicare doar la fie amuzant în acest fel. 558 00:25:06,080 --> 00:25:08,430 Dar asta e tot ce se reduce până la sub capota. 559 00:25:08,430 --> 00:25:11,570 Dar, desigur, recursivitate este mai de geekier 560 00:25:11,570 --> 00:25:13,880 exemplu printre aceste trucuri speciale. 561 00:25:13,880 --> 00:25:16,880 Și cu siguranță nu e alții acolo precum și că, probabil, nu au nici 562 00:25:16,880 --> 00:25:18,230 descoperit încă. 563 00:25:18,230 --> 00:25:22,830 >> Astfel încât să ia o privire, sau ia în considerare acum programul următor, 564 00:25:22,830 --> 00:25:24,830 și cu siguranță apuca orice dintre acestea pe calea ta afară. 565 00:25:24,830 --> 00:25:28,820 Am de gând să merg mai departe și deschide un program care este 566 00:25:28,820 --> 00:25:30,920 O să încerc să schimb două valori. 567 00:25:30,920 --> 00:25:33,210 Dar, înainte de mergem acolo, să facem acest lucru. 568 00:25:33,210 --> 00:25:38,500 Am putea obține o mai voluntar, cred? 569 00:25:38,500 --> 00:25:40,480 Doriți să voluntar? 570 00:25:40,480 --> 00:25:40,980 Nu? 571 00:25:40,980 --> 00:25:41,890 Haide sus. 572 00:25:41,890 --> 00:25:42,390 Haide sus. 573 00:25:42,390 --> 00:25:42,890 In regula. 574 00:25:42,890 --> 00:25:44,136 Deci, numele tău este ceea ce? 575 00:25:44,136 --> 00:25:44,810 >> LAUREN: Lauren. 576 00:25:44,810 --> 00:25:45,768 >> David J. MALAN: Lauren. 577 00:25:45,768 --> 00:25:46,890 Hai sus, Lauren. 578 00:25:46,890 --> 00:25:50,140 Deci, Lauren este în curs de contestat aici, după cum urmează. 579 00:25:50,140 --> 00:25:52,310 Îmi pare bine să te cunosc. 580 00:25:52,310 --> 00:25:55,730 Deci, Lauren are aici, în fața de cei doi cupe goale. 581 00:25:55,730 --> 00:25:57,570 Și avem niște portocale suc și lapte 582 00:25:57,570 --> 00:26:00,301 și vom merge înainte și de a face următoarele. 583 00:26:00,301 --> 00:26:01,550 Noi doar o să umple acest lucru. 584 00:26:01,550 --> 00:26:07,840 Câteva uncii de lapte aici și să umple un suc de portocale pic aici. 585 00:26:07,840 --> 00:26:11,475 >> Și în fața tuturor acești membri audiență, 586 00:26:11,475 --> 00:26:13,550 schimba cele două valori ale acestor cupe. 587 00:26:13,550 --> 00:26:16,970 Pune sucul de portocale în cana de lapte și laptele în cupa suc de portocale. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Cum ați face acest lucru, dacă ai fost la acasă și au avut acces la alte bunuri? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Pune-l într-o altă ceașcă. 591 00:26:27,400 --> 00:26:28,191 David J. MALAN: OK. 592 00:26:28,191 --> 00:26:31,940 Deci, haideți să aruncăm o temporar variabilă, dacă o vom face. 593 00:26:31,940 --> 00:26:35,871 Și merge mai departe acum și punerea în aplicare această procedură pompare aceeași. 594 00:26:35,871 --> 00:26:36,370 Asa de bine. 595 00:26:36,370 --> 00:26:41,490 Ne-am pus în JO temporar variabilă, laptele în JO variabila, 596 00:26:41,490 --> 00:26:44,481 iar acum variabila temporară în variabila lapte. 597 00:26:44,481 --> 00:26:44,980 BINE. 598 00:26:44,980 --> 00:26:48,740 Deci, foarte bine făcut până acum. 599 00:26:48,740 --> 00:26:50,990 Deci, se dovedește că out-- țineți gândit pentru o clipă. 600 00:26:50,990 --> 00:26:54,479 Aici, la doar un pic tocilar, acest ar fi codul C corespunzător 601 00:26:54,479 --> 00:26:55,520 că ne-am pus în aplicare. 602 00:26:55,520 --> 00:26:58,650 Am avut două intrări, A și B, ambele care vom spune doar pentru simplitate sunt 603 00:26:58,650 --> 00:26:59,260 lui Int. 604 00:26:59,260 --> 00:27:02,780 Și observați aici, dacă vreau să schimb valorile două variabile, a și b, 605 00:27:02,780 --> 00:27:06,890 într-adevăr avem nevoie de un intermediar, un variabilă temporară, o ceașcă temporar, 606 00:27:06,890 --> 00:27:10,830 în care turnarea una dintre valorile astfel încât să avem un înlocuitor pentru ea. 607 00:27:10,830 --> 00:27:13,480 Dar apoi codul este exact ca Lauren aici implementate. 608 00:27:13,480 --> 00:27:15,500 >> Acum, doar pentru a obține o puțin mai nebun, se dovedește 609 00:27:15,500 --> 00:27:20,930 pe care le puteți face acest lucru fără o variabilă temporară. 610 00:27:20,930 --> 00:27:24,870 Pentru a face acest lucru în mod corespunzător, deși, vom să aibă de a trișa cu unele chimie. 611 00:27:24,870 --> 00:27:26,380 Avem câteva cupe plus aici. 612 00:27:26,380 --> 00:27:29,600 Deci cel mai apropiat lucru care arată ca lapte și apă perhaps-- 613 00:27:29,600 --> 00:27:34,090 sau lapte și OJ-- este avem o apă, așa că vom umple asta până 614 00:27:34,090 --> 00:27:36,486 cu câteva uncii de apă limpede. 615 00:27:36,486 --> 00:27:38,332 Asta e, probabil, prea mult. 616 00:27:38,332 --> 00:27:38,832 Da. 617 00:27:38,832 --> 00:27:39,934 Asta e cu siguranță prea mult. 618 00:27:39,934 --> 00:27:40,600 Stai o secundă. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> Și acum avem petrol, care, după cum îmi amintesc din clasa de mijloc de chimie școală, 621 00:27:48,420 --> 00:27:49,990 sperăm că nu se amesteca cu apa. 622 00:27:49,990 --> 00:27:53,650 Dar un fel de fel de arata ca laptele și JO. 623 00:27:53,650 --> 00:27:55,760 Deci, acum, fără a utiliza o variabilă temporară, 624 00:27:55,760 --> 00:27:59,260 puteți schimba aceste două valori? 625 00:27:59,260 --> 00:28:03,884 Deci, uleiuri merge în ceașcă de apă, apa merge în ceașcă de ulei. 626 00:28:03,884 --> 00:28:04,800 LAUREN: Nici un alt cupe? 627 00:28:04,800 --> 00:28:05,940 David J. MALAN: Nici un alt cupe. 628 00:28:05,940 --> 00:28:07,860 Și nu am de fapt eu testat aceasta înainte de acest an 629 00:28:07,860 --> 00:28:10,110 așa că nu știu dacă acest lucru va fi de fapt locul de muncă chimic. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Asta nu trebuia să se întâmple. 632 00:28:18,650 --> 00:28:19,761 Functioneaza? 633 00:28:19,761 --> 00:28:20,260 In regula. 634 00:28:20,260 --> 00:28:20,990 Deci separare? 635 00:28:20,990 --> 00:28:21,490 Bine. 636 00:28:21,490 --> 00:28:24,714 Acum am ajuns pentru a obține apă în cealaltă cupa. 637 00:28:24,714 --> 00:28:27,630 Concentratoare chimie inteligente ar putea probabil face acest lucru mai bine decât mine. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: Apa este pe partea de jos. 639 00:28:28,510 --> 00:28:31,910 >> David J. MALAN: a water-- care a fost ceea ce este esențial ultima dată când am făcut asta. 640 00:28:31,910 --> 00:28:33,950 Trebuie să o fac în ordinea corectă. 641 00:28:33,950 --> 00:28:34,450 Da. 642 00:28:34,450 --> 00:28:35,270 Asta e ok. 643 00:28:35,270 --> 00:28:37,290 Deci, acum avem două cești de ulei. 644 00:28:37,290 --> 00:28:37,790 BINE. 645 00:28:37,790 --> 00:28:38,510 Asta e ok. 646 00:28:38,510 --> 00:28:40,110 Dar chimic dacă aceasta a lucrat mult Eu-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: Aceasta este apa. 648 00:28:41,200 --> 00:28:41,930 >> David J. MALAN: Asta-i cea mai mare parte de apă. 649 00:28:41,930 --> 00:28:42,430 In regula. 650 00:28:42,430 --> 00:28:44,210 Dar asta e încă același pahar ca înainte. 651 00:28:44,210 --> 00:28:47,570 Deci, se toarnă it-- încerca acolo. 652 00:28:47,570 --> 00:28:49,300 BINE. 653 00:28:49,300 --> 00:28:51,010 Aceasta este o buna utilizare a timpului de clasă astăzi. 654 00:28:51,010 --> 00:28:51,510 BINE. 655 00:28:51,510 --> 00:28:53,890 Deci, acum we-- frumos. 656 00:28:53,890 --> 00:28:55,460 Un fel de. 657 00:28:55,460 --> 00:28:55,960 In regula. 658 00:28:55,960 --> 00:28:56,690 Deci, foarte bun. 659 00:28:56,690 --> 00:29:00,006 Vă mulțumesc pentru Lauren. 660 00:29:00,006 --> 00:29:01,950 Foarte bine facut. 661 00:29:01,950 --> 00:29:04,570 >> Deci, doar pentru a sufla mintea voastră, și aceasta este, probabil, ceva 662 00:29:04,570 --> 00:29:08,660 să se joace cu, dacă doriți în CS50 ID, puteți, de fapt, schimba două variabile 663 00:29:08,660 --> 00:29:11,470 fără a utiliza un număr întreg temporară. 664 00:29:11,470 --> 00:29:13,060 Și aceasta este codul C corespunzător. 665 00:29:13,060 --> 00:29:16,110 Și dacă vă amintiți de la ultima Miercuri, am introdus, în cazul în care pe scurt, 666 00:29:16,110 --> 00:29:19,720 unor noi operatori în C și nu oricine amintesc ce mic morcov 667 00:29:19,720 --> 00:29:23,660 simbol este, că puțin triunghiular simbol de la tastatură reprezintă? 668 00:29:23,660 --> 00:29:26,003 Ce nivel de bit operatorul? 669 00:29:26,003 --> 00:29:26,770 >> Audiența: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> David J. MALAN: EXOR. 671 00:29:27,645 --> 00:29:28,560 Exclusive sau. 672 00:29:28,560 --> 00:29:32,920 Deci, dacă doriți, doar pentru distracție la acasă, pentru a da un și b două arbitrară 673 00:29:32,920 --> 00:29:36,072 valori ca orice eight-- și eu ar alege o valoare de opt biți. 674 00:29:36,072 --> 00:29:38,530 Dacă veți face acest lucru cu 32 de biți, veți obține foarte repede plictisit. 675 00:29:38,530 --> 00:29:42,150 Dar da doar un pic de opt valoare care este orice, unul sau doi, 676 00:29:42,150 --> 00:29:43,790 și să dea b o valoare similară. 677 00:29:43,790 --> 00:29:46,810 Și apoi folosind definiția de XOR din miercurea trecută, 678 00:29:46,810 --> 00:29:52,560 aplică că puțin câte puțin, fiecare dintre aceste opt biți în fiecare dintre a și b, 679 00:29:52,560 --> 00:29:54,980 și apoi face exact pe acest cod. 680 00:29:54,980 --> 00:29:58,170 Și nu e incorect ceea ce vedeți aici pe ecran. 681 00:29:58,170 --> 00:30:02,100 Aceasta, într-adevăr se reduce la trei operațiuni de XOR 682 00:30:02,100 --> 00:30:05,910 și într-un fel magic o și b va schimba pozițiile 683 00:30:05,910 --> 00:30:08,010 fără a pierde nici o informație. 684 00:30:08,010 --> 00:30:11,580 >> Deci truc ulei și apă este Cel mai apropiat reală incarnare lumea 685 00:30:11,580 --> 00:30:12,980 Am putut gândi a imita acest lucru. 686 00:30:12,980 --> 00:30:15,950 Dar e sigur mai ușor să utiliza o variabilă temporară, 687 00:30:15,950 --> 00:30:16,920 ca în acest caz aici. 688 00:30:16,920 --> 00:30:21,190 Și acest lucru este prea spune o oportunitate, de asemenea, acest tip de optimizare micro, 689 00:30:21,190 --> 00:30:23,590 ca un om de stiinta de calculator ar spune, în timp ce un fel de distracție 690 00:30:23,590 --> 00:30:27,060 să se laude despre cum ai făcut asta fără ca schimbarea cu o variabilă în plus, 691 00:30:27,060 --> 00:30:28,640 nu e tot ce convingătoare. 692 00:30:28,640 --> 00:30:31,619 Deoarece pentru a salva 32 de biți, ar fi în cazul int real, 693 00:30:31,619 --> 00:30:33,410 nu este tot ceea ce convingătoare pe un sistem unde 694 00:30:33,410 --> 00:30:36,722 s-ar putea folosi zeci de megabytes sau chiar mai mult, cum ar memorie în aceste zile. 695 00:30:36,722 --> 00:30:38,680 Și, de fapt, când ajungem la un set de probleme mai târziu 696 00:30:38,680 --> 00:30:41,010 și să pună în aplicare vraja te verificatorul și veți 697 00:30:41,010 --> 00:30:43,550 fi invitați să facă acest lucru cu acest cât mai puțin RAM și cât mai puțin 698 00:30:43,550 --> 00:30:46,820 timp posibil cu privire la te computer-- încă 699 00:30:46,820 --> 00:30:50,160 au o săptămână pentru a pune în aplicare it-- vei have-- vei 700 00:30:50,160 --> 00:30:51,799 contestat pentru a minimiza aceste resurse. 701 00:30:51,799 --> 00:30:53,840 Și că este într-adevăr singura prilejui acest semestru 702 00:30:53,840 --> 00:30:57,940 în cazul în care veți fi încurajați să-și radă off chiar cel mai bun performanța 703 00:30:57,940 --> 00:30:59,340 Costuri în caz contrar. 704 00:30:59,340 --> 00:31:02,200 >> Deci, cum putem what-- vedea acest lucru în codul actual? 705 00:31:02,200 --> 00:31:04,530 Lasă-mă să merg mai departe acum și deschide un exemplu 706 00:31:04,530 --> 00:31:07,700 care în mod deliberat se numeste Nu Swap pentru că nu 707 00:31:07,700 --> 00:31:10,670 De fapt, schimba variabilele ca de fapt s-ar putea aștepta. 708 00:31:10,670 --> 00:31:12,260 Deci, haideți să aruncăm o privire. 709 00:31:12,260 --> 00:31:17,050 Iata un program care nu are nici o CS50 Biblioteca întâmplă, eu doar standardul / O. 710 00:31:17,050 --> 00:31:19,560 Acum avem un prototip pentru schimb până sus care tocmai 711 00:31:19,560 --> 00:31:21,540 înseamnă că Trebuie să fie definite mai târziu. 712 00:31:21,540 --> 00:31:22,550 Și aici e principala. 713 00:31:22,550 --> 00:31:26,000 >> Am alocat arbitrar x și y, respectiv, cea valori și doi 714 00:31:26,000 --> 00:31:28,590 doar pentru că sunt mici și ușor să se gândească. 715 00:31:28,590 --> 00:31:32,280 Și apoi doar am o grămadă de printfs în cazul în care am o verificare bun-simț. x este 1 716 00:31:32,280 --> 00:31:35,110 și y este 2 este probabil ceea ce aceste printfs va spune. 717 00:31:35,110 --> 00:31:36,530 Deci, nici o magie până acum. 718 00:31:36,530 --> 00:31:40,100 >> Apoi am de gând să susțin cu imprima def, schimbarea punct punct punct. 719 00:31:40,100 --> 00:31:43,730 Am de gând să apela swap funcția, trecând în x și y. 720 00:31:43,730 --> 00:31:47,350 Și să presupunem că pentru moment de swap este implementat exact 721 00:31:47,350 --> 00:31:49,930 așa cum a fost acum un moment cu o variabilă temporară. 722 00:31:49,930 --> 00:31:52,670 Și așa am pretind cu îndrăzneală, schimbat. 723 00:31:52,670 --> 00:31:55,429 X este acum acest lucru și y este acum asta. 724 00:31:55,429 --> 00:31:57,220 Dar fișierul, desigur, se numeste Nu Swap. 725 00:31:57,220 --> 00:31:58,678 Deci, haideți să vedem ce se întâmplă de fapt. 726 00:31:58,678 --> 00:32:04,450 Dacă am compila nu de swap și apoi face ./noswap, X este 1, Y este 2. 727 00:32:04,450 --> 00:32:05,770 Schimbarea schimbat. 728 00:32:05,770 --> 00:32:07,200 x este 1, y este 2. 729 00:32:07,200 --> 00:32:11,980 Deci, este de fapt pare a fi greșită, chiar deși swap-- să derulați în jos now-- 730 00:32:11,980 --> 00:32:16,542 este pus în aplicare exact conform Codul am propus acum un moment. 731 00:32:16,542 --> 00:32:19,000 Deci nu mergi la a lua de lux cu chestii XOR pentru acum. 732 00:32:19,000 --> 00:32:21,890 Aceasta, de asemenea, ar trebui să funcționeze doar ca și cu lapte și JO, 733 00:32:21,890 --> 00:32:25,820 dar nu pare a fi de lucru. 734 00:32:25,820 --> 00:32:27,180 >> Deci, hai sa facem asta din nou. 735 00:32:27,180 --> 00:32:29,310 Poate că pur și simplu nu-i așa difuzate corect. 736 00:32:29,310 --> 00:32:32,010 Deci, haideți să executați din nou Nu Swap. 737 00:32:32,010 --> 00:32:32,900 Poate Eu-- nr. 738 00:32:32,900 --> 00:32:34,400 Deci, e doar nu de lucru. 739 00:32:34,400 --> 00:32:36,060 Deci, hai sa facem o verificare bun-simț pic. 740 00:32:36,060 --> 00:32:39,690 Lasă-mă să merg mai departe aici, în Swap și trebuie doar să adăugați, așteptați un minut, 741 00:32:39,690 --> 00:32:43,856 a este% i / n și să plug-in valoarea unui. 742 00:32:43,856 --> 00:32:45,730 Pentru că vreau într-adevăr pentru a vedea ce se întâmplă. 743 00:32:45,730 --> 00:32:47,570 Și într-adevăr, acest lucru este o tehnica de depanare 744 00:32:47,570 --> 00:32:50,028 că ați putea fi utilizați în ore birou sau acasă, deja 745 00:32:50,028 --> 00:32:53,560 înrudită cu prima jumătate a lui Dan Video de Armendariz în PSET3 746 00:32:53,560 --> 00:32:56,870 în care am introdus imprimare def ca o tehnică recomandată, cel puțin 747 00:32:56,870 --> 00:32:58,080 pentru cazuri simple. 748 00:32:58,080 --> 00:33:01,720 Lasă-mă să mergeți mai departe și a alerga să nu de swap din nou, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Interesant. 751 00:33:05,840 --> 00:33:11,670 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. 752 00:33:11,670 --> 00:33:16,790 Deci, cei doi într-un fel s-au schimbat dar x și y nu sunt obtinerea schimbate. 753 00:33:16,790 --> 00:33:21,090 Deci, să fie clar, ce se întâmplă este, aici am x și y 754 00:33:21,090 --> 00:33:25,380 și acestea sunt variabile locale în Domeniul de aplicare al principal, am trece în x și y 755 00:33:25,380 --> 00:33:26,170 a schimba. 756 00:33:26,170 --> 00:33:29,080 Acum, schimb, ca o funcție separată, este liber de a apela argumentele sale 757 00:33:29,080 --> 00:33:30,590 sau parametrii orice vrea. 758 00:33:30,590 --> 00:33:33,280 Foo sau bar sau x sau y sau a sau b. 759 00:33:33,280 --> 00:33:36,870 Doar pentru a face clar faptul că acestea sunt nu sunt identice cu x și y în sine, 760 00:33:36,870 --> 00:33:38,020 Am spus-o și b. 761 00:33:38,020 --> 00:33:40,040 Dar am putea le numim orice vrem. 762 00:33:40,040 --> 00:33:43,960 >> Și așa se pare ca de swap este trecut 763 00:33:43,960 --> 00:33:48,980 X- AKA un-- și este fiind trecut y-- AKA b. 764 00:33:48,980 --> 00:33:51,900 Cumva aceste trei linii sunt schimbarea acestor valori exact 765 00:33:51,900 --> 00:33:53,510 așa cum a făcut Lauren cu laptele și JO. 766 00:33:53,510 --> 00:33:56,010 Dar când am imprima valorile, o și b 767 00:33:56,010 --> 00:34:01,340 sunt într-adevăr, dar schimb X și Y au nici o schimbare pentru ei. 768 00:34:01,340 --> 00:34:03,150 Amintiți-vă că x și y sunt aici. 769 00:34:03,150 --> 00:34:05,320 >> Astfel încât să putem vedea acest lucru prin intermediul O alta tehnica de asemenea. 770 00:34:05,320 --> 00:34:08,110 Și aceasta este de asemenea o tehnică încorporate în problema set de trei. 771 00:34:08,110 --> 00:34:10,780 Să mergem mai departe și să facă acest lucru în CS50 ID dacă nu ați făcut deja. 772 00:34:10,780 --> 00:34:13,730 Pe partea dreaptă WE au această filă Debugger. 773 00:34:13,730 --> 00:34:16,159 Și dacă deschideți asta, există unele informații arcane 774 00:34:16,159 --> 00:34:17,530 care este aruncat la tine inițial. 775 00:34:17,530 --> 00:34:19,310 Dar să tachineze acest afară foarte repede. 776 00:34:19,310 --> 00:34:21,620 >> Deci unul, vedeți variabile locale. 777 00:34:21,620 --> 00:34:26,230 Se pare că construi în IDE CS50, și o mulțime de medii de programare mai 778 00:34:26,230 --> 00:34:28,060 în general, este un debugger. 779 00:34:28,060 --> 00:34:31,340 Un instrument care vă permite să vedeți vizual ce se întâmplă în interiorul a programului 780 00:34:31,340 --> 00:34:34,380 fără a fi nevoie să recurgă la adăugarea printfs și compilarea și rularea 781 00:34:34,380 --> 00:34:37,588 și adăugarea printf și compilarea și funcționare, care deja, în ore de birou 782 00:34:37,588 --> 00:34:40,070 sau de origine, este, probabil, obtinerea destul de plictisitor. 783 00:34:40,070 --> 00:34:43,090 >> Deci, aici, în doar un moment, suntem va pentru a vedea în timp real 784 00:34:43,090 --> 00:34:44,760 valorile variabilelor noastre locale. 785 00:34:44,760 --> 00:34:47,880 Vom de asemenea, va fi în măsură să stabilească ceea ce se numesc puncte de întrerupere, care 786 00:34:47,880 --> 00:34:52,570 oportunități în programul meu pentru a întrerupe execuție la o linie specifică de cod 787 00:34:52,570 --> 00:34:53,710 că sunt curiosi. 788 00:34:53,710 --> 00:34:54,210 Dreapta? 789 00:34:54,210 --> 00:34:55,969 Aceste programe rula in o fracțiune de secundă. 790 00:34:55,969 --> 00:35:00,450 E un fel de frumos pentru noi, oamenii, mai lent pentru a putea întrerupe, ia un moment, a se vedea 791 00:35:00,450 --> 00:35:02,380 ce se întâmplă în jurul o anumită linie de cod 792 00:35:02,380 --> 00:35:05,050 fără aratura programului prin ea și finisare în întregime. 793 00:35:05,050 --> 00:35:08,510 Deci, un puncte de întrerupere să ne permite să rupe si pauză la un moment dat. 794 00:35:08,510 --> 00:35:12,990 >> Stiva de apel este un mod fantezist de spune ce funcții sunt în prezent 795 00:35:12,990 --> 00:35:14,140 fiind numit în acest moment. 796 00:35:14,140 --> 00:35:15,370 Principal este numit întotdeauna pe primul loc. 797 00:35:15,370 --> 00:35:17,230 Dar dacă principal solicită o functie numita Swap, 798 00:35:17,230 --> 00:35:20,470 ne de fapt de gând să privească acest turn de funcții care au fost 799 00:35:20,470 --> 00:35:22,400 în ordine cronologică inversă. 800 00:35:22,400 --> 00:35:23,310 Deci, haideți să vedem asta. 801 00:35:23,310 --> 00:35:24,327 >> Am de gând pentru a micșora. 802 00:35:24,327 --> 00:35:25,660 Am de gând să mă întorc la codul meu. 803 00:35:25,660 --> 00:35:27,540 Și doar pentru că vreau să fie pedant aici, 804 00:35:27,540 --> 00:35:31,100 Am de gând să mergeți mai departe și faceți clic pe doar la stânga liniei cinci. 805 00:35:31,100 --> 00:35:32,830 Și care creează un punct roșu. 806 00:35:32,830 --> 00:35:36,200 Și observați pe partea dreaptă că debugger știe, hei, 807 00:35:36,200 --> 00:35:41,020 Tocmai am spus un punct de întrerupere la linie noswap.c cinci, în special 808 00:35:41,020 --> 00:35:42,480 la această linie de cod. 809 00:35:42,480 --> 00:35:45,090 Deci, debugger știe că eu au solicitat ca data viitoare 810 00:35:45,090 --> 00:35:48,530 Am rulat mea program de pauză execuție există mai degrabă decât doar 811 00:35:48,530 --> 00:35:50,390 rulează totul super rapid. 812 00:35:50,390 --> 00:35:53,889 >> Asa ca acum am de gând să faceți clic pe Debug buton în partea superioară a IDE 813 00:35:53,889 --> 00:35:55,430 și că va face următoarele. 814 00:35:55,430 --> 00:36:00,680 Se va deschide o inițial oarecum infricosator caută al doilea terminal window-- 815 00:36:00,680 --> 00:36:02,679 depanarea la distanță de la gazdă și astfel such-- 816 00:36:02,679 --> 00:36:04,970 și vom reveni la ceea ce tot ceea ce înseamnă înainte de mult timp. 817 00:36:04,970 --> 00:36:09,020 Dar ceea ce este important pentru acum este că această red dot a fost lovit, 818 00:36:09,020 --> 00:36:11,735 debugger are în mod deliberat pauză execution-- 819 00:36:11,735 --> 00:36:15,560 nu pe linia în sine, ci pe primul linie de cod real în această funcție. 820 00:36:15,560 --> 00:36:18,040 Și de aceea este linia de șapte acum evidențiate în galben. 821 00:36:18,040 --> 00:36:20,550 >> Și acum să aruncăm o privire la dreapta. 822 00:36:20,550 --> 00:36:27,300 Se pare ca, în mod implicit, destul de frumos, x are ce valoare? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 Și y are ce valoare? 825 00:36:29,750 --> 00:36:30,410 Zero. 826 00:36:30,410 --> 00:36:35,540 Și asta e de așteptat, în sensul că X și y-- care line-- galben are 827 00:36:35,540 --> 00:36:36,770 nu executat încă. 828 00:36:36,770 --> 00:36:38,510 Deci X nu ar trebui să aibă valoarea 1. 829 00:36:38,510 --> 00:36:41,470 S-ar putea avea orice altă valoare, un așa-numita valoare gunoi. 830 00:36:41,470 --> 00:36:44,320 Și am avut noroc în care este zero, în acest moment, în esență. 831 00:36:44,320 --> 00:36:46,400 >> Deci, acum există doar câteva butoane trebuie să aibă grijă 832 00:36:46,400 --> 00:36:48,100 când depanare în acest mod. 833 00:36:48,100 --> 00:36:49,970 Observați aici, avem un buton Redare. 834 00:36:49,970 --> 00:36:51,877 Și dacă am juca sau lovit relua, asta e doar 835 00:36:51,877 --> 00:36:53,710 de gând să ruleze prin restul programului 836 00:36:53,710 --> 00:36:55,300 sau până când se lovește un alt punct de întrerupere. 837 00:36:55,300 --> 00:36:56,910 Dar eu nu am setat orice alt puncte de întrerupere așa că este doar 838 00:36:56,910 --> 00:36:58,118 de gând să ruleze până la sfârșitul. 839 00:36:58,118 --> 00:37:00,280 Acest tip de învinge Scopul poking în jurul valorii de. 840 00:37:00,280 --> 00:37:03,290 >> Deci, în loc, îmi pasă Aceste pictograme la dreapta. 841 00:37:03,290 --> 00:37:05,360 Și dacă am treceți peste ei, ca ar trebui de asemenea, 842 00:37:05,360 --> 00:37:07,450 veți vedea mici tool tips tips--. 843 00:37:07,450 --> 00:37:09,020 Acesta este un pas peste. 844 00:37:09,020 --> 00:37:11,290 Acum, asta nu înseamnă Skip următoarea linie de cod. 845 00:37:11,290 --> 00:37:14,840 Asta înseamnă doar executa și muta la alta, trece la următoarea, 846 00:37:14,840 --> 00:37:15,580 a trece la următorul. 847 00:37:15,580 --> 00:37:17,610 Cu alte cuvinte, prin acel buton, pot umbla 848 00:37:17,610 --> 00:37:20,390 prin intermediul meu de cod cu un pas la un moment dat. 849 00:37:20,390 --> 00:37:21,914 Linie cu linie, literalmente. 850 00:37:21,914 --> 00:37:23,830 Acum, la dreapta că, există un altul 851 00:37:23,830 --> 00:37:25,163 că vom vedea intr-o clipa. 852 00:37:25,163 --> 00:37:27,820 Aceasta este așa-numitul Pășește în pictogramă care este 853 00:37:27,820 --> 00:37:30,300 O să-mi permită Dive într-o altă funcție. 854 00:37:30,300 --> 00:37:31,800 Dar să vedem acest lucru intr-un moment. 855 00:37:31,800 --> 00:37:33,280 Deci, am de gând să faceți clic pe pasul peste. 856 00:37:33,280 --> 00:37:35,820 Și acum observați, așa cum am faceți clic pe acest buton din dreapta sus, 857 00:37:35,820 --> 00:37:41,260 ține ochii aproximativ sub Local Variabile și a vedea ce se întâmplă cu X. 858 00:37:41,260 --> 00:37:44,115 X este acum o pentru că linie galbenă a executat acum 859 00:37:44,115 --> 00:37:45,840 și ne-am mutat la linia 8. 860 00:37:45,840 --> 00:37:49,840 Și într-o clipă y ar trebui să devină sperăm 2. 861 00:37:49,840 --> 00:37:52,330 >> Acum, nimic din ceea ce interesant se întâmplă pentru un pic. 862 00:37:52,330 --> 00:37:53,390 Toate acestea sunt este printf. 863 00:37:53,390 --> 00:37:58,010 Și observă, în terminalul meu secundar fereastră, văd producția de def imprimare. 864 00:37:58,010 --> 00:38:01,080 Și acum trebuie să facă o decizie ca programator. 865 00:38:01,080 --> 00:38:04,360 Pot pas peste această linie de cod, aceasta executare dar nu 866 00:38:04,360 --> 00:38:06,220 obtinerea curiosi ce e înăuntru. 867 00:38:06,220 --> 00:38:11,130 Sau pot pas de fapt în el și du-te în interiorul Swap sine. 868 00:38:11,130 --> 00:38:12,340 Deci, hai sa facem aceasta din urmă. 869 00:38:12,340 --> 00:38:15,550 >> Lasă-mă să mergeți mai departe și faceți clic pe Nu mult, dar Pasul Step Into. 870 00:38:15,550 --> 00:38:17,300 Aviz, toate dintr-o dată modificările fereastra 871 00:38:17,300 --> 00:38:19,330 pentru a evidenția prima linie de cod în Swap. 872 00:38:19,330 --> 00:38:20,710 Asta e linia 21. 873 00:38:20,710 --> 00:38:25,220 Și acum, ce fel de funky, este faptul că, dacă te uiți aici, cum era de așteptat, 874 00:38:25,220 --> 00:38:29,720 o virgulă b este 1 și 2, respectiv. 875 00:38:29,720 --> 00:38:33,840 De ce este temp 32767? 876 00:38:33,840 --> 00:38:36,560 Reamintind că temp, la fel ca gol cupa acum o clipă, 877 00:38:36,560 --> 00:38:38,980 este declarat aici, pe line 21. 878 00:38:38,980 --> 00:38:43,390 De ce 32,000- Adică, de ce este doar o valoare ciudat? 879 00:38:43,390 --> 00:38:43,890 Da? 880 00:38:43,890 --> 00:38:45,190 >> Audiența: Nu este inițializat. 881 00:38:45,190 --> 00:38:46,940 >> David J. MALAN: E nu a fost inițializat. 882 00:38:46,940 --> 00:38:49,370 Deci calculatorul nostru întotdeauna are memorie fizică. 883 00:38:49,370 --> 00:38:50,544 Ea are întotdeauna RAM fizică. 884 00:38:50,544 --> 00:38:52,710 Și există întotdeauna Zero și unul e acolo, nu? 885 00:38:52,710 --> 00:38:54,626 Pentru că suntem folosind nostru calculator toată ziua, 886 00:38:54,626 --> 00:38:57,210 pe care îl utilizați IDE CS50 sau serverele pe tot parcursul zilei. 887 00:38:57,210 --> 00:39:01,159 Astfel încât RAM, fie are unele zerouri sau unele de una sau câteva zerouri și cele. 888 00:39:01,159 --> 00:39:02,950 Nu contează dacă sau nu te le utilizați. 889 00:39:02,950 --> 00:39:05,270 Nu poți să avea gol spații în care doriți biți. 890 00:39:05,270 --> 00:39:06,850 Sunt fie zerouri și cele. 891 00:39:06,850 --> 00:39:09,610 >> Deci, se dovedește că temp, deoarece noi nu am o inițializat încă, 892 00:39:09,610 --> 00:39:14,580 avem acele 32 de biți, dar nu am fost inițializat la orice valori cunoscute. 893 00:39:14,580 --> 00:39:18,110 Deci, indiferent că erau mai recent utilizate for-- cei 32 bits-- 894 00:39:18,110 --> 00:39:23,000 suntem doar vazut artefacte ale unor utilizarea anterioară a celor special 32 895 00:39:23,000 --> 00:39:23,500 biți. 896 00:39:23,500 --> 00:39:27,780 De îndată ce am click Step Over, deși, Pfiu, temp este mergi la a lua valoarea 1. 897 00:39:27,780 --> 00:39:31,600 Și dacă o fac din nou, un e O să fie, având în vedere valoarea de 2 898 00:39:31,600 --> 00:39:33,830 și apoi b este de gând să să se acorde valoarea 1. 899 00:39:33,830 --> 00:39:36,390 >> Și ce e frumos acum la acest punct în povestea 900 00:39:36,390 --> 00:39:39,750 este faptul că este debugger arată-mi, super lent 901 00:39:39,750 --> 00:39:42,640 in ritmul meu, ceea ce starea de swap este. 902 00:39:42,640 --> 00:39:47,490 Dar observați în partea de sus de aici, o notificare că stiva de apel, de fapt 903 00:39:47,490 --> 00:39:49,180 are doua straturi la acesta. 904 00:39:49,180 --> 00:39:53,240 Acum, cea care a subliniat ca Swap, în cazul în care dau click pe Main în schimb, 905 00:39:53,240 --> 00:39:57,100 observați cum schimba variabilele locale deoarece dezvoltatorul poate hamei doar 906 00:39:57,100 --> 00:39:59,740 în jurul și du-te în orice domeniu de aplicare diferit. 907 00:39:59,740 --> 00:40:04,070 Deci, chiar dacă facem toate astea de muncă și schimbarea în mod corect A și B, 908 00:40:04,070 --> 00:40:09,080 dacă mă duc înainte și înapoi între Swap unde a este 2 și b este 1 și Main, 909 00:40:09,080 --> 00:40:11,851 a fost afectată principal, la toate? 910 00:40:11,851 --> 00:40:12,350 Nu. 911 00:40:12,350 --> 00:40:13,930 Deci, ce este MENIUL aici? 912 00:40:13,930 --> 00:40:18,200 Ei bine, se pare că în orice moment te sun o funcție cum ar fi swap, 913 00:40:18,200 --> 00:40:21,600 și treci argumente IT, ceea ce te trece la funcția Swap 914 00:40:21,600 --> 00:40:24,730 în acest caz, este o copie de aceste argumente. 915 00:40:24,730 --> 00:40:28,620 Deci, dacă X și Y sunt fiecare, respectiv, 32 de biți, ceea ce Swap este obtinerea 916 00:40:28,620 --> 00:40:30,760 este de două noi locală variabile, sau argumente, 917 00:40:30,760 --> 00:40:34,380 numit și B-, dar acestea sunt arbitrare names-- dar modelul de zerouri 918 00:40:34,380 --> 00:40:39,520 și cele interioare ale a și b sunt aliniat pentru a fi identic cu x și y 919 00:40:39,520 --> 00:40:42,610 dar ele sunt nu de același lucru ca x și y. 920 00:40:42,610 --> 00:40:46,880 >> E ca și cum Main are pe bucata sa de hârtie numărul 1 și 2 pentru x și y, 921 00:40:46,880 --> 00:40:49,260 și apoi atunci când mâinile care bucată de hârtie pentru a schimba, 922 00:40:49,260 --> 00:40:51,970 Swap devine foarte repede propria stilou, notează 923 00:40:51,970 --> 00:40:56,240 1 și 2, din proprie foaie de hârtie, mâinile înapoi xy original pentru Main 924 00:40:56,240 --> 00:40:58,790 și apoi face propriul lucru cu a și b. 925 00:40:58,790 --> 00:41:01,940 Și acest lucru este important, deoarece acum super- acest lucru are implicații netriviale 926 00:41:01,940 --> 00:41:06,260 pentru scrierea de fapt codul corect pentru că s-ar părea că nu putem schimba 927 00:41:06,260 --> 00:41:07,500 două variabile. 928 00:41:07,500 --> 00:41:09,150 >> Am scris o funcție Swap corectă. 929 00:41:09,150 --> 00:41:12,770 Ne-am pus în aplicare cu Lauren ca o funcție de swap corectă, în realitate, 930 00:41:12,770 --> 00:41:16,700 dar se pare că nimic din toate astea probleme dacă nu se poate de fapt 931 00:41:16,700 --> 00:41:19,530 schimba permanent două valori. 932 00:41:19,530 --> 00:41:21,970 Deci, avem nevoie un alt mod pentru a obține de fapt la asta, 933 00:41:21,970 --> 00:41:24,472 si avem nevoie pentru a fi în măsură să rezolva de fapt această problemă. 934 00:41:24,472 --> 00:41:27,180 Și se pare out-- și vom veni înapoi la această imagine special 935 00:41:27,180 --> 00:41:30,500 înainte long-- aceasta este o modalitate prin care s-ar putea trage memoria computerului. 936 00:41:30,500 --> 00:41:31,460 E doar un dreptunghi. 937 00:41:31,460 --> 00:41:32,960 Ai putea trage orice număr de moduri, dar este 938 00:41:32,960 --> 00:41:35,740 convenabil să-l trage ca un dreptunghiul din următorul motiv. 939 00:41:35,740 --> 00:41:40,040 >> Vom începe astăzi și dincolo de vorbind despre așa-numita stiva. 940 00:41:40,040 --> 00:41:43,870 Și stiva este doar o bucată de RAM-- o bucată de memory-- 941 00:41:43,870 --> 00:41:47,100 că funcțiile au acces atunci când se numesc. 942 00:41:47,100 --> 00:41:49,800 Și așa se pare că la foarte partea de jos a acestei stivă 943 00:41:49,800 --> 00:41:53,590 este în cazul în care toate variabilele locale principale de și org C și org V și toate chestiile astea 944 00:41:53,590 --> 00:41:56,950 sunt de gând să meargă în mod implicit. Și dacă principal solicită o altă funcție ca Swap, 945 00:41:56,950 --> 00:42:00,330 Ei bine, de swap este mergi la a lua un alt strat de memorie de până mai sus. 946 00:42:00,330 --> 00:42:04,490 >> Și așa doar pentru a vă oferi o sumară rapid imagine de acest lucru, dacă mă duc peste here-- 947 00:42:04,490 --> 00:42:09,450 și lasă-mă să reflecte acest lucru pe aeriene ca well-- ce sa am, 948 00:42:09,450 --> 00:42:12,100 dacă ne pasă doar despre partea de jos a această imagine pentru acum, 949 00:42:12,100 --> 00:42:15,070 este că atunci când am rulat un program și principal este chemat, 950 00:42:15,070 --> 00:42:18,330 Principal este dat o bucată de RAM în calculatorul meu, care este 951 00:42:18,330 --> 00:42:20,060 în partea de jos a acestui așa-numitele stivă. 952 00:42:20,060 --> 00:42:22,143 Și am de gând să-l atragă în mod deliberat ca un pătrat. 953 00:42:22,143 --> 00:42:24,540 Deci e ca 32 de biți sau patru octeți. 954 00:42:24,540 --> 00:42:28,790 Și dacă această funcție principală are o variabile numit X, cu o valoare de 1 955 00:42:28,790 --> 00:42:32,626 și are o variabilă numită y cu valoarea 2, care este 956 00:42:32,626 --> 00:42:35,750 ca să luați acest țeapă de memorie care Principal a fost dat de operare 957 00:42:35,750 --> 00:42:38,850 sistem și împărțind-o în sus, astfel încât prima variabilă locală merge aici, 958 00:42:38,850 --> 00:42:40,930 al doilea se duce aici, și asta este. 959 00:42:40,930 --> 00:42:45,590 >> Când principal solicită Swap, Swap devine propria felie de memorie 960 00:42:45,590 --> 00:42:48,280 că vom trage ca aceasta din sistemul de operare, 961 00:42:48,280 --> 00:42:50,820 și că va avea de variabile locale proprii bazate pe 962 00:42:50,820 --> 00:42:53,825 privind punerea în aplicare noastre anterioare cu variabile locale o 963 00:42:53,825 --> 00:42:58,010 și b, care inițial obține valorile 1 și 2. 964 00:42:58,010 --> 00:43:00,450 Dar apoi, de îndată ce codul Swap executa, 965 00:43:00,450 --> 00:43:03,760 și Lauren swap de fapt JO și lapte, ce se întâmplă? 966 00:43:03,760 --> 00:43:09,030 Ei bine, acest lucru 2 devine un 1, aceasta 1 este de a deveni un 2, și, de altfel, 967 00:43:09,030 --> 00:43:13,360 există o variabilă temp care fiind folosit ca tot timpul că în cele din urmă 968 00:43:13,360 --> 00:43:14,470 pleaca. 969 00:43:14,470 --> 00:43:16,720 Dar nu contează cât de mult de lucru sa faci 970 00:43:16,720 --> 00:43:22,160 în această linie de-- în acest spațiu de memorie, x și y sunt complet neatinse. 971 00:43:22,160 --> 00:43:26,320 >> Asa ca am nevoie de un mod de a da Swap și funcții cum ar fi o 972 00:43:26,320 --> 00:43:32,640 acces secrete, dacă vreți, să Funcțiile like-- la memorie ca x și y. 973 00:43:32,640 --> 00:43:35,110 Deci, haideți să aruncăm o privire la un exemplu care ajută 974 00:43:35,110 --> 00:43:38,220 ne vedem exact ce a fost întâmplă în tot acest timp. 975 00:43:38,220 --> 00:43:40,284 Am de gând să merg mai departe și să se deschidă Compară Zero. 976 00:43:40,284 --> 00:43:42,200 Și am de gând să închidă debugger nostru, am de gând 977 00:43:42,200 --> 00:43:44,360 pentru a închide acest mesaj infricosator caută Just spune, așteptați un minut, 978 00:43:44,360 --> 00:43:45,800 ești în depanare mijloc. 979 00:43:45,800 --> 00:43:48,383 Am de gând să ascundă această filă aici doar pentru a reveni la simplitate. 980 00:43:48,383 --> 00:43:50,160 Deci, nu vă faceți griji dacă GDB este ucis. 981 00:43:50,160 --> 00:43:53,910 Asta înseamnă doar că programul are fost renuntat, în mod deliberat, în acest caz, 982 00:43:53,910 --> 00:43:54,820 de către mine. 983 00:43:54,820 --> 00:43:57,700 >> Și acum Compara Zero face acest lucru. 984 00:43:57,700 --> 00:44:00,110 Sunt folosind CS50 bibliotecă în standardul I / O. 985 00:44:00,110 --> 00:44:04,319 Am o funcție principală care primul spune, spune ceva, și devine un șir. 986 00:44:04,319 --> 00:44:06,110 Apoi, se spune din nou și devine un alt șir. 987 00:44:06,110 --> 00:44:09,910 Și observați că aceste două șiruri sunt numite S și T, respectiv. 988 00:44:09,910 --> 00:44:12,910 Și acum acest program, Comparați Zero, scopul său în viață, 989 00:44:12,910 --> 00:44:15,470 se presupune să-mi spună, am tastați același lucru? 990 00:44:15,470 --> 00:44:16,910 Și așa am de gând înapoi la o saptamana. 991 00:44:16,910 --> 00:44:19,950 Sunt folosind operatorul meu egal egal care este operatorul de calitate. 992 00:44:19,950 --> 00:44:22,220 Nu este operatorul de atribuire, operatorul de egalitate. 993 00:44:22,220 --> 00:44:23,890 Sunt doar compararea S și T. 994 00:44:23,890 --> 00:44:27,470 >> Deci, haideți să de fapt merge mai departe și a face acest lucru. 995 00:44:27,470 --> 00:44:32,680 Și am de gând să merg mai departe și să facă Compara Zero. 996 00:44:32,680 --> 00:44:35,110 Am de gând să fac ./comparezero. 997 00:44:35,110 --> 00:44:37,150 Și am de gând să merg înainte și spune ceva 998 00:44:37,150 --> 00:44:43,450 cum ar fi, să facem mama cu litere mici Și cum despre mama cu majuscule. 999 00:44:43,450 --> 00:44:45,034 Și, desigur, eu de tip lucruri diferite. 1000 00:44:45,034 --> 00:44:45,533 In regula. 1001 00:44:45,533 --> 00:44:46,570 Asta e de așteptat. 1002 00:44:46,570 --> 00:44:47,640 >> Să-l executați din nou. 1003 00:44:47,640 --> 00:44:49,740 Ambele ori face cu litere mici, litere mici. 1004 00:44:49,740 --> 00:44:51,490 Care arata super-identic cu mine. 1005 00:44:51,490 --> 00:44:52,930 Enter. 1006 00:44:52,930 --> 00:44:53,430 BINE. 1007 00:44:53,430 --> 00:44:55,804 Poate e doar ciudat pentru că nu e place gramatica mea. 1008 00:44:55,804 --> 00:44:59,930 Deci, hai sa facem o mama de capital, de capital MOM, identice. 1009 00:44:59,930 --> 00:45:01,490 Lucruri diferite. 1010 00:45:01,490 --> 00:45:03,907 >> Deci, de ce este asta? 1011 00:45:03,907 --> 00:45:06,240 Ei bine, ce se intampla de fapt pe sub capota aici? 1012 00:45:06,240 --> 00:45:08,180 Deci, să ne întoarcem peste aici pentru un moment 1013 00:45:08,180 --> 00:45:10,910 și ia în considerare ce getString este, de fapt face. 1014 00:45:10,910 --> 00:45:13,385 Când apelați getString, asta e un ne funcție 1015 00:45:13,385 --> 00:45:16,510 ne a scris și devine într-un fel o secventa de caractere din partea utilizatorului. 1016 00:45:16,510 --> 00:45:20,280 Și să presupunem că primul timp eu numesc getString, că îmi dă 1017 00:45:20,280 --> 00:45:21,930 o bucată de memorie care arata ca acest lucru. 1018 00:45:21,930 --> 00:45:26,990 Și dacă am scris în toate litere mici m-o-M-- și ce se întâmplă după asta? 1019 00:45:26,990 --> 00:45:28,840 Doar o verificare bun-simț rapid. 1020 00:45:28,840 --> 00:45:29,780 >> Zero, backslash. 1021 00:45:29,780 --> 00:45:30,510 Noi stim aia. 1022 00:45:30,510 --> 00:45:32,784 Și reamintească faptul că ne-am jucat în jurul valorii de cu numele lui Zamila 1023 00:45:32,784 --> 00:45:34,950 și o grămadă de alte nume când Rob a fost aici în căutarea 1024 00:45:34,950 --> 00:45:36,280 la ce se întâmplă în interiorul memorie. 1025 00:45:36,280 --> 00:45:37,780 Așa că povestea e exact la fel. 1026 00:45:37,780 --> 00:45:40,160 Aceasta este ceea ce getString se întoarce la mine. 1027 00:45:40,160 --> 00:45:44,780 Acum, codul meu un moment în urmă stocat valoarea de returnare a getString 1028 00:45:44,780 --> 00:45:47,510 într-o variabilă numită s. 1029 00:45:47,510 --> 00:45:51,390 Și apoi a doua oară l-am numit, îl stocate într-o variabilă numită T. 1030 00:45:51,390 --> 00:45:55,070 >> Deci, dacă mă duc aici, am nevoie de să elaboreze acest variable-- locale 1031 00:45:55,070 --> 00:45:59,610 și am de gând să, în general, trage un șir ca doar-- ne vom 1032 00:45:59,610 --> 00:46:02,360 numesc S- ca un mic pătrat aici. 1033 00:46:02,360 --> 00:46:09,760 Și acum, somehow-- cum se mama du-te în interiorul acestei variabile s? 1034 00:46:09,760 --> 00:46:12,010 Ei bine, trebuie să ne întoarcem la primul principiilor de aici. 1035 00:46:12,010 --> 00:46:15,660 Ce este de fapt getString întoarce? 1036 00:46:15,660 --> 00:46:19,030 >> Deci, se dovedește că M-O-M backslash la zero, și orice număr 1037 00:46:19,030 --> 00:46:22,364 de alte siruri de caractere in memorie ca Zamila și Rob sau Andy sau orice alte, 1038 00:46:22,364 --> 00:46:24,280 sunt, desigur, în nostru RAM sau memoria calculatorului. 1039 00:46:24,280 --> 00:46:27,760 Și RAM-ul are like-- aveți un concert de RAM, două concerte de RAM, 1040 00:46:27,760 --> 00:46:30,860 sau un miliard sau două miliarde de bytes, sau poate chiar mai mult in aceste zile. 1041 00:46:30,860 --> 00:46:34,070 Deci, să presupunem, în scopuri de astăzi, că nu contează cum am număra 1042 00:46:34,070 --> 00:46:36,640 ei, dar putem număra fiecare din cei miliarde de euro sau două miliarde 1043 00:46:36,640 --> 00:46:37,880 sau patru miliarde de bytes. 1044 00:46:37,880 --> 00:46:42,240 >> Și să spunem că arbitrar aceasta este prima muscatura, muscatura a doua, 1045 00:46:42,240 --> 00:46:43,380 al treilea, al patrulea. 1046 00:46:43,380 --> 00:46:46,570 În mod deliberat nu sunt utilizați zero pentru azi, dar ne vom reveni la asta. 1047 00:46:46,570 --> 00:46:49,570 Deci, cu alte cuvinte, dacă acest lucru este prima dată Sunt folosind programul, 1048 00:46:49,570 --> 00:46:52,715 Sunt doar obtinerea norocos și primul muscatura este la locația unul, apoi doi 1049 00:46:52,715 --> 00:46:53,590 apoi trei de patru. 1050 00:46:53,590 --> 00:46:57,430 Și dacă am păstrat desen, numărul cutie două miliarde ar fi mult aici. 1051 00:46:57,430 --> 00:47:02,200 >> Deci, ce crezi, atunci, GetString de fapt se întoarce? 1052 00:47:02,200 --> 00:47:06,010 Nu e întoarce M-O-M backslash zero, în sine, pentru că în mod clar 1053 00:47:06,010 --> 00:47:08,180 nu se va potrivi în caseta pe care am desenat. 1054 00:47:08,180 --> 00:47:11,210 Deci, ce altceva s-ar putea de fapt getString întoarce toate aceste săptămâni? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Răspunsul este pe bord pe aici pe undeva. 1057 00:47:16,820 --> 00:47:20,390 Nu puteți potrivi M-O-M backslash la zero, Deci, ce s-ar putea face sens în schimb? 1058 00:47:20,390 --> 00:47:23,424 Dacă ar trebui să fie foarte inteligent, punând pe așa-numita pălărie inginerie, 1059 00:47:23,424 --> 00:47:24,340 ceea ce ar putea reveni? 1060 00:47:24,340 --> 00:47:27,340 Care este cel mai puțin cantitatea de informații ai putea intoarce care ar încă 1061 00:47:27,340 --> 00:47:30,610 vă permit să găsiți M-O-M în memorie? 1062 00:47:30,610 --> 00:47:31,270 Da? 1063 00:47:31,270 --> 00:47:31,950 >> Audiența: One. 1064 00:47:31,950 --> 00:47:32,200 >> David J. MALAN: One. 1065 00:47:32,200 --> 00:47:33,021 Și de ce unul? 1066 00:47:33,021 --> 00:47:35,520 Audiența: Pentru ca ar spune te unde să meargă [neauzit]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 David J. MALAN: Exact. 1069 00:47:39,390 --> 00:47:44,300 Sunt doar de gând să se întoarcă adresa din șirul pe care am ajuns. 1070 00:47:44,300 --> 00:47:46,570 Adresa în acest caz este unul de locație. 1071 00:47:46,570 --> 00:47:51,280 Deci, ceea ce este într-adevăr a fi depozitate în S- și fiecare variabilă string astfel far-- 1072 00:47:51,280 --> 00:47:53,430 a fost tocmai Adresa din șir. 1073 00:47:53,430 --> 00:47:57,840 >> Între timp, în cazul în care eu numesc GetString a doua oară și am 1074 00:47:57,840 --> 00:48:03,300 tastați în literalmente același thing-- M-O-M cu lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 și un alt backslash la zero, și acum poate programul meu 1076 00:48:06,200 --> 00:48:09,820 fost difuzate de ceva timp asa ca poate acest este de 10, aceasta este locația 11, aceasta este de 12, 1077 00:48:09,820 --> 00:48:10,700 aceasta este 13. 1078 00:48:10,700 --> 00:48:13,590 Calculatoarele care utilizează un alt memorie pentru orice motiv. 1079 00:48:13,590 --> 00:48:18,172 Ce acum se în a doua mea variabilă în programul T mea? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Exact. 1082 00:48:20,050 --> 00:48:23,910 >> Așa că atunci când ne uităm la codul sursă al acestui program 1083 00:48:23,910 --> 00:48:26,550 în cazul în care pur și simplu încerc eu pentru a compara cele două valori, 1084 00:48:26,550 --> 00:48:32,180 este S egal egal cu t, ceea ce este Răspunsul evident uman? 1085 00:48:32,180 --> 00:48:34,890 Doar nu pentru că 1 nu este egal 10. 1086 00:48:34,890 --> 00:48:36,861 Și astfel aici se află un oportunitate pentru noi într-adevăr 1087 00:48:36,861 --> 00:48:39,610 pentru a merge doar înapoi la, din nou, în primul rând principii și cred despre, bine, 1088 00:48:39,610 --> 00:48:41,110 ce se întâmplă sub capota? 1089 00:48:41,110 --> 00:48:43,240 Am vorbit despre biți și bytes și memorie, 1090 00:48:43,240 --> 00:48:46,820 dar este de fapt util pentru a înțelege pentru că atunci când te sun getString, 1091 00:48:46,820 --> 00:48:50,280 chiar dacă ne gândim la ea este revenind M-O-M sau mama șir 1092 00:48:50,280 --> 00:48:53,120 sau Andy sau Zamila sau similare, tehnic 1093 00:48:53,120 --> 00:48:55,510 e doar returnarea adresa de care bucată de memorie. 1094 00:48:55,510 --> 00:48:56,910 >> Dar asta e în regulă. 1095 00:48:56,910 --> 00:49:00,570 Pentru că știu cum în cazul în care șirul se termină? 1096 00:49:00,570 --> 00:49:03,840 Dacă am dat doar începutul? 1097 00:49:03,840 --> 00:49:05,380 Ei bine, backslash la zero, nu? 1098 00:49:05,380 --> 00:49:08,800 Tocmai la timp liniar pot imprima cu def imprimare M-O-M. 1099 00:49:08,800 --> 00:49:11,820 Și, de îndată ce văd backslash la zero, nu-mi pasă unde am început, 1100 00:49:11,820 --> 00:49:14,950 Știu deja implicit în cazul în care am nevoie pentru a termina. 1101 00:49:14,950 --> 00:49:18,700 >> Și așa astăzi marchează beginning-- și lasă-mă să fac acest lucru în mod dramatic deoarece noi 1102 00:49:18,700 --> 00:49:21,800 a trecut printr-o mulțime de probleme la obține aceste aici formare wheels-- 1103 00:49:21,800 --> 00:49:29,840 așa că astăzi roțile de formare începe să intre pe noi și dezvăluie la least-- 1104 00:49:29,840 --> 00:49:31,373 >> [Aplauze] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Asta a fost bine în valoare de călătorie la Target în această dimineață, da? 1107 00:49:36,160 --> 00:49:39,600 Deci now-- există, se pare out, un astfel de lucru ca șir. 1108 00:49:39,600 --> 00:49:41,140 String nu există. 1109 00:49:41,140 --> 00:49:43,760 Este un sinonim care am avut în interiorul bibliotecii CS50. 1110 00:49:43,760 --> 00:49:48,660 De acum înainte, vom începe de asteptare S și ​​T nu siruri de caractere, ci stele char. 1111 00:49:48,660 --> 00:49:51,180 Și steaua char am să tachineze pe langa înainte de mult timp. 1112 00:49:51,180 --> 00:49:53,510 Dar acest lucru este de a spune, că, chiar dacă vom continua 1113 00:49:53,510 --> 00:49:56,180 folosind getString pentru acum, punct de vedere tehnic că ar trebui 1114 00:49:56,180 --> 00:49:59,010 putea spune stele char și stele char. 1115 00:49:59,010 --> 00:50:01,720 >> Și se pare că ceea ce stea va pentru a indica ceva 1116 00:50:01,720 --> 00:50:04,340 numit un pointer sau o adresă. 1117 00:50:04,340 --> 00:50:06,110 Și, de fapt, un teaser pentru ceea ce se află în fața 1118 00:50:06,110 --> 00:50:09,760 este acest clip 20 secunde de la noastră prieten Nick Parlante la Stanford 1119 00:50:09,760 --> 00:50:12,927 care, de ceva timp în urmă, petrece o sumă ridicol de timp, 1120 00:50:12,927 --> 00:50:15,010 ca cel mai bun pot spune în lucrarea sa bucătărie sau subsol lui, 1121 00:50:15,010 --> 00:50:17,140 face claymation introducerea în lume 1122 00:50:17,140 --> 00:50:20,010 un personaj pe nume Binky cu care vom 1123 00:50:20,010 --> 00:50:22,010 fi introduse data viitoare la indicii. 1124 00:50:22,010 --> 00:50:24,588 Deci, aici este o previzualizare a ceea ce este de a veni. 1125 00:50:24,588 --> 00:50:26,370 >> [VIDEO PLAYBACK] 1126 00:50:26,370 --> 00:50:27,510 >> Hei, Binky. 1127 00:50:27,510 --> 00:50:28,260 Trezeste-te. 1128 00:50:28,260 --> 00:50:30,672 E timpul pentru distracție pointer. 1129 00:50:30,672 --> 00:50:31,616 >> -Ce-i asta? 1130 00:50:31,616 --> 00:50:33,032 Aflați mai multe despre indicii? 1131 00:50:33,032 --> 00:50:34,450 Oh, Goody. 1132 00:50:34,450 --> 00:50:35,431 >> [END PLAYBACK] 1133 00:50:35,431 --> 00:50:38,055 David J. MALAN: Și pe această notă, vă vom vedea miercuri. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 In regula. 1136 00:50:48,090 --> 00:50:48,740 Cine e dans? 1137 00:50:48,740 --> 00:50:49,240 Haide. 1138 00:50:49,240 --> 00:50:50,330 Cine e dans? 1139 00:50:50,330 --> 00:50:51,820 Vrei să-l început? 1140 00:50:51,820 --> 00:50:53,770 Aduc a început. 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> LAUREN: fantezie dulce Moise.