1 00:00:00,000 --> 00:00:02,270 [Powered by Google Translate] [Săptămâna 2, Continuare] 2 00:00:02,270 --> 00:00:04,220 [David J. Malan, Universitatea Harvard] 3 00:00:04,220 --> 00:00:06,880 [Acest lucru este CS50. - CS50.TV] 4 00:00:06,880 --> 00:00:10,990 Bine. Acest lucru este CS50, iar acest lucru este sfârșitul săptămânii 2. 5 00:00:10,990 --> 00:00:14,410 Dacă vă așteptați să fie în jurul valorii de foame de data asta mâine, 6 00:00:14,410 --> 00:00:18,620 știu că vom convoca maine ca un grup mic, joi, 13:15. 7 00:00:18,620 --> 00:00:21,360 Nu e aici, această adresă URL dacă doriți să RSVP. 8 00:00:21,360 --> 00:00:26,740 Spațiul este limitat, așa încât vă rugăm ierta dacă formularul a umplut de timpul pe care îl completați asta. 9 00:00:26,740 --> 00:00:29,300 Un alt URL, însă, că ar putea fi de interes este aceasta. 10 00:00:29,300 --> 00:00:32,369 În doar despre timp de o lună, cursul este de gând să fie puse la dispoziție 11 00:00:32,369 --> 00:00:36,890 toate mai larg prin EDX, prin care oameni de pe internet vor putea să urmeze de-a lungul, 12 00:00:36,890 --> 00:00:39,380 angajeze în curs destul de activ, de fapt. 13 00:00:39,380 --> 00:00:42,270 Vor fi folosind Aparatura CS50 CS50 și Discuta 14 00:00:42,270 --> 00:00:45,490 și de cele mai multe instrumente software diferite care deja am fost folosind acest semestru. 15 00:00:45,490 --> 00:00:48,710 Iar una dintre inițiativele ne-am dori să-și asume ca un experiment în acest an 16 00:00:48,710 --> 00:00:51,930 este de a vedea cat de mult continut putem traduce 17 00:00:51,930 --> 00:00:53,960 în alte limbi vorbite și scrise. 18 00:00:53,960 --> 00:00:57,500 Deci, dacă s-ar putea avea un interes de a participa la acest proiect 19 00:00:57,500 --> 00:01:02,270 prin care ne va oferi transcrieri de engleză și subtitluri pentru prelegeri de curs de 20 00:01:02,270 --> 00:01:05,450 și pantaloni scurți și seminarii și secțiunile și cum ar fi, 21 00:01:05,450 --> 00:01:08,200 daca vorbesti fluent sau scrie fluent o altă limbă, 22 00:01:08,200 --> 00:01:12,290 ne-ar plăcea să te angajeze în acest proiect prin care te iau pe unul sau mai multe videoclipuri, 23 00:01:12,290 --> 00:01:15,200 traducându-le într-o limbă pe care cunosc destul de bine. 24 00:01:15,200 --> 00:01:18,700 >> Pentru a vă da un sentiment de interfață, există această interfață web-based de utilizare 25 00:01:18,700 --> 00:01:22,090 că vom folosi, care va crea în esență, o interfață de utilizare ca asta. 26 00:01:22,090 --> 00:01:24,290 Acest lucru a fost mă învăța ceva de Halloween în urmă, 27 00:01:24,290 --> 00:01:27,390 și pe partea dreaptă există în negru de lângă aceste timbre de timp, 28 00:01:27,390 --> 00:01:31,210 veți vedea lucruri diferite care au iesit din gura mea în acea zi, 29 00:01:31,210 --> 00:01:34,850 și apoi sub ea vei fi capabil să traducă în altă limbă 30 00:01:34,850 --> 00:01:38,690 exact ceea ce este de cartografiere între, în acest caz, limba engleză și, să zicem, spaniolă. 31 00:01:38,690 --> 00:01:40,440 Deci e de fapt un foarte user-friendly instrument. 32 00:01:40,440 --> 00:01:43,370 Puteți derula rapid înainte și foarte ușor, cu scurtături de la tastatură. 33 00:01:43,370 --> 00:01:47,490 Deci, dacă v-ar dori să ia parte la acest experiment și au văzut cuvintele tale și citește 34 00:01:47,490 --> 00:01:51,850 de potențial mii de oameni acolo, vă rugăm să nu ezitați să participe. 35 00:01:51,850 --> 00:01:54,350 Un cuvânt despre pisoi de luni. 36 00:01:54,350 --> 00:02:00,350 Ca nu cumva ne-am trimis un mesaj extrem de înfricoșător, nu-i dau seama că, așa cum sugerează oră de birou 37 00:02:00,350 --> 00:02:03,300 și, ca secțiuni sugerează, de proiectare a cursului este foarte mult 38 00:02:03,300 --> 00:02:07,360 pentru a fi studenți colaborarea și vorbesc să lucreze prin seturi de probleme 39 00:02:07,360 --> 00:02:11,260 și probleme împreună, și într-adevăr linia de doar vine în jos pentru a, 40 00:02:11,260 --> 00:02:16,010 din nou, munca pe care o depune în cele din urmă ar trebui să fie a ta. 41 00:02:16,010 --> 00:02:18,860 Și așa destul de sincer, în ore de birou este absolut normală, 42 00:02:18,860 --> 00:02:22,240 este în totalitate de așteptat, chiar, să fie pe chat cu un prieten lângă tine. 43 00:02:22,240 --> 00:02:24,370 >> În cazul în care el sau ea se luptă cu un subiect și ești ca, 44 00:02:24,370 --> 00:02:27,940 "Oh, ei bine, permiteți-mi să vă dau o idee de o linie de cod pe care am scris," că e bine, 45 00:02:27,940 --> 00:02:31,250 acest lucru se întâmplă, și asta e foarte mult favorabil, cred, cu procesul de învățare. 46 00:02:31,250 --> 00:02:36,750 În cazul în care linia devine trecut este atunci când capul este înclinat fel de aici pentru câteva secunde mult prea multe 47 00:02:36,750 --> 00:02:41,160 sau minute pentru care într-adevăr să fi fost doar o oportunitate de deblocare pentru prietenul tău, 48 00:02:41,160 --> 00:02:44,160 și, desigur, atunci când lucrurile se schimbate prin e-mail și Dropbox și cum ar fi, 49 00:02:44,160 --> 00:02:45,640 acolo este linia. 50 00:02:45,640 --> 00:02:48,620 Deci, prin toate mijloacele se simtă confortabil și se simt încurajați să chat cu prietenii 51 00:02:48,620 --> 00:02:52,810 și colegii despre psets și mai multe și mai dau seama că doar ceea ce trimite în cele din urmă 52 00:02:52,810 --> 00:02:57,340 ar trebui să fie într-adevăr produsul creației dumneavoastră și nu de altcineva. 53 00:02:57,340 --> 00:03:00,490 Și astfel una dintre problemele specifice domeniului de pset2, 54 00:03:00,490 --> 00:03:04,740 care va ieși mâine seară târziu, este de a se arunca cu capul în lumea criptografiei, 55 00:03:04,740 --> 00:03:08,970 care este arta de a criptare sau de codare de informații, 56 00:03:08,970 --> 00:03:12,600 și în cele din urmă se referă la această lume de securitate. 57 00:03:12,600 --> 00:03:16,560 Acum, de securitate pentru cele mai multe dintre noi vine sub forma unor mecanisme destul de banale. 58 00:03:16,560 --> 00:03:19,050 Toate dintre noi au numelor de utilizator și parole, 59 00:03:19,050 --> 00:03:23,450 și noi toți avem nume de utilizator și parole foarte proaste, cel mai probabil. 60 00:03:23,450 --> 00:03:28,240 >> Dacă parola este aceeași pe site-urile multiple, că nu e, probabil, cea mai bună idee, 61 00:03:28,240 --> 00:03:30,070 cum vom discuta spre sfârșitul semestrului lui. 62 00:03:30,070 --> 00:03:34,720 Dacă parola este scris într-o notă lipicios - nu glumă - pe monitor, 63 00:03:34,720 --> 00:03:38,350 că prea nu este neapărat cel mai bun design, dar destul de un fenomen comun. 64 00:03:38,350 --> 00:03:42,470 Și dacă nu ești utilizați criptografia pentru a cripta parolele, 65 00:03:42,470 --> 00:03:44,210 ele sunt deosebit de vulnerabile. 66 00:03:44,210 --> 00:03:47,270 Deci, dacă crezi că ești deștept fiind super-de a avea un document Word ascuns 67 00:03:47,270 --> 00:03:49,910 undeva pe hard disk care are toate parolele 68 00:03:49,910 --> 00:03:53,670 dar e într-un dosar pe care nimeni nu o să uite în aceea că nu prea este un mecanism foarte sigur. 69 00:03:53,670 --> 00:03:56,990 Și deci ce pset2 va introduce aceasta este arta de a criptografiei 70 00:03:56,990 --> 00:04:02,010 și codare de informații, astfel încât lucruri cum ar fi parolele sunt mai sigure. 71 00:04:02,010 --> 00:04:05,790 Contextul aici este că, cu date nesigure 72 00:04:05,790 --> 00:04:07,930 vine o oportunitate de a cripta și să-l coate. 73 00:04:07,930 --> 00:04:11,470 Și astfel aceasta, de exemplu, este un exemplu de un mesaj criptat. 74 00:04:11,470 --> 00:04:14,700 Acest fapt spune ceva în engleză, dar nu e clar în întregime evident. 75 00:04:14,700 --> 00:04:18,279 Și vom veni cerc complet astăzi să tachineze pe langa ceea ce acest mesaj este secretul aici. 76 00:04:18,279 --> 00:04:23,490 Dar în lumea reală de calculatoare, lucrurile nu mai arata ca acestea ar putea fi de engleză Expresii. 77 00:04:23,490 --> 00:04:28,430 De exemplu, aceasta este ceea ce s-ar putea găsi pe un Linux sau Mac standard, sau de calculator UNIX 78 00:04:28,430 --> 00:04:32,070 într-un fișier care a fost o dată la un moment numit parola fișier. 79 00:04:32,070 --> 00:04:34,200 >> In zilele noastre a fost mutat la alte locuri. 80 00:04:34,200 --> 00:04:39,210 Dar dacă te uiți în locul potrivit pe un sistem, veți vedea nu numai numele de utilizator 81 00:04:39,210 --> 00:04:43,400 sau a altor persoane de pe sistem, dar veți vedea o versiune criptată a parolei lor. 82 00:04:43,400 --> 00:04:47,980 Într-adevăr, cuvântul cripta acolo sugerează că lucrurile următoare este criptat, 83 00:04:47,980 --> 00:04:52,680 și această serie de litere aparent aleatorii și caractere și numere și așa mai departe 84 00:04:52,680 --> 00:04:56,480 pot fi decriptate doar prin cunoașterea, în general, un secret - 85 00:04:56,480 --> 00:04:58,840 un cuvânt secret, un număr secret - 86 00:04:58,840 --> 00:05:03,160 și astfel, într-adevăr, arta de a criptografiei în cele din urmă se reduce la încredere de un anumit fel 87 00:05:03,160 --> 00:05:05,650 și știind ceva ce altcineva nu o face. 88 00:05:05,650 --> 00:05:10,090 Deci, vom explora acest lucru în detaliu un pic mai mult în prezent și în PSET să vină. 89 00:05:10,090 --> 00:05:12,200 Și acum un cuvânt pe pass / fail. 90 00:05:12,200 --> 00:05:15,360 Mai ales ca unii dintre voi s-au prăbușit în pset1, Appliance, 91 00:05:15,360 --> 00:05:19,080 și o lume foarte nou pentru tine, realizăm că frustrările și confuzie 92 00:05:19,080 --> 00:05:21,700 și doar dificultățile tehnice sunt destul de de așteptat, 93 00:05:21,700 --> 00:05:24,180 în special cu PSET în primul rând, în cazul în care există doar atât de mult nouă, 94 00:05:24,180 --> 00:05:27,730 doar familiarizarea cu ls și CD-uri și toate aceste comenzi arcane 95 00:05:27,730 --> 00:05:33,050 și un nou mediu, și asta e separat de materialul real și programarea în sine. 96 00:05:33,050 --> 00:05:36,940 Deci dau seama de asemenea, că există cu siguranță oră de birou care există ca o structură de sprijin. 97 00:05:36,940 --> 00:05:38,880 >> Secțiuni începe această duminică vine. 98 00:05:38,880 --> 00:05:42,960 Dar cel mai important, dacă te simți pur și simplu că acest lucru nu este lume pentru tine, 99 00:05:42,960 --> 00:05:44,710 dau seama că într-adevăr nu ia doar de timp. 100 00:05:44,710 --> 00:05:48,600 Și dacă nu ar pentru această oportunitate de ani în urmă pentru mine de a lua o trecere clasă / nu, 101 00:05:48,600 --> 00:05:50,990 sincer, n-aș fi stabilit chiar piciorul în sala de clasă. 102 00:05:50,990 --> 00:05:53,690 Și vă puteți schimba acest lucru până, să zicem, luni al cincilea curs, 103 00:05:53,690 --> 00:05:58,280 asa ca daca esti pe marginea acum, realizăm că mai degrabă decât capul în unele alte ape cu totul, 104 00:05:58,280 --> 00:06:01,260 nu ia în considerare cu siguranță, doar se schimba pentru a trece / nu. 105 00:06:01,260 --> 00:06:04,570 Din nou, nu e chiar această cultură aici, de la Harvard de a lua lucrurile admis / respins 106 00:06:04,570 --> 00:06:08,670 deoarece toată lumea vrea cu adevărat să realizeze sau overachieve, 107 00:06:08,670 --> 00:06:11,130 dar sincer, aceasta este o modalitate minunată de a încerca ceva 108 00:06:11,130 --> 00:06:16,720 care nu ar putea fi familiar pentru tine, și vei sfârși prin a face, în cele mai multe cazuri, destul de bine, 109 00:06:16,720 --> 00:06:18,210 poate de mult spre surprinderea ta. 110 00:06:18,210 --> 00:06:20,980 Și în termeni mai concreți, ceea ce cred că admis / respins, în general, nu, 111 00:06:20,980 --> 00:06:22,940 mai ales ca s-ar putea s-au confruntat cu pset0, 112 00:06:22,940 --> 00:06:26,560 daca pui in 10 ore, 15 ore, 25 ore în unele PSET 113 00:06:26,560 --> 00:06:29,920 si tu esti doar trage capul de perete și se obține super-noaptea târziu 114 00:06:29,920 --> 00:06:33,950 dar v-ați luat PSET 90% din drum și nu vă puteți da seama singur lucru, 115 00:06:33,950 --> 00:06:36,520 treci / nu are într-adevăr de pe marginea unei clase de acest fel, 116 00:06:36,520 --> 00:06:39,100 în cazul în care aveți posibilitatea să sortați de fericit spun, "Bine, știu că nu e perfectă, 117 00:06:39,100 --> 00:06:42,350 dar am lucrat fundul meu off pe asta, eu sunt destul de fericit cu ea în cazul în care sa încheiat, " 118 00:06:42,350 --> 00:06:44,850 și că va îndeplini așteptările pentru pass / fail. 119 00:06:44,850 --> 00:06:47,540 Deci, nu țin minte. Bine. 120 00:06:47,540 --> 00:06:50,520 >> Deci, cei care au luptat pentru a utiliza Universitatea Harvard Wi-Fi, 121 00:06:50,520 --> 00:06:54,780 știu că există un SSID CS50, o conexiune Wi-Fi, plutesc în jurul valorii de 122 00:06:54,780 --> 00:06:56,490 pe care le-ar putea avea mai mult noroc pentru. 123 00:06:56,490 --> 00:07:00,130 E un pic ironic faptul că parola pentru acest lucru, dacă doriți să încercați să vă conectați la acest 124 00:07:00,130 --> 00:07:08,350 pentru viteze mai bune - și să ne anunțați dacă nu e mai bine - este 12345, tot drumul până la 8 125 00:07:08,350 --> 00:07:10,910 pentru că 8 este mult mai sigură decât 5. 126 00:07:10,910 --> 00:07:16,910 Deci, dacă aveți nevoie de parola de acces Wi-Fi gratuit, conectați la CS50 fără fir aici, 12345678, 127 00:07:16,910 --> 00:07:20,380 și post pe CS50 Discutați dacă aveți încă probleme intermitente de conectivitate, 128 00:07:20,380 --> 00:07:25,420 și vom lăsa puterile care se cunosc pentru acest spațiu. Bine. 129 00:07:25,420 --> 00:07:32,230 Deci, un teaser rapidă, în special pentru aceia dintre voi care sunt băieți sau fete ventilator de toate Apple a lucrurilor. 130 00:07:32,230 --> 00:07:37,460 Ceea ce am dezgropat din urmă cu câțiva ani a fost acest fișier aici, iUnlock.c, 131 00:07:37,460 --> 00:07:39,930 doar pentru a face un fel de mai concrete și mai complexe 132 00:07:39,930 --> 00:07:42,560 unele dintre cele mai multe programe de bază C-am fost scris. 133 00:07:42,560 --> 00:07:46,910 Așa că am deschis acest dosar, iUnlock.c. Este disponibil pe pagina de Prelegeri pentru ziua de azi. 134 00:07:46,910 --> 00:07:49,810 Pe partea stângă veți vedea o listă lungă de funcții. 135 00:07:49,810 --> 00:07:53,230 Deci, tipul care a scris acest scris o mulțime de funcții, mai mult decât principalul. 136 00:07:53,230 --> 00:07:57,340 El a folosit o grămadă de biblioteci aici, iar dacă vom începe parcurgerea, 137 00:07:57,340 --> 00:08:04,890 ceea ce este de fapt acest este prima, cred, crack pentru iPhone-ul original. 138 00:08:04,890 --> 00:08:09,830 >> Când ai vrut să jailbreak iPhone-ul original, ceea ce înseamnă că despriponi de la AT & T 139 00:08:09,830 --> 00:08:13,710 de instalat și de fapt, un software special pe ea și face lucruri pe care Apple nu au vrut oamenii să facă, 140 00:08:13,710 --> 00:08:18,480 cineva a luat timp să dau seama exact modul în care acestea ar putea profita de defecte de software, 141 00:08:18,480 --> 00:08:22,690 greșeli, bug-uri, în software-ul Apple, și astfel sa născut iUnlock.c-- 142 00:08:22,690 --> 00:08:26,760 că, dacă l-ați compilat pe computer și instalat pe un iPhone 143 00:08:26,760 --> 00:08:29,430 care a fost conectat la computer prin intermediul, de exemplu, un cablu USB, 144 00:08:29,430 --> 00:08:32,450 acest lucru ar da privilegii administrative sau rădăcină de pe iPhone-ul dvs. 145 00:08:32,450 --> 00:08:34,620 si te lasa sa faci cam ce vrei. 146 00:08:34,620 --> 00:08:36,400 Și astfel acolo a fost aceasta pisica fascinant și mouse-ul joc 147 00:08:36,400 --> 00:08:39,340 între Apple și restul lumii, în special în ceea ce ei, ca multe companii, 148 00:08:39,340 --> 00:08:43,350 încearcă să blocheze lucrurile lor, în jos, astfel încât să puteți face doar cu el ceea ce intenționează. 149 00:08:43,350 --> 00:08:47,360 Dar, datorită oameni ca aceasta și înțelegerea de nivel scăzut detaliu - 150 00:08:47,360 --> 00:08:50,830 și, în acest caz, de programare C - și o mulțime de constructe familiare 151 00:08:50,830 --> 00:08:55,280 că am început să joc cu, sunteți în stare să impulsioneze într-adevăr hardware-ul 152 00:08:55,280 --> 00:08:59,250 într-o manieră tu de cuviință, și nu neapărat o entitate corporativă. 153 00:08:59,250 --> 00:09:01,600 Deci, de exemplu, nu am nici o idee ce toate acestea se face, 154 00:09:01,600 --> 00:09:03,580 dar GetVersion sună destul de simplă, 155 00:09:03,580 --> 00:09:05,710 si se pare ca aceasta este o funcție care această persoană a scris. 156 00:09:05,710 --> 00:09:09,250 Este nevoie de un fel de întreg ca un argument, nu se întoarce nimic, 157 00:09:09,250 --> 00:09:13,710 dar pare să bucla cu o buclă de aici și o condiție în cazul în care, în cazul întreruperii condiție, 158 00:09:13,710 --> 00:09:16,770 și cumva se referă la numerele de versiune, dacă vom defila în jos, 159 00:09:16,770 --> 00:09:19,650 chiar dacă o mulțime de aceste cuvinte cheie vor fi noi. 160 00:09:19,650 --> 00:09:22,590 Și există o mulțime de funcții de aici ne-am văzut niciodată și nu s-ar putea vedea vreodată 161 00:09:22,590 --> 00:09:24,350 pe parcursul semestrului. 162 00:09:24,350 --> 00:09:29,160 >> La sfârșitul zilei, ea urmează aceleași reguli și logica pe care ne-am jucat cu până în prezent. 163 00:09:29,160 --> 00:09:34,340 Deci, acest lucru este mult prea vechi pentru a sparge 3s iPhone 4s sau 5s sau mai curând în aceste zile, 164 00:09:34,340 --> 00:09:38,830 dar știu că e foarte mult derivat din aceasta lume pe care ne-am scufundat în. 165 00:09:38,830 --> 00:09:42,280 Să aruncăm o privire la un exemplu ceva mai simplu: 166 00:09:42,280 --> 00:09:46,260 aceasta, doar pentru a obține încălzit cu unele sintaxa si, de asemenea, alte câteva date de tip 167 00:09:46,260 --> 00:09:48,910 pe care le-am vorbit despre, dar nu au cu adevărat văzut în C. 168 00:09:48,910 --> 00:09:53,670 Acesta este un fișier numit positive1.c, și pe comentariile de la partea de sus, 169 00:09:53,670 --> 00:09:56,070 aceasta doar cere ca un utilizator furnizează un număr pozitiv. 170 00:09:56,070 --> 00:09:59,910 Deci e un exemplu de bucla do-timp, ceea ce este frumos pentru programele de utilizator interactive 171 00:09:59,910 --> 00:10:02,070 în cazul în care aveți nevoie pentru a spune utilizatorului să facă ceva, 172 00:10:02,070 --> 00:10:05,530 și în cazul în care nu cooperează țipi la ele sau respinge intrarea acestora. 173 00:10:05,530 --> 00:10:10,480 Cauza în punctul: am de gând să fac liniile 19, prin 24 174 00:10:10,480 --> 00:10:14,620 atât timp cât utilizatorul nu mi-a dat un număr pozitiv. 175 00:10:14,620 --> 00:10:21,340 Acest detaliu aici, pe linia 18, de ce m-am declar n sus acest looping toată construi 176 00:10:21,340 --> 00:10:26,870 spre deosebire de dreptul de lângă linia 22 unde-mi pasă de fapt, pentru a obține n? Da. 177 00:10:26,870 --> 00:10:29,330 [Elev] Domeniu de aplicare. Da >>, astfel încât această problemă a domeniului de aplicare. 178 00:10:29,330 --> 00:10:31,770 Și în termeni de nespecialist, ceea ce nu se referă la domeniul de aplicare? 179 00:10:34,880 --> 00:10:41,560 Da. >> [Elevului răspunsul neauzit] >> Poți vorbi un pic mai tare? 180 00:10:41,560 --> 00:10:45,440 [Elev] În cazul în care vă puteți accesa acea variabila. Perfect >>. 181 00:10:45,440 --> 00:10:47,610 În cazul în care puteți accesa o anumită variabilă. 182 00:10:47,610 --> 00:10:50,990 Și, în general, regula de degetul mare până acum a fost că domeniul de aplicare al unor variabile 183 00:10:50,990 --> 00:10:56,140 este definit de acolade cele mai recente buclat pe care le-ați văzut. 184 00:10:56,140 --> 00:11:03,070 >> Și astfel, în acest caz, dacă am făcut greșeala de a declara n pe linia 22, care linia va funcționa. 185 00:11:03,070 --> 00:11:10,840 Mi-ar lua o int, și aș pune în faptul că n variabile, în linia 22, 186 00:11:10,840 --> 00:11:17,060 dar care linia de cod ar avea acum nici o idee despre ce vorbesc despre? >> [Elev] 25. 187 00:11:17,060 --> 00:11:23,840 [Malan] 25, și se pare că 24 la fel de bine, deoarece în acest caz se încadrează în afara acolade. 188 00:11:23,840 --> 00:11:28,550 Deci, doar un pic de o pacoste, dar foarte ușor de rezolvat prin declararea simpla variabila 189 00:11:28,550 --> 00:11:30,700 în afara funcției de sine. 190 00:11:30,700 --> 00:11:32,760 Vom vedea mai târziu astăzi puteți merge un pas mai departe 191 00:11:32,760 --> 00:11:34,940 și ai putea obține chiar și un pic leneș. 192 00:11:34,940 --> 00:11:39,660 Și acest lucru nu este recomandată, în general, dar ai putea obține chiar și leneș 193 00:11:39,660 --> 00:11:44,150 și a pus o variabilă la nivel global, ca să spunem așa, nu în interiorul unei funcții, nu în interiorul unei bucle, 194 00:11:44,150 --> 00:11:49,800 dar în fișierul propriu-zis, in afara de toate functiile pe care le-ați scris, așa cum am făcut-o aici, pe linia 15. 195 00:11:49,800 --> 00:11:55,220 Acest lucru este, în general, dezaprobat, dar realiza acest lucru este o soluție, uneori, la alte probleme, 196 00:11:55,220 --> 00:11:56,910 după cum vom vedea în cele din urmă. 197 00:11:56,910 --> 00:11:59,500 Deci, de acum vom lăsa ca acest lucru, dar să vedem dacă putem rescrie această 198 00:11:59,500 --> 00:12:02,360 doar pentru a începe a ne exprima un pic diferit. 199 00:12:02,360 --> 00:12:05,550 Acest program, doar pentru a fi clar, este positive1. 200 00:12:05,550 --> 00:12:11,980 Lasă-mă să merg mai departe aici și în fereastra terminalul meu face positive1, Enter. 201 00:12:11,980 --> 00:12:15,080 Compilează bine. Am de gând să ruleze positive1, apăsați Enter. 202 00:12:15,080 --> 00:12:19,250 Eu cer ca să-mi dați un număr întreg pozitiv. Voi spune -1. Că nu au de lucru. 203 00:12:19,250 --> 00:12:22,340 0, 99. Asta pare sa functioneze. 204 00:12:22,340 --> 00:12:25,310 Poate că nu mai riguroase de testare, dar cel puțin e un cec bun-simț frumos 205 00:12:25,310 --> 00:12:27,100 că suntem pe drumul cel bun. 206 00:12:27,100 --> 00:12:29,570 >> Asa ca lasa-ma acum mergeți mai departe și să deschidă versiunea 2 a acestui, 207 00:12:29,570 --> 00:12:32,800 și ceea ce este diferit deja? 208 00:12:32,800 --> 00:12:39,030 Aceasta implementează același lucru, dar ceea ce e clar ca sarind diferit de data asta? 209 00:12:40,790 --> 00:12:47,090 Acest lucru bool în verde. Acesta este evidențiată în verde, acest cuvânt cheie cunoscut sub numele de bool, care este un tip de date. 210 00:12:47,090 --> 00:12:50,510 Ea nu vine incorporat în toate versiunile de C. 211 00:12:50,510 --> 00:12:52,650 Ai nevoie de a include o anumită bibliotecă. 212 00:12:52,650 --> 00:12:56,460 În cazul nostru, am inclus biblioteca CS50, astfel încât să avem acces la bool. 213 00:12:56,460 --> 00:12:59,860 Dar, în linia 18, se pare că avem o valoare booleană aici numit recunoscători. 214 00:12:59,860 --> 00:13:02,190 Am fi putut numit acest nimic, dar am numit-o recunoscător 215 00:13:02,190 --> 00:13:04,750 doar pentru a transmite un fel de vreun sens semantic. 216 00:13:04,750 --> 00:13:07,700 Deci, inițial pe linia 18, eu nu sunt, aparent recunoscător 217 00:13:07,700 --> 00:13:12,230 deoarece valoarea booleana recunoscător este inițializat la fals în linia 18. 218 00:13:12,230 --> 00:13:16,500 Și apoi se pare că ceea ce am făcut aici, în linii 21 până la 23 219 00:13:16,500 --> 00:13:19,200 este am doar un fel de rescrise logica mea. 220 00:13:19,200 --> 00:13:26,100 Deci, nu funcțional diferite, dar în linia 22 acum am verifica dacă int utilizatorul a furnizat 221 00:13:26,100 --> 00:13:31,360 este mai mare decât 0, atunci am schimba pur și simplu valoarea recunoscător adevărate. 222 00:13:31,360 --> 00:13:35,590 Și de ce am face asta? Pentru că în linia 25, se pare că am de gând să verifice o condiție. 223 00:13:35,590 --> 00:13:39,760 Face acest lucru în timp ce bucla recunoscator este falsă. 224 00:13:39,760 --> 00:13:42,960 Deci, am propus acest lucru ca pe o alternativă la versiunea 1 225 00:13:42,960 --> 00:13:47,050 pentru că este cel puțin un pic mai intuitiv, probabil, e un pic mai mult pământ în limba engleză. 226 00:13:47,050 --> 00:13:51,980 Deci, faceți următoarele în timp ce nu ești recunoscător sau în timp ce recunoscator este falsă. 227 00:13:51,980 --> 00:13:56,220 Și de data asta am prea aparent, nu-mi pasă să-și amintească ceea ce utilizatorul tastat în 228 00:13:56,220 --> 00:14:00,050 Notă pentru ca nu exista nici n variabile, astfel încât, de fapt, o minciună nevinovată acolo. 229 00:14:00,050 --> 00:14:03,290 >> Funcțional, programul este un pic diferit, odată ce vom ajunge la partea de jos a acestuia 230 00:14:03,290 --> 00:14:04,960 pentru că nu mi amintesc ce n este. 231 00:14:04,960 --> 00:14:09,120 Dar am vrut să demonstreze aici, de asemenea, că, deși le-am vazut GetInt 232 00:14:09,120 --> 00:14:13,780 și getString fiind folosit pe partea dreaptă a unui semn egal până în prezent 233 00:14:13,780 --> 00:14:17,310 astfel încât să ne amintim valoarea, punct de vedere tehnic, nu e strict necesar. 234 00:14:17,310 --> 00:14:20,290 Dacă pentru orice motiv, tu chiar nu-mi pasă pentru a salva valoarea, 235 00:14:20,290 --> 00:14:25,540 vrei doar să verifice valoarea, observați că putem scrie pur și simplu acest lucru ca GetInt, 236 00:14:25,540 --> 00:14:27,320 paren deschis, paren aproape. 237 00:14:27,320 --> 00:14:30,570 Această funcție este de gând să se întoarcă o valoare, așa cum ne-am spus. 238 00:14:30,570 --> 00:14:32,220 O să te dai înapoi un int. 239 00:14:32,220 --> 00:14:34,460 Și așa că, dacă mental că acest lucru se întâmplă din, 240 00:14:34,460 --> 00:14:38,190 atunci când am tip în 99, GetInt returnează numărul 99, 241 00:14:38,190 --> 00:14:41,840 și astfel conceptual, e ca și cum codul meu au fost de fapt acest lucru. 242 00:14:41,840 --> 00:14:45,950 Deci, dacă 99 este într-adevăr mai mare decât 0, atunci devine adevărat recunoscător, 243 00:14:45,950 --> 00:14:50,810 atunci linia 25 își dă seama ooh, am terminat pentru că eu sunt recunoscător acum, 244 00:14:50,810 --> 00:14:53,970 și, în linia 26, ne spune pur și simplu, "Multumesc pentru întreg pozitiv!" 245 00:14:53,970 --> 00:14:55,960 ce sa întâmplat să fie. 246 00:14:55,960 --> 00:14:59,140 Acum, hai să facem o ușoară zahăr sintactică aici, ca să spunem așa. 247 00:14:59,140 --> 00:15:04,670 Să vedem dacă putem curăța această linie 25, cu această variantă, în al treilea și ultimul positive3. 248 00:15:04,670 --> 00:15:13,600 >> Observați diferența abia acum este ceea ce linie de cod? >> [Elev] 25. >> [Malan] Da, 25. 249 00:15:13,600 --> 00:15:17,680 Și nu ne-am văzut într-adevăr acest truc doar încă, dar am vedea semn de exclamare luni, 250 00:15:17,680 --> 00:15:21,070 care denotă ce? >> [Elev] Nu. Nu >> sau negare. 251 00:15:21,070 --> 00:15:23,510 Astfel încât să ia o valoare Boolean și flip valoarea sa. 252 00:15:23,510 --> 00:15:25,810 Adevărat devine fals, fals devine adevărată. 253 00:15:25,810 --> 00:15:30,420 Deci acest lucru, aș propune, este chiar un pic mai mult intuitiv o modalitate de scriere a codului 254 00:15:30,420 --> 00:15:33,430 pentru că am inițializa încă recunoscător pentru fals, eu fac tot următor, 255 00:15:33,430 --> 00:15:36,010 Am setat la adevărat recunoscător atunci când vine momentul, 256 00:15:36,010 --> 00:15:40,880 dar acum puteți într-adevăr să traducem doar acest cod verbal la stânga la dreapta, 257 00:15:40,880 --> 00:15:45,630 în timp ce (recunoscător!); pentru că punctul-bang-ului sau de exclamare denotă noțiunea de a nu, 258 00:15:45,630 --> 00:15:47,580 astfel încât în ​​timp ce nu recunoscător. 259 00:15:47,580 --> 00:15:49,900 Deci, din nou, nu am introdus nici concepte noi pe sine. 260 00:15:49,900 --> 00:15:53,730 Am vorbit despre Booleans înapoi când ne-am jucat cu Scratch, 261 00:15:53,730 --> 00:15:56,720 dar dau seama acum putem începe doar scris codul nostru în mai multe moduri diferite. 262 00:15:56,720 --> 00:16:01,060 Deci, în special în pset1 daca esti un fel de luptă pentru a afla modul de a scrie un program, 263 00:16:01,060 --> 00:16:04,340 Șansele sunt sunteți în noroc, deoarece nu poate exista orice număr de soluții 264 00:16:04,340 --> 00:16:06,110 pe care le poate întâmpla la. 265 00:16:06,110 --> 00:16:10,500 De exemplu, aceasta este la doar 3 chiar și pentru cea mai simplă de programe. Bine. 266 00:16:10,500 --> 00:16:14,200 Și amintesc acum pe luni am plecat de pe acest act cu valori de returnare. 267 00:16:14,200 --> 00:16:18,450 Deci, pentru prima dată am scris un program care nu are numai principal; 268 00:16:18,450 --> 00:16:22,550 ea are, de asemenea, funcția sa personalizat pe care l-am scris aici. 269 00:16:22,550 --> 00:16:26,810 Deci, în linia 31, prin 34 am implementat o funcție cub. 270 00:16:26,810 --> 00:16:30,240 Nu e complexă. E doar o * o * o în acest caz. 271 00:16:30,240 --> 00:16:34,750 Dar ceea ce este important despre el este că eu iau de intrare în formă de 272 00:16:34,750 --> 00:16:39,180 si eu întorc de ieșire în formă de * o * o. 273 00:16:39,180 --> 00:16:43,560 Asa ca acum am capacitatea, la fel ca am folosit pentru a prinf cu monoterapie, 274 00:16:43,560 --> 00:16:47,240 pentru a apela această funcție prin apelarea funcției cub. 275 00:16:47,240 --> 00:16:51,970 >> Și funcția de cub are unele de intrare, precum și funcția de cub returnează ceva de ieșire. 276 00:16:51,970 --> 00:16:56,960 Prin contrast, printf făcut ceva. 277 00:16:56,960 --> 00:17:00,840 Ea nu sa mai întors nimic din ce ne pasa, chiar daca ca o parte aceasta nu returneze o valoare; 278 00:17:00,840 --> 00:17:03,110 ai ignora, în general, aceasta. 279 00:17:03,110 --> 00:17:06,510 Printf făcut ceva. Ea a avut un efect secundar de imprimare a ecranului. 280 00:17:06,510 --> 00:17:11,770 Prin contrast aici, avem funcția de cub, care returnează de fapt ceva. 281 00:17:11,770 --> 00:17:15,520 Deci, pentru cei familiarizați cu acest lucru, este o idee destul de simplă. 282 00:17:15,520 --> 00:17:19,640 Dar, pentru cei mai puțin familiarizați cu această idee de a trece în intrări și ieșiri obtinerea înapoi, 283 00:17:19,640 --> 00:17:21,950 Să încercăm doar ceva simplu super. 284 00:17:21,950 --> 00:17:25,490 Este cineva confortabilă vine pe scenă pentru scurt timp? 285 00:17:25,490 --> 00:17:28,040 Trebuie sa fie confortabil cu un aparat de fotografiat pe tine la fel de bine. Da? Bine. 286 00:17:28,040 --> 00:17:31,240 Care e numele tău? >> [Elev] Ken. Ken >>. Bine. Ken, haide sus. 287 00:17:31,240 --> 00:17:35,050 Ken va fi o funcție de felul aici. 288 00:17:35,050 --> 00:17:38,720 Să mergem mai departe și de a face acest lucru. Să luăm un pic de fantezie. 289 00:17:38,720 --> 00:17:42,260 Îmi pare bine. Bine ați venit la centrul scenei. Bine. 290 00:17:42,260 --> 00:17:46,640 Să lovit acest buton aici. Bine. 291 00:17:46,640 --> 00:17:49,820 Deci, aici ai o tabla modern, 292 00:17:49,820 --> 00:17:53,470 și ceea ce am este funcția principală, de exemplu, 293 00:17:53,470 --> 00:17:56,460 si nu am un iPad în mâna mea. 294 00:17:56,460 --> 00:17:59,710 >> Nu-mi aduc aminte cu adevărat cum să - Ei bine, eu nu pot spune asta. 295 00:17:59,710 --> 00:18:02,480 Eu nu prea am scris de mână bună, 296 00:18:02,480 --> 00:18:05,520 și așa mai departe, prin urmare, vreau să imprimați ceva pe ecran pentru mine. 297 00:18:05,520 --> 00:18:12,040 Sunt fiind programul principal, și am de gând să vă spun acest lucru 298 00:18:12,040 --> 00:18:16,720 de scris-o în zero puiul meu și apoi trecând pe lângă tine o intrare. 299 00:18:16,720 --> 00:18:20,400 Deci, o prostie, deși acest exercițiu este, noțiunea de funcții și de asteptare o funcție 300 00:18:20,400 --> 00:18:22,400 și returnarea unei funcții într-adevăr se reduce la asta. 301 00:18:22,400 --> 00:18:26,260 Sunt principal, am scris doar printf, citat-citatul ceva pe ecran, 302 00:18:26,260 --> 00:18:29,110 Sunt rulează acest program, și de îndată ce printf este chemat, 303 00:18:29,110 --> 00:18:32,880 este nevoie de un singur argument sau un parametru, uneori, între ghilimele duble. 304 00:18:32,880 --> 00:18:35,880 Aici este acest argument. Eu o trecerea la Ken. 305 00:18:35,880 --> 00:18:39,020 El este o cutie neagră scris un numar de ani in urma 306 00:18:39,020 --> 00:18:41,510 care se pare că doar știe cum să imprimați lucruri pe ecran. 307 00:18:41,510 --> 00:18:43,150 Deci executa. 308 00:18:49,280 --> 00:18:51,280 Asta nu e rău. Foarte bine. 309 00:18:51,280 --> 00:18:55,510 Deci, acum, Ken se face de executare. Are el nevoie să-mi dai ceva inapoi? 310 00:18:55,510 --> 00:18:57,470 Nu că ne-am văzut până acum. 311 00:18:57,470 --> 00:19:00,460 Din nou, se întoarce de fapt printf un număr, dar vom ignora faptul că, pentru moment 312 00:19:00,460 --> 00:19:03,470 pentru că n-am folosit-o. Deci, asta e ea pentru Ken. 313 00:19:03,470 --> 00:19:08,580 Și acum principalul preia controlul asupra programului din nou 314 00:19:08,580 --> 00:19:11,060 pentru că linia de cod, printf, se face de executare. 315 00:19:11,060 --> 00:19:14,050 Și vom merge despre felul nostru, indiferent de executare alte linii sunt acolo. 316 00:19:14,050 --> 00:19:17,320 Deci, acum să încercăm un exemplu ușor diferit. 317 00:19:17,320 --> 00:19:24,940 De data aceasta sa aici a goli primul ecran, și de data aceasta vom face funcția de cubaj, 318 00:19:24,940 --> 00:19:27,080 dar de data asta, mă aștept la o valoare de ieșire. 319 00:19:27,080 --> 00:19:29,180 >> Așa că hai să mergem mai departe și de a face acest lucru. 320 00:19:29,180 --> 00:19:35,790 Acum am o linie de cod care spune x devine cub de x. 321 00:19:41,370 --> 00:19:46,370 Linia de cod, rechemare, arată astfel: x = cub (x); 322 00:19:46,370 --> 00:19:50,930 Deci, cum este aceasta va funcționa? Să mergem mai departe și vă va oferi un ecran alb din nou. 323 00:19:50,930 --> 00:19:54,070 Am de gând să scrie acum valoarea lui x, 324 00:19:54,070 --> 00:20:01,400 care la acest moment, în timp se întâmplă să fie, să zicem, 2 să-l păstrați simplu. 325 00:20:01,400 --> 00:20:06,150 Am scris pe o bucată de hârtie valoare de 2, care este x mea valoare. 326 00:20:06,150 --> 00:20:10,920 L-am preda la Ken. Și >> scriu doar răspunsul? >> Da, să scrie doar răspunsul. 327 00:20:12,760 --> 00:20:18,940 Bine. Și acum el trebuie să se întoarcă ceva. Eveniment. Nisa segue. 328 00:20:18,940 --> 00:20:23,120 Așa că acum mi mâinile înapoi valoarea de 8, în acest caz, și ce să fac cu ea? 329 00:20:23,120 --> 00:20:28,250 De fapt - să vedem, obține acest drept. Ce am de gând să fac cu ea? 330 00:20:28,250 --> 00:20:33,440 Acum am de gând să profit de această valoare și de fapt se păstrează în aceste biți aceleași în memorie. 331 00:20:33,440 --> 00:20:35,170 Dar observați că sunt un fel de luptă aici. 332 00:20:35,170 --> 00:20:38,210 Sunt un pic confuz, deoarece în cazul în care nu scriu de fapt valoarea lui x, 333 00:20:38,210 --> 00:20:43,150 pentru că ceea ce am făcut este doar fizic mana Ken o bucată de hârtie pe care a avut valoarea 2, 334 00:20:43,150 --> 00:20:46,590 care a fost x, și, într-adevăr, asta este exact ceea ce sa întâmplat. 335 00:20:46,590 --> 00:20:50,210 Deci, se dovedește că, atunci când apelați funcția și tu treci într-un argument 336 00:20:50,210 --> 00:20:53,290 ca salut, lume sau te treci într-un argument cum ar fi 2, 337 00:20:53,290 --> 00:20:57,110 în general, te trece într-o copie a acestui argument. 338 00:20:57,110 --> 00:21:00,730 Și așa cum am scris în jos numărul 2 aici, și a predat-Ken, 339 00:21:00,730 --> 00:21:04,720 că trebuie să însemne că am încă o copie a valoarea 2 undeva 340 00:21:04,720 --> 00:21:08,890 deoarece, într-adevăr, acum că am ajuns înapoi valoarea 8, am nevoie să mă întorc în memoria RAM 341 00:21:08,890 --> 00:21:12,130 și scrie de fapt, in scadere cu 8 în cazul în care am avut o dată numărul 2. 342 00:21:12,130 --> 00:21:16,950 Deci vizual, amintiți-vă această noțiune de a trece în, literalmente, o copie a valorii. 343 00:21:16,950 --> 00:21:20,780 >> Ken face treaba, mi mâinile înapoi ceva - în acest caz o valoare cum ar fi 8 - 344 00:21:20,780 --> 00:21:24,980 și apoi am să fac ceva cu acea valoare dacă vreau să-l păstrați în jurul valorii de. 345 00:21:24,980 --> 00:21:29,650 Deci, toate acestea vor veni înapoi pentru a fi mult prea familiarizat înainte de mult timp. 346 00:21:29,650 --> 00:21:34,920 Va multumesc foarte mult pentru această demonstrație aici, Ken. [Aplauze] 347 00:21:34,920 --> 00:21:36,920 Foarte bine făcut. 348 00:21:36,920 --> 00:21:42,690 Să vedem cum că în cele din urmă se referă la o parte din funcția de asteptare pe care le-am făcut aici. 349 00:21:42,690 --> 00:21:47,910 Lasă-mă să mergeți mai departe și să ne aducă înapoi la exemplul cubaj aici. 350 00:21:47,910 --> 00:21:53,300 Observați că, dacă vrem să începeți să luați acest fapt, în continuare, 351 00:21:53,300 --> 00:21:57,570 vom trebui să fie conștient de faptul că x număr care este în curs de trecut aici 352 00:21:57,570 --> 00:22:01,530 este diferit de ceea ce de fapt a fi trecut in pentru a funcționa. 353 00:22:01,530 --> 00:22:05,880 Deci, din nou, aceasta trecere prin copiere va deveni destul de Germane într-o clipă. 354 00:22:05,880 --> 00:22:09,580 Să aruncăm o privire la ceva care nu funcționează destul de bine încă. 355 00:22:09,580 --> 00:22:13,250 Am de gând să merg mai departe și să deschidă un exemplu buggy treilea, care este viciată prin natura, 356 00:22:13,250 --> 00:22:18,550 și se numește buggy3 și pune în aplicare o funcție de pompare. 357 00:22:18,550 --> 00:22:25,110 Aici avem o funcție principală care a x și y arbitrar inițializat cu 1 și 2, respectiv. 358 00:22:25,110 --> 00:22:27,700 Am putea folosi GetInt, dar avem nevoie doar de un exercițiu simplu, 359 00:22:27,700 --> 00:22:30,170 deci e greu codate ca 1 și 2. 360 00:22:30,170 --> 00:22:35,340 În linii 21 și 22, am imprima aparent afară x și y, 1 pe linie. 361 00:22:35,340 --> 00:22:39,720 Apoi, pe linia 23, eu pretind am swapping aceste valori, punct, punct, punct. 362 00:22:39,720 --> 00:22:44,170 Am aparent apela o funcție în linia 24 de swap numitul care ia 2 argumente. 363 00:22:44,170 --> 00:22:48,300 Este complet legitim pentru funcțiile de a lua 2 argumente. Am văzut printf o fac deja. 364 00:22:48,300 --> 00:22:51,830 >> Deci, de swap are aparent x și y, și cum sugerează și numele, 365 00:22:51,830 --> 00:22:54,670 Sper că se va schimba aceste 2 valori. 366 00:22:54,670 --> 00:23:00,090 Deci, apoi m-am pretinde pe linia 25 "schimbat!" si eu reimprimați x și y 367 00:23:00,090 --> 00:23:03,070 în ipoteza în care le-am fost într-adevăr schimbate. 368 00:23:03,070 --> 00:23:06,080 Dar dacă am alerga de fapt, acest program - lasă-mă să deschid o fereastră de terminal, 369 00:23:06,080 --> 00:23:09,860 permiteți-mi să buggy3 - cum sugerează și numele, acest lucru nu se va termina bine 370 00:23:09,860 --> 00:23:15,770 pentru că atunci când am lovit Enter, observați că x este 1, y este 2, 371 00:23:15,770 --> 00:23:19,420 și totuși, la sfârșitul programului, acestea sunt încă, de fapt, același lucru. 372 00:23:19,420 --> 00:23:22,960 Deci bazează pe demonstrarea chiar acum cu Ken, ceea ce se întâmplă de fapt aici? 373 00:23:22,960 --> 00:23:28,710 Haideti sa patrundem in aceasta functie de swap. E foarte scurt. E doar câteva linii de cod lung. 374 00:23:28,710 --> 00:23:34,520 Dar ceea ce este problema fundamentală pe baza povestea simpla a spus aici cu Ken? 375 00:23:34,520 --> 00:23:36,670 De ce este rupt de swap? 376 00:23:36,670 --> 00:23:39,660 [Elev] Ai stocarea într-o copie, nu variabila. 377 00:23:39,660 --> 00:23:43,980 Exact. Suntem stocarea într-o copie care nu, variabila în sine. 378 00:23:43,980 --> 00:23:47,170 Cu alte cuvinte, de swap are 2 argumente aparent, un int, 379 00:23:47,170 --> 00:23:49,370 și se numește arbitrar a și b, 380 00:23:49,370 --> 00:23:54,420 și până aici, am trecut în x și y, care sunt, respectiv, 1 și 2, 381 00:23:54,420 --> 00:23:58,770 dar eu nu sunt literalmente trece în x, nu mă literalmente trece în y, 382 00:23:58,770 --> 00:24:01,450 Mă trece o copie a lui x și o copie a lui y. 383 00:24:01,450 --> 00:24:04,510 E aproape ca și cum l-ați copiat și inserat în schimb 384 00:24:04,510 --> 00:24:07,810 valorile pe care doriți să-l să manipuleze efectiv. 385 00:24:07,810 --> 00:24:14,480 Deci, dacă acesta este cazul, atunci când am început programul de executare linia 35, apoi 36, 386 00:24:14,480 --> 00:24:18,650 cand ajung la linia 37, în acest moment, în poveste, ceea ce este valoarea unei? 387 00:24:21,040 --> 00:24:25,050 În acest moment, în poveste, linia 37, care este valoarea unei la acest punct? >> [Elev] 1. 388 00:24:25,050 --> 00:24:29,280 [Malan] Ar trebui să fie doar 1, dreapta, pentru că a fost adoptată în x ca prim argument, 389 00:24:29,280 --> 00:24:33,080 și această funcție doar arbitrar este de asteptare primul argument o. 390 00:24:33,080 --> 00:24:38,200 În mod similar este y al doilea argument, și este doar asteptare arbitrar b doilea argument. 391 00:24:38,200 --> 00:24:40,990 >> Această dihotomie este, de fapt destul de simplu explicat. Gândiți-vă la asta. 392 00:24:40,990 --> 00:24:43,320 Nici unul dintre noi nu s-au întâlnit persoana care a scris printf, 393 00:24:43,320 --> 00:24:50,770 astfel încât cu siguranță, el sau ea nu are nici o idee despre ceea ce variabilele de cei 30 de ani mai târziu, vor să fie numit. 394 00:24:50,770 --> 00:24:56,650 Deci, trebuie să existe o distincție între ceea ce numim variabile în funcțiile pe care le scrieți 395 00:24:56,650 --> 00:25:02,080 și ceea ce voi numiți în funcții de variabile ce te de asteptare sau de a folosi. 396 00:25:02,080 --> 00:25:05,340 Deci, cu alte cuvinte, am scris variabile mele ca x si y, 397 00:25:05,340 --> 00:25:08,890 dar dacă altcineva a scris funcția de swap, el sau ea cu siguranță nu ar ști 398 00:25:08,890 --> 00:25:10,690 Ce variabile mei vor să fie numit, 399 00:25:10,690 --> 00:25:13,830 astfel seama că acesta este motivul pentru care aveți această dualitate de nume. 400 00:25:13,830 --> 00:25:16,750 Punct de vedere tehnic, am putea face acest lucru prin coincidență, 401 00:25:16,750 --> 00:25:20,080 dar ele vor fi în continuare în trecut drept copii. 402 00:25:20,080 --> 00:25:23,650 Ar fi doar o pura coincidenta punct de vedere estetic în cazul în care persoana care a scris de swap 403 00:25:23,650 --> 00:25:26,150 au folosit aceleași nume. 404 00:25:26,150 --> 00:25:32,370 Deci, în acest moment, în poveste, linia 37, a este 1, b este 2, iar acum am proceda pentru a le schimba. 405 00:25:32,370 --> 00:25:34,900 Mai întâi de toate, permiteți-mi să fac asta, de fapt mult mai simplu. 406 00:25:34,900 --> 00:25:36,690 Nu știu ce aceste 3 linii de cod au fost faci. 407 00:25:36,690 --> 00:25:41,210 Lasă-mă să fac asta: b = a; a = b; făcut. 408 00:25:41,210 --> 00:25:44,690 De ce este acest rupt, în mod logic? 409 00:25:46,490 --> 00:25:48,900 E un fel de lucru intuitiv, nu? 410 00:25:48,900 --> 00:25:52,560 Deci, un B devine și b devine o, 411 00:25:52,560 --> 00:25:57,730 dar problema este că de îndată ce linia 37 execute, ceea ce este valoarea a și b? 412 00:25:57,730 --> 00:26:03,410 Același, 1, pentru că ați clobbered, ca să spunem așa, v-ați schimbat pe b pentru a egale cu o. 413 00:26:03,410 --> 00:26:08,890 Deci, odată ce linia 37 a executat, asta e grozav, acum aveți 2 copii ale numărul 1 414 00:26:08,890 --> 00:26:13,350 în interiorul acestei funcții, astfel încât atunci când spui în linia 38 a = b, 415 00:26:13,350 --> 00:26:17,640 esti un fel de înșurubat pentru ca esti atribuirea doar 1 la 1. 416 00:26:17,640 --> 00:26:20,580 Ati cam pierdut valoarea îți pasă. 417 00:26:20,580 --> 00:26:23,220 Deci, în versiunea originală a acestui, observați ceea ce am făcut. 418 00:26:23,220 --> 00:26:26,850 Am avut în schimb o treia linie de cod care arata ca acest lucru. 419 00:26:26,850 --> 00:26:28,580 Am declara o variabilă temporară. 420 00:26:28,580 --> 00:26:32,170 >> Tmp este un nume foarte comun pentru o variabilă temporară, și este un int 421 00:26:32,170 --> 00:26:34,580 pentru că trebuie să se potrivească ceea ce vreau să fac o copie a. 422 00:26:34,580 --> 00:26:39,770 Am stoca o copie a interiorul tmp, astfel încât odată ce linia 37 a executat, 423 00:26:39,770 --> 00:26:45,860 valoarea a este - verificare rapidă bun-simț - 1, valoarea lui b este 2, 424 00:26:45,860 --> 00:26:48,970 și valoarea tmp este de asemenea, 1. 425 00:26:48,970 --> 00:26:52,060 Așa că acum am executa linia 38. 426 00:26:52,060 --> 00:27:00,540 Odată ce linia 38 execută, o ia pe valoarea de b. Și b a fost de 2, deci este acum un 2. 427 00:27:00,540 --> 00:27:05,210 Deci, în acest moment, în poveste, un este 2, b este 2, iar tmp este 1, 428 00:27:05,210 --> 00:27:11,060 asa ca acum logic, putem doar valoarea plop tmp lui in b si am terminat. 429 00:27:11,060 --> 00:27:12,800 Deci am rezolvat problema. 430 00:27:12,800 --> 00:27:17,720 Din păcate, atunci când am rula acest program în această formă, ea nu schimba de fapt nici o valoare. 431 00:27:17,720 --> 00:27:20,100 Dar pentru a fi clar, de ce? 432 00:27:23,660 --> 00:27:26,450 Am fixat problema logică de la doar o clipă în urmă, 433 00:27:26,450 --> 00:27:31,020 dar, din nou, în cazul în care am rulat acest program, x și y rămân neschimbate 434 00:27:31,020 --> 00:27:33,310 până la sfârșitul execuției programului. 435 00:27:33,310 --> 00:27:37,220 [Comentariu elev nu pot fi auzite] >> Noi nu am întors nimic, așa că e adevărat. 436 00:27:37,220 --> 00:27:39,670 Dar se pare că nu e un pic de o problemă aici, deoarece până în prezent, 437 00:27:39,670 --> 00:27:44,170 Singurul lucru pe care am putut să se întoarcă este un lucru, iar aceasta este o restricție a lui C. 438 00:27:44,170 --> 00:27:49,070 Puteți reveni cu adevărat numai o valoare, caz în care eu sunt un fel de blocat aici 439 00:27:49,070 --> 00:27:53,310 pentru că am putut reveni noua valoare a lui x sau aș putea întoarce noua valoare a lui y, 440 00:27:53,310 --> 00:27:55,190 dar vreau ambele înapoi. 441 00:27:55,190 --> 00:27:58,650 Deci, revenind, nu este o soluție simplă aici. 442 00:27:58,650 --> 00:28:01,710 Dar problema fundamental este de ce? Ceea ce am de fapt schimbat? 443 00:28:01,710 --> 00:28:04,190 [Elev] a și b. A și b >>. 444 00:28:04,190 --> 00:28:08,230 Dar a și b sunt copii ale lui x și y, ceea ce înseamnă că a făcut doar toate aceste lucrări, 445 00:28:08,230 --> 00:28:11,650 am petrecut doar 3 minute vorbind despre funcția de swap și toate 3 din aceste variabile, 446 00:28:11,650 --> 00:28:15,420 și asta e minunat, perfect corectă în izolare, 447 00:28:15,420 --> 00:28:20,740 dar a și sfera de aplicare a lui B este numai în aceste linii aici. 448 00:28:20,740 --> 00:28:24,790 >> Deci, doar ca o bucla de, daca declara un întreg i în interiorul bucla for, 449 00:28:24,790 --> 00:28:28,760 În mod similar, dacă sunteți în interiorul declarare a și b de o funcție care le-ați scris, 450 00:28:28,760 --> 00:28:33,320 acestea sunt valabile doar în interiorul acestei funcții, ceea ce înseamnă că de îndată ce se face schimb de executare 451 00:28:33,320 --> 00:28:38,470 și vom trece de la linia 24 la linia 25, x și y nu au fost modificate deloc. 452 00:28:38,470 --> 00:28:42,790 Ai pierdut doar o mulțime de timp pompare copii ale variabilelor. 453 00:28:42,790 --> 00:28:47,010 Deci, se dovedește că soluția la această este de fapt non-evidente. 454 00:28:47,010 --> 00:28:50,670 Nu e destul de suficiente pentru a returna valori, deoarece ne putem întoarce doar 1 valoare, 455 00:28:50,670 --> 00:28:53,470 și chiar nu vreau să schimb atât x și y, în același timp, 456 00:28:53,470 --> 00:28:55,210 așa că va trebui să se întoarcă la asta. 457 00:28:55,210 --> 00:29:01,020 Dar pentru moment, realizăm că problema fundamental derivat din faptul că a și b sunt copii 458 00:29:01,020 --> 00:29:03,630 și acestea sunt în domeniul de aplicare propria lor. 459 00:29:03,630 --> 00:29:05,050 Să încercăm să rezolve acest lucru în vreun fel. 460 00:29:05,050 --> 00:29:11,250 Lasă-mă să derulați înapoi de fapt, aici și să se deschidă, să zicem, o variantă patrulea de acest lucru, buggy4. 461 00:29:11,250 --> 00:29:13,370 Ce zici de asta? 462 00:29:13,370 --> 00:29:17,810 Aceasta este o problemă similară, dar mai simplu să se uite la înainte de a lua o lovitură de cuțit la rezolvarea ei. 463 00:29:17,810 --> 00:29:24,190 Acest program se numește creștere, și se pare că acesta inițializează un număr întreg de la 1 x, în linia 18. 464 00:29:24,190 --> 00:29:28,150 Apoi am pretind x este 1, atunci eu pretind "incrementare ..." 465 00:29:28,150 --> 00:29:33,730 Eu numesc apoi creșterea, dar apoi, în linii 22 și 23, eu pretind că a fost incrementat, 466 00:29:33,730 --> 00:29:40,220 Eu pretind x este acum orice ar fi - 2, probabil - dar acest program este buggy. 467 00:29:40,220 --> 00:29:42,610 Care e problema? 468 00:29:43,440 --> 00:29:50,160 Da. >> [Elevului răspunsul neauzit] >> Exact. 469 00:29:50,160 --> 00:29:52,490 Deci x a fost declarată, în mod evident, pe linia 18. 470 00:29:52,490 --> 00:29:54,700 Care este în interiorul acolade principalele lui. 471 00:29:54,700 --> 00:29:58,440 Deci, răspunsul simplu aici este că în timp ce există aici x, 472 00:29:58,440 --> 00:30:03,930 aceasta nu există în linia 32, astfel încât acest program, de fapt nu se va compila chiar. 473 00:30:03,930 --> 00:30:07,940 Compilatorul atunci când am încercați să compilați acest cod este de gând să țipi la mine 474 00:30:07,940 --> 00:30:14,100 despre unele identificatorul nedeclarate sau ceva în acest sens. De fapt, hai să încercăm. 475 00:30:14,100 --> 00:30:18,470 Acest lucru este de a face buggy4. Acolo este. 476 00:30:18,470 --> 00:30:22,110 Utilizarea "x" identificator nedeclarate în linia 32. 477 00:30:22,110 --> 00:30:25,580 Și, de fapt, să fie mai explicit aici, astăzi, astfel încât acest lucru este util 478 00:30:25,580 --> 00:30:27,580 în ore de birou si la domiciliu. 479 00:30:27,580 --> 00:30:29,300 >> Observați că e un pic criptic scris. 480 00:30:29,300 --> 00:30:37,270 Dar faptul că zăngănit are strigat la noi, spunând buggy4.c: 32:5, este, de fapt util. 481 00:30:37,270 --> 00:30:42,050 Aceasta înseamnă că eroarea este pe linia 32, la poziția caracterului 5. 482 00:30:42,050 --> 00:30:46,700 Deci 1, 2, 3, 4, 5. Asta e, de fapt, în cazul în care problema este. 483 00:30:46,700 --> 00:30:49,790 Și, de asemenea, de asemenea, să păstreze în minte la ore de birou și acasă, am noroc aici. 484 00:30:49,790 --> 00:30:52,990 Am o greșeală. Acesta va fi relativ ușor să se stabilească. 485 00:30:52,990 --> 00:30:55,990 Dar dacă aveți un ecran plin de mesaje de eroare copleșitoare, 486 00:30:55,990 --> 00:31:00,330 din nou seama că cel mai de jos ar putea fi doar simptomatic al celui mai de sus. 487 00:31:00,330 --> 00:31:03,450 Deci, alerga mereu în jos bug-uri dvs. de sus în jos 488 00:31:03,450 --> 00:31:05,820 pentru că nu ar putea fi doar un efect daisy chain 489 00:31:05,820 --> 00:31:09,240 sugerând că este aveți probleme mod mai mult decât tine de fapt face. 490 00:31:09,240 --> 00:31:15,150 Deci, cum am putea rezolva această problemă în cazul în care obiectivul meu este de a incrementa x? >> [Elev] Asigurați-x la nivel mondial. 491 00:31:15,150 --> 00:31:17,060 Bine, astfel încât să putem face x la nivel mondial. 492 00:31:17,060 --> 00:31:20,480 Să luăm de comenzi rapide pe care am avertizat mai devreme, dar naiba, avem nevoie doar de o soluție rapidă, 493 00:31:20,480 --> 00:31:25,730 așa că hai să spunem doar x int aici. Asta face x la nivel mondial. 494 00:31:25,730 --> 00:31:31,800 Deci, acum, principala are acces la aceasta, și creșterea are acces la acesta, 495 00:31:31,800 --> 00:31:34,110 asa ca lasa-ma si merge mai departe și a compila acest lucru acum. 496 00:31:34,110 --> 00:31:37,630 Asigurați-buggy4, Enter. Pare a compila acum. 497 00:31:37,630 --> 00:31:41,230 Să fugi buggy4. Și se pare că funcționează efectiv. 498 00:31:41,230 --> 00:31:45,150 Acesta este unul dintre aceste lucruri pe care facem cum spun eu, nu ce fac eu, 499 00:31:45,150 --> 00:31:47,010 cum am făcut doar aici, deoarece, în general, 500 00:31:47,010 --> 00:31:50,440 Programele noastre sunt mergi la a lua mult mai interesant și mult mai mult decât aceasta, 501 00:31:50,440 --> 00:31:56,390 și în cazul în care soluția la problemele vieții se pune doar toate variabilele din partea de sus a fișierului, 502 00:31:56,390 --> 00:31:59,690 foarte repede se ajunge programe groaznic de dificil de a gestiona. 503 00:31:59,690 --> 00:32:02,190 Ea devine mai greu să ne gândim la nume noi variabile, 504 00:32:02,190 --> 00:32:05,240 devine mai greu să înțeleagă ceea ce este de a face ceea ce este variabilă, 505 00:32:05,240 --> 00:32:08,460 și așa, în general, aceasta nu este o soluție bună. 506 00:32:08,460 --> 00:32:10,030 Deci, hai sa facem acest lucru mai bine. 507 00:32:10,030 --> 00:32:12,160 Noi nu doriți să utilizați o variabilă globală aici. 508 00:32:12,160 --> 00:32:16,240 >> Eu vreau să incrementa x, așa că am putut în mod evident - 509 00:32:16,240 --> 00:32:18,670 la sfârșitul zilei, acest lucru este un fel de poveste prostie pentru că am face exact acest lucru - 510 00:32:18,670 --> 00:32:24,450 dar dacă nu știam despre asta operator sau nu mi sa permis să-l schimbe în principal în sine, 511 00:32:24,450 --> 00:32:30,730 cum altfel aș putea să pună în aplicare Ken aici de data aceasta nu sa cub, ci pentru a incrementa? 512 00:32:31,380 --> 00:32:33,190 Cum pot schimba acest lucru aici? Da. 513 00:32:33,190 --> 00:32:38,480 [Elev] Pass în x și apoi să se întoarcă [neauzit] >> Bine, bine. 514 00:32:38,480 --> 00:32:41,900 Deci, de ce nu am trece în x și apoi, mai degrabă decât să îl returnați, 515 00:32:41,900 --> 00:32:44,870 de ce nu am mai reveni x + 1. 516 00:32:44,870 --> 00:32:47,710 Un cuplu mai multe lucruri trebuie să se schimbe aici. Sunt pe drumul cel bun. 517 00:32:47,710 --> 00:32:49,770 Ce altceva mai am nevoie să tweak? Altcineva. Da. 518 00:32:49,770 --> 00:32:51,740 [Răspuns studentul neauzit] 519 00:32:51,740 --> 00:32:54,730 Am nevoie pentru a schimba tipul de creștere, deoarece revenirea nu este anulat. 520 00:32:54,730 --> 00:32:57,780 Înseamnă nimic nu este nulă fiind returnate, dar în mod clar acum este, 521 00:32:57,780 --> 00:32:59,830 astfel încât acest lucru trebuie să se schimbe pentru a - >> [elev] int. 522 00:32:59,830 --> 00:33:02,740 int pentru a fi în concordanță cu ce am eu de fapt întorc. 523 00:33:02,740 --> 00:33:05,180 Acum altceva este încă buggy aici. Da. 524 00:33:05,180 --> 00:33:08,400 [Răspuns studentul nu pot fi auzite] >> [Malan] Așa că am nevoie pentru a incrementa x? 525 00:33:08,400 --> 00:33:12,080 [Răspuns studentul nu pot fi auzite] >> [Malan] Ah, asa ca am nevoie pentru a trece x. 526 00:33:12,080 --> 00:33:16,660 Așa că am nevoie să fac asta aici. >> [Elevului în comentariu neauzit] 527 00:33:16,660 --> 00:33:20,050 [Malan] Deci prototip, trebuie să schimbe asta aici. 528 00:33:20,050 --> 00:33:22,930 Deci, acest lucru trebuie să devină un int, aceasta trebuie să devină - 529 00:33:22,930 --> 00:33:25,620 hmm, de fapt, am un bug aici. Să rezolva această problemă primul. 530 00:33:25,620 --> 00:33:29,590 Ce ar trebui să fie, de fapt asta? Trebuie sa fie un ceva int. 531 00:33:29,590 --> 00:33:32,700 Ar putea fi x, dar, sincer, dacă începeți de asteptare toate variabilele x dumneavoastră, 532 00:33:32,700 --> 00:33:35,390 se va obține mai puțin și mai puțin clară, care este care. 533 00:33:35,390 --> 00:33:39,560 >> Așa că hai să aleagă arbitrar o convenție de denumire diferită pentru funcțiile de ajutorul meu, 534 00:33:39,560 --> 00:33:41,940 funcțiile scriu. Vom numi o, sau am putea spune - 535 00:33:41,940 --> 00:33:45,010 Să-l numim numărul fi chiar mai explicită. 536 00:33:45,010 --> 00:33:47,560 Deci, atunci am să se întoarcă, indiferent de numărul este de plus 1, 537 00:33:47,560 --> 00:33:50,740 si acum am de a schimba un alt lucru aici și un alt lucru aici. 538 00:33:50,740 --> 00:33:54,350 Ce trebuie să se schimbe pe linia 21 primul? >> [Elevului răspunsul neauzit] 539 00:33:54,350 --> 00:33:57,610 [Malan] Am să le atribuie x. Eu nu pot apela doar creștere (x). 540 00:33:57,610 --> 00:34:01,960 Am nevoie să-mi amintesc răspunsul prin schimbarea valorii lui x pe partea stângă. 541 00:34:01,960 --> 00:34:04,680 Și chiar dacă x este acum pe stânga și dreapta, asta e total bine 542 00:34:04,680 --> 00:34:08,860 deoarece partea dreaptă este executat primul, apoi se plopped în chestia stânga - 543 00:34:08,860 --> 00:34:10,600 x în acest caz. 544 00:34:10,600 --> 00:34:12,159 Și apoi în cele din urmă, aceasta este o repara ușor acum. 545 00:34:12,159 --> 00:34:17,230 Acest lucru trebuie să se potrivească exact ceea ce e mai jos, numărul int. 546 00:34:17,230 --> 00:34:20,570 Deci, o grămadă de modificări pentru o functie foarte prost 547 00:34:20,570 --> 00:34:24,420 dar reprezentativ de lucruri pe care le veți dori să facă din ce în ce. 548 00:34:24,420 --> 00:34:27,090 Deci, a face buggy4. Am greșit undeva. 549 00:34:27,090 --> 00:34:30,139 Oh, Doamne. Cinci greșeli într-un program de 6-line. 550 00:34:30,139 --> 00:34:35,690 Deci, ce e în neregulă pe linia 18, caracterul 5? 551 00:34:35,690 --> 00:34:39,610 Așa că trebuie să declare acest lucru int,. 552 00:34:39,610 --> 00:34:41,920 Să vedem. Există o grămadă de alte erori. 553 00:34:41,920 --> 00:34:47,010 Oh, Doamne - 19, 18, 21 - dar, din nou, să debifați ecran, L control aici, 554 00:34:47,010 --> 00:34:49,380 și rulați din nou zăngănit. 555 00:34:49,380 --> 00:34:51,340 Deci, 5 probleme este de fapt doar că: 1. 556 00:34:51,340 --> 00:34:57,520 Deci, acum să ruleze buggy4, Enter. Uau, x a fost incrementat corect. 557 00:34:57,520 --> 00:35:02,720 Bine. Orice întrebări cu privire la modul de a incrementa numere? Da. 558 00:35:02,720 --> 00:35:09,870 [Întrebare elev nu pot fi auzite] >> Bună întrebare. 559 00:35:09,870 --> 00:35:14,220 Cum se face că eu pot schimba doar x la numărul și programul va ști imediat? 560 00:35:14,220 --> 00:35:16,200 >> Din nou, cred ca e asta abstractizare. 561 00:35:16,200 --> 00:35:21,600 Deci, dacă eu sunt principala si Ken este creștere, sincer, nu-mi pasă ce Ken numește iPad lui. 562 00:35:21,600 --> 00:35:26,570 Nu-mi pasă ce el numește ceva care are de a face cu punerea în aplicare a acestuia această funcționalitate. 563 00:35:26,570 --> 00:35:33,340 Acesta este un detaliu de implementare pe care am, principal, nu trebuie să pasă. 564 00:35:33,340 --> 00:35:38,250 Și așa pur și simplu schimbarea în mod constant în interiorul funcției - numărul de aici și numărul de aici - 565 00:35:38,250 --> 00:35:40,960 este tot ce durează atât de mult cât am recompilați. 566 00:35:40,960 --> 00:35:44,180 E un fel de, dacă credeți despre mulți dintre noi, cei dintre voi cu permiselor de conducere 567 00:35:44,180 --> 00:35:46,770 care au condus sau dacă ați condus chiar și într-o mașină, 568 00:35:46,770 --> 00:35:50,950 cele mai multe dintre noi nu au nici o idee cum functioneaza o masina sub capota. 569 00:35:50,950 --> 00:35:54,970 Și literal, dacă vă deschideți capota, cele mai multe dintre noi - inclusiv eu - 570 00:35:54,970 --> 00:35:56,940 nu sunt de gând să cunoști cu adevărat ceea ce ne uitam la, 571 00:35:56,940 --> 00:35:59,220 un fel de ca tine s-ar putea simți cu chestii de genul asta acum. 572 00:35:59,220 --> 00:36:01,480 Dar noi nu avem într-adevăr să aibă grijă cum functioneaza masina, 573 00:36:01,480 --> 00:36:05,970 noi nu trebuie să aibă grijă ce toate tije și pistoanele și cabluri din interiorul masinii 574 00:36:05,970 --> 00:36:08,160 sunt de fapt fac. 575 00:36:08,160 --> 00:36:12,770 Deci, ceva de genul ceea ce voi numiți cu piston nu contează aici, în acest caz. Aceeași idee. 576 00:36:12,770 --> 00:36:25,300 Da. >> [Intrebare elev neauzit] 577 00:36:25,300 --> 00:36:29,180 Dacă există mai multe utilizări ale momentului variabila xa în urmă, 578 00:36:29,180 --> 00:36:32,150 te, programator, ar trebui să le schimbe peste tot. 579 00:36:32,150 --> 00:36:36,600 Sau ai putea face literalmente fișier, Meniu, iar apoi Find, Înlocuire - ceva de genul asta - 580 00:36:36,600 --> 00:36:39,170 dar aveți de gând să aibă de a face aceste modificări tine. 581 00:36:39,170 --> 00:36:47,450 Trebuie să fie consecvente. >> [Elev] Dacă există mai multe variabile [neauzit] 582 00:36:47,450 --> 00:36:53,100 Un ordin special ca aici, în cazul în care acest lucru a fost un alt număr de int? >> [Elev] Corect. 583 00:36:53,100 --> 00:36:56,590 [Malan] Da. Comanda contează, atunci când sunt de asteptare funcția. 584 00:36:56,590 --> 00:37:00,050 >> Deci, dacă am fost de asteptare incrementului aici cu ceva virgulă ceva, 585 00:37:00,050 --> 00:37:01,680 există o mapare directă. 586 00:37:01,680 --> 00:37:05,690 Variabilă în primul rând, orice se numește, în care se face o copie a primului argument aici. 587 00:37:05,690 --> 00:37:07,760 Scuze. Acest lucru nu ar trebui să fie o paranteză. 588 00:37:07,760 --> 00:37:11,490 Liniile doilea argument până cu cea de a doua. Deci ordine, da, materie. Bine. 589 00:37:11,490 --> 00:37:17,020 Scuze. Mi-am luat drum lung pentru a ajunge acolo. Alte întrebări? Bine. 590 00:37:17,020 --> 00:37:20,610 Deci, hai sa vedem daca nu putem picta o imagine a ceea ce se întâmplă de fapt pe aici 591 00:37:20,610 --> 00:37:23,090 sub capota, ca să spunem așa. 592 00:37:23,090 --> 00:37:26,640 Acesta este un dreptunghi care ar putea reprezenta memoria computerului. 593 00:37:26,640 --> 00:37:30,970 Chiar dacă nu aveți nici o idee cât de memorie functioneaza sau modul în care funcționează RAM, 594 00:37:30,970 --> 00:37:33,940 cel puțin presupunem că aveți legături de ea in aceste zile. 595 00:37:33,940 --> 00:37:36,280 Ai megaocteți de ea, ai gigaocteți de ea, 596 00:37:36,280 --> 00:37:40,870 și știm de la saptamana 0, care dintr-un octet este doar ceea ce? >> [Elev] 8 biți. 597 00:37:40,870 --> 00:37:42,950 8 biți, nu? Deci, 8 zerouri și 1. 598 00:37:42,950 --> 00:37:45,880 Deci, în cazul în care computerul are un gig de RAM, 2 gig-uri de memorie RAM in aceste zile, 599 00:37:45,880 --> 00:37:55,030 aveți un miliard sau 2 miliard de bytes de memorie sau de aproximativ 8 miliarde euro sau 16 miliarde biti 600 00:37:55,030 --> 00:37:56,890 în interiorul computerului. 601 00:37:56,890 --> 00:38:00,590 Spre deosebire de mic Wooly exemplu Willy, nu e de obicei mai particulele magnetice. 602 00:38:00,590 --> 00:38:04,450 Din ce în ce - în laptop-uri, cel puțin - e drive-uri solid de stat, SSD-uri, 603 00:38:04,450 --> 00:38:08,580 care au doar fără componente în mișcare. Totul e electronic. E toată energia electrică pe bază de. 604 00:38:08,580 --> 00:38:14,060 Deci, cred că a dreptunghiului ca reprezentând doar 1 sau 2 GB de memorie pe care le au. 605 00:38:14,060 --> 00:38:16,020 >> Deci e un segment de memorie. 606 00:38:16,020 --> 00:38:19,830 Lumea științei calculatoarelor a fel de partiționat în afara 607 00:38:19,830 --> 00:38:22,950 bucati de memorie pentru a face lucruri diferite. 608 00:38:22,950 --> 00:38:27,190 De exemplu, în cazul în care acest lucru este memoria RAM a computerului, astfel cum a sugerat de către dreptunghi acolo, 609 00:38:27,190 --> 00:38:31,130 se dovedește că, prin convenție, în partea de sus a RAM-ul, ca să spunem așa, 610 00:38:31,130 --> 00:38:33,660 este, în general, ceea ce se numește un segment de text. 611 00:38:33,660 --> 00:38:36,740 Acestea sunt 0s și 1s pe care le-ați compilat. 612 00:38:36,740 --> 00:38:39,020 Așa că atunci când ne-am uitat sub capota de la ceea ce este a.out, 613 00:38:39,020 --> 00:38:41,980 toate acestea 0s și 1s, când executați un program, 614 00:38:41,980 --> 00:38:46,290 cei 0s și 1s sunt încărcate de pe hard disk-ul în ceva numit RAM, 615 00:38:46,290 --> 00:38:49,320 și în memoria RAM ei pus la partea de sus. 616 00:38:49,320 --> 00:38:52,770 Între timp, aveți alte lucruri: inițializarea datelor, anuleze date. 617 00:38:52,770 --> 00:38:57,510 Cele 2 brazde de memorie se referă la variabile globale, pe care nu le utilizați des 618 00:38:57,510 --> 00:39:00,760 dar, uneori, dacă faci, ei sfârșesc acolo, de asemenea. 619 00:39:00,760 --> 00:39:04,260 Apoi, există alte lucruri: variabile de mediu, care nu va petrece prea mult timp pe, 620 00:39:04,260 --> 00:39:06,860 dar apoi 2 lucruri importante care vor veni înapoi de-a lungul semestrului, 621 00:39:06,860 --> 00:39:08,550 stiva si heap. 622 00:39:08,550 --> 00:39:12,210 Deci, cele mai multe dintre memoria calculatorului este rezervat când se rulează un program de 623 00:39:12,210 --> 00:39:15,370 pentru ceva numit stivă și ceva numit heap. 624 00:39:15,370 --> 00:39:18,840 Noi nu vom vorbi despre heap astăzi, dar vom vorbi despre stiva. 625 00:39:18,840 --> 00:39:24,600 Stivă este menit să evoca vizual al tăvi de masă, în sala de mese Mather Casa 626 00:39:24,600 --> 00:39:28,110 sau ori de câte ori se întâmplă să fie în cazul în care personalul de sala de mese a le curăța în fiecare zi, 627 00:39:28,110 --> 00:39:30,180 le adune de la podea pe sus, 628 00:39:30,180 --> 00:39:34,550 și în mod similar, în memorie, nu există această idee de a pune ceva pe o stivă, 629 00:39:34,550 --> 00:39:36,860 pune ceva pe o stivă, pune ceva pe o stivă. 630 00:39:36,860 --> 00:39:38,240 Si ce ne spun prin aceasta? 631 00:39:38,240 --> 00:39:41,860 >> Să mări doar pe jumătatea inferioară a acestui tablou, memoria RAM a computerului, 632 00:39:41,860 --> 00:39:44,330 să propună următorul. 633 00:39:44,330 --> 00:39:48,170 Se pare că, atunci când executați un program ca a.out sau Hello - 634 00:39:48,170 --> 00:39:50,100 oricare ar fi programul este că ați scris - 635 00:39:50,100 --> 00:39:54,020 din nou, cei 0s și 1s sunt încărcate de pe hard disk, care este depozitarea pe termen lung, 636 00:39:54,020 --> 00:39:57,230 stă acolo chiar și atunci când vă trageți de ștecher, încărcate în memoria RAM. 637 00:39:57,230 --> 00:40:00,610 RAM este mai rapid decât hard disk-uri - e mai mic decât hard disk-uri - 638 00:40:00,610 --> 00:40:03,300 dar e în cazul în care programele locuiesc în timp ce le execută. 639 00:40:03,300 --> 00:40:08,230 Deci, faceți dublu clic pe un program de un Mac sau PC, este încărcat de pe unitatea hard disk în memoria RAM. 640 00:40:08,230 --> 00:40:11,520 De îndată ce este încărcat în memoria RAM, du-te 0s și 1s de la partea de sus drum, 641 00:40:11,520 --> 00:40:16,610 segmentul așa-numitul text, dar apoi, cât mai curând program de fapt începe să funcționeze, 642 00:40:16,610 --> 00:40:21,360 Funcția principală este numit, și principal, așa cum am văzut, are adesea variabile locale, 643 00:40:21,360 --> 00:40:24,870 și are Ints și siruri de caractere și caractere și similare. 644 00:40:24,870 --> 00:40:29,180 Deci, dacă programul dumneavoastră că ați scris sau programul pe care le-ați dublu clic 645 00:40:29,180 --> 00:40:32,970 folosit unele variabile din interiorul principal, 646 00:40:32,970 --> 00:40:37,240 acestea ajung la partea de jos a stack-ul tău de memorie, ca să spunem așa. 647 00:40:37,240 --> 00:40:39,410 Mai concret, ce înseamnă de fapt? 648 00:40:39,410 --> 00:40:48,450 Acest lucru înseamnă doar că, dacă am fost de gând să numarul de bytes de RAM în calculatorul dumneavoastră, 649 00:40:48,450 --> 00:40:55,750 observați că acest lucru ar putea fi numărul de octet 0, acest lucru ar putea fi numărul de octet 1, 2, 3, 4, 5, 6, 650 00:40:55,750 --> 00:41:01,480 tot drumul până la 2 miliarde ar fi tot drumul până acolo la partea de sus. 651 00:41:01,480 --> 00:41:05,880 Deci, cu alte cuvinte, atunci când vorbim despre memoria RAM sau în termeni de octeți, 652 00:41:05,880 --> 00:41:11,500 înseamnă doar că cineva a decis ce la numărul fiecare dintre aceste bucăți de memorie. 653 00:41:11,500 --> 00:41:16,650 Deci, atunci când aveți nevoie de 32 biti pentru un int sau aveți nevoie de 8 biți pentru un char, 654 00:41:16,650 --> 00:41:18,840 în cazul în care nu se ajunge în memorie? 655 00:41:18,840 --> 00:41:22,350 >> Conceptual, ajung doar până la partea de jos a acest lucru numit stivă. 656 00:41:22,350 --> 00:41:25,870 Dar ceea ce este interesant este acum când principala apelează o funcție - 657 00:41:25,870 --> 00:41:28,750 să presupunem că o funcție numită foo, doar un nume arbitrar - 658 00:41:28,750 --> 00:41:32,330 ceea ce se întâmplă este principal este de la partea de jos a acestei stivei de memorie; 659 00:41:32,330 --> 00:41:35,680 foo acum se pune pe partea de sus a principal în memorie. 660 00:41:35,680 --> 00:41:40,990 Deci, orice variabile locale, care a foo ajung fel de conceptual de mai sus, în principal cele. 661 00:41:40,990 --> 00:41:47,070 În cazul în care solicită o altă funcție foo bar numit, aceste variabile ajung aici. 662 00:41:47,070 --> 00:41:50,120 Dacă bara solicită altceva, aici, aici, aici. 663 00:41:50,120 --> 00:41:53,830 Deci, ce e interesant despre executarea unui program este că pe măsură ce numesc funcții 664 00:41:53,830 --> 00:41:57,750 și în care aceste funcții apel funcții și în care aceste funcții apel funcții, 665 00:41:57,750 --> 00:42:01,470 vă construi acest teanc de funcții în memorie. 666 00:42:01,470 --> 00:42:06,890 Și numai o dată la funcția întoarce începi obtinerea că memoria înapoi. 667 00:42:06,890 --> 00:42:10,860 Deci, una dintre cele mai simple moduri de a alerga afară de memorie într-un program de calculator 668 00:42:10,860 --> 00:42:14,360 este de a scrie funcții care nu returnează. 669 00:42:14,360 --> 00:42:18,900 Deci, de exemplu, să demonstreze la fel de mult cu un program intenționat buggy. 670 00:42:18,900 --> 00:42:22,230 Lasă-mă să merg mai departe și nu includ # , 671 00:42:22,230 --> 00:42:25,000 int main (void), 672 00:42:25,000 --> 00:42:32,940 și am de gând să fac în timp ce (2> 1), care, probabil, nu se va schimba vreodată pe noi, 673 00:42:32,940 --> 00:42:37,560 și lasă-mă să mergeți mai departe și de a face acum printf. 674 00:42:37,560 --> 00:42:40,700 De fapt, asta va fi mai puțin interesant vizual. Hai să facem asta. 675 00:42:40,700 --> 00:42:50,240 Pentru int i = 0; i> 0 - hai face această greșeală - i + +. 676 00:42:50,240 --> 00:42:52,720 Și să nu printf aici. Să practica ceea ce am fost predica. 677 00:42:52,720 --> 00:43:00,190 Să aveți o metodă de aici, cor nule, si vom spune: int i, 678 00:43:00,190 --> 00:43:06,830 și apoi am de gând să spun printf - nu, hai să facem asta mai interesant. 679 00:43:06,830 --> 00:43:15,790 Să nu imprima nimic, la toate. Hai să facem asta: cor (i). 680 00:43:15,790 --> 00:43:20,390 Bine. Deci, aceasta este buggy, deoarece de ce? 681 00:43:20,390 --> 00:43:23,380 Fac asta ca merg, deoarece programul nu face de fapt nimic de interes. 682 00:43:23,380 --> 00:43:25,320 >> Dar asta nu e gol. 683 00:43:25,320 --> 00:43:29,630 Scopul este de a scrie un program a cărui funcție principală ce face, aparent? 684 00:43:30,720 --> 00:43:32,860 Suna sine. Și, de fapt, nu avem nevoie de bucla. 685 00:43:32,860 --> 00:43:37,200 Să simplifica chiar și acest lucru doar în așa fel încât să nu se piardă din vedere într-adevăr bug fundamentală. 686 00:43:37,200 --> 00:43:39,640 Solicită Principalele cor să cânte niște cor, 687 00:43:39,640 --> 00:43:41,440 apoi am facut o prostie si am avut apel refren refren 688 00:43:41,440 --> 00:43:43,760 Am presupus că altcineva a fost de gând să-l pună în aplicare, poate, 689 00:43:43,760 --> 00:43:47,210 iar acum acest lucru nu este de gând să compileze încă. Trebuie să fac ce? 690 00:43:47,210 --> 00:43:49,970 Am nevoie de prototip, amintiți. 691 00:43:49,970 --> 00:43:56,110 Așa că am nevoie să aibă până aici, cor void (int i); 692 00:43:56,110 --> 00:43:59,210 Deci, acum, dacă mă duc aici - de fapt, hai să utilizați fereastra mai mare. 693 00:43:59,210 --> 00:44:01,980 Să mergem mai departe și să facă cor. 694 00:44:01,980 --> 00:44:06,490 Să mergem mai departe și să facă cor. 695 00:44:06,490 --> 00:44:08,370 Utilizarea identificator nedeclarate i. 696 00:44:08,370 --> 00:44:12,500 Oh, asta a fost o prostie. Nu avem nevoie de argument. Hai să facem asta. 697 00:44:12,500 --> 00:44:16,370 Aș vrea să am inceput acest drum. Acesta ar fi fost un program mult mai ușor să scrie. 698 00:44:16,370 --> 00:44:25,590 Acolo. Acum hai să mergem pe la fereastra terminalul meu, rulați din nou zăngănit, și aici vom merge. 699 00:44:25,590 --> 00:44:28,460 Asta a fost foarte rapid. 700 00:44:28,460 --> 00:44:31,150 Ce sa întâmplat de fapt, doar, totuși? 701 00:44:31,150 --> 00:44:33,730 Ei bine, acum voi adăuga linia de imprimare astfel încât să putem vedea. 702 00:44:33,730 --> 00:44:43,490 Permiteți-mi să spun printf ("Sunt aici") - nu variabile. Ne vom lăsa așa. 703 00:44:43,490 --> 00:44:47,480 Lasă-mă să fac reluare. Lasă-mă să rulați din nou cor. 704 00:44:47,480 --> 00:44:57,380 Și ... haide. Continuă. 705 00:44:57,380 --> 00:44:59,930 Ca o paranteza, de ce nu a sa prăbușit încă? 706 00:44:59,930 --> 00:45:02,080 Eroare de segmentare sa întâmplat super rapid înainte. 707 00:45:02,080 --> 00:45:06,570 [Răspuns studentul nu pot fi auzite] >> Exact. Deci, este nevoie de timp pentru a imprima, nu? 708 00:45:06,570 --> 00:45:08,610 Este nevoie doar de mai mult de lucru pe partea computerului. 709 00:45:08,610 --> 00:45:10,620 Și acolo este: Segmentation fault. 710 00:45:10,620 --> 00:45:12,340 >> Deci, observați cât de programe rapide a alerga. 711 00:45:12,340 --> 00:45:14,130 Dacă nu sunteți de imprimare nimic, super rapid. 712 00:45:14,130 --> 00:45:18,770 Dar avem încă această eroare de segmentare pentru că ceea ce se întâmplă? 713 00:45:18,770 --> 00:45:21,210 Dacă te gândești la modul în care memoria computerului este stabilită, 714 00:45:21,210 --> 00:45:28,740 aceasta se întâmplă să fie principal, dar aici sa numim doar acest cor, și hai să numim acest cor. 715 00:45:28,740 --> 00:45:34,550 Și acum, dacă eu fac estetica mele drept, acest lucru este doar de gând să spun cor, cor, cor, 716 00:45:34,550 --> 00:45:40,550 cor, cor, cor, cor, nauseum anunț, și în cele din urmă, ceea ce se va întâmpla? 717 00:45:40,550 --> 00:45:45,630 Dacă imaginea de ansamblu, literalmente, este aceasta, ceea ce se întâmplă pur și simplu conceptual? 718 00:45:46,520 --> 00:45:48,630 Depășirile coșul de fum heap. 719 00:45:48,630 --> 00:45:51,940 Sau, mai rău, ai depășit totul, inclusiv segmentul de text, 720 00:45:51,940 --> 00:45:54,590 care este 0s și 1s, care reprezintă programul dumneavoastră. 721 00:45:54,590 --> 00:45:57,080 Pe scurt, aceasta este doar rău super, super. 722 00:45:57,080 --> 00:45:58,830 Programul tău a scăpat de sub control. 723 00:45:58,830 --> 00:46:01,220 Te folosind memorie mult mai mult decât ați intenționat 724 00:46:01,220 --> 00:46:03,960 toate din cauza o greșeală stupidă, în acest caz, 725 00:46:03,960 --> 00:46:08,040 sau, în acest caz, o functie foarte deliberat făcut el însuși de asteptare. 726 00:46:08,040 --> 00:46:09,500 Acum, acest lucru nu este așa de rău. 727 00:46:09,500 --> 00:46:13,800 Funcții de asteptare s-au de fapt, are o mare putere atunci când este utilizat în mod corect. 728 00:46:13,800 --> 00:46:15,800 Eu nu l-am folosit corect aici. 729 00:46:15,800 --> 00:46:19,780 Deci, acest lucru nu este așa de rău, dar faptul că nu m-am opri de fapt, eu asteptare 730 00:46:19,780 --> 00:46:23,520 Este o slăbiciune fundamentală a acestui program aici. 731 00:46:23,520 --> 00:46:26,400 Deci, unde mergem cu toate astea? Ce se întâmplă cu adevărat? 732 00:46:26,400 --> 00:46:30,340 Când am apela funcția incrementului ca facem în aceste exemple, 733 00:46:30,340 --> 00:46:33,420 Am o valoare cum ar fi 1, care trec inch 734 00:46:33,420 --> 00:46:37,570 Trec într-o copie a numărul 1, așa se întâmplă următoarele. 735 00:46:37,570 --> 00:46:44,240 Să mergem în creștere de exemplu, tipul ăsta chiar aici. 736 00:46:44,240 --> 00:46:46,870 Iată ce se intampla de fapt. 737 00:46:46,870 --> 00:46:53,400 Când m-am sun creștere și trec în x, pictural, ce se întâmplă aici este aceasta. 738 00:46:53,400 --> 00:46:59,520 >> Dacă am avea valoarea de 1 depozitate aici și eu sun de fapt creștere, 739 00:46:59,520 --> 00:47:04,330 care este acum numit cor - iPad este aruncat de pe mine aici. 740 00:47:04,330 --> 00:47:09,760 Să numim această creștere, și nu știm ce această funcție este următoarea va fi. 741 00:47:09,760 --> 00:47:14,840 Deci, ce se intampla de fapt este pe aici pe undeva, în principal am o bucată de memorie 742 00:47:14,840 --> 00:47:17,000 care este stocarea numărul 1. 743 00:47:17,000 --> 00:47:19,380 Când m-am apel creștere, eu sunt, folosind un alt segment de memorie, 744 00:47:19,380 --> 00:47:21,230 dar acum am copia 1. 745 00:47:21,230 --> 00:47:26,660 Când m-am incrementa această valoare, aceasta devine 2, 746 00:47:26,660 --> 00:47:30,560 dar apoi ce se întâmplă cât mai curând se întoarce de creștere? 747 00:47:30,560 --> 00:47:33,630 Această memorie se doar dat înapoi la sistemul de operare, 748 00:47:33,630 --> 00:47:37,450 ceea ce înseamnă că tot ce-ai făcut nimic util. 749 00:47:37,450 --> 00:47:43,120 1, care a fost inițial incluse în principal, de fapt este încă acolo. 750 00:47:43,120 --> 00:47:44,890 Deci, unde mergem cu asta? 751 00:47:44,890 --> 00:47:49,770 Se pare că, în memoria aveți această secvență back-to-back de octeți 752 00:47:49,770 --> 00:47:53,050 pe care le pot pune lucrurile în, și se pare că le-am văzut deja ceva 753 00:47:53,050 --> 00:47:55,390 care implică punerea lucrurile spate în spate în spate în spate. 754 00:47:55,390 --> 00:47:59,860 Ce este un șir bazat pe săptămâna 1 și săptămâna 2 acum? 755 00:48:00,020 --> 00:48:01,980 E doar o colectie de caractere. 756 00:48:01,980 --> 00:48:04,310 Deci, se dovedește la fel ca tine poate pune numere în memorie, 757 00:48:04,310 --> 00:48:06,990 În mod similar se pot pune de caractere în memorie. 758 00:48:06,990 --> 00:48:10,530 Și, odată ce vom începe caractere punerea în memorie spate în spate în spate în spate, 759 00:48:10,530 --> 00:48:13,620 se dovedește că utilizarea simplă a lucrurilor pentru ca o buclă sau o buclă în timp ce, 760 00:48:13,620 --> 00:48:17,170 putem itera de la stânga la dreapta de-a lungul caractere dintr-un șir 761 00:48:17,170 --> 00:48:20,600 și începe să masaj-le in diferite personaje cu totul - 762 00:48:20,600 --> 00:48:23,370 ar putea deveni un b, b ar putea deveni c - 763 00:48:23,370 --> 00:48:27,780 astfel că în cele din urmă, putem lua o teză română care face de fapt sens 764 00:48:27,780 --> 00:48:30,310 și de a converti fiecare dintre aceste scrisori o la un moment dat 765 00:48:30,310 --> 00:48:34,400 de mers pe jos, prin memoria calculatorului nostru la stânga la dreapta pentru a cripta de fapt. 766 00:48:34,400 --> 00:48:35,810 Așa că haideți să ne cinci minute pauză aici, 767 00:48:35,810 --> 00:48:40,730 și când ne vom întoarce, vom începe acest proces de codare de informații. 768 00:48:42,020 --> 00:48:43,520 >> Bine. 769 00:48:43,520 --> 00:48:48,070 Înainte de a se arunca cu capul în unele noi Crypto si aceste lucruri numite matrice, 770 00:48:48,070 --> 00:48:51,470 lasă-mă să pauză pentru orice întrebări pentru că mă simt ca și cum aș într-adevăr un fel de confuze 771 00:48:51,470 --> 00:48:54,080 unele dintre aceste subiecte. Așa că hai să stabilească acum dacă putem. 772 00:48:54,080 --> 00:48:58,700 Tocmai am vorbit despre valorile de returnare, am vorbit despre argumente, 773 00:48:58,700 --> 00:49:03,250 și am vorbit despre această noțiune, pe care vom reveni în următoarele săptămâni să vină, 774 00:49:03,250 --> 00:49:08,720 de vizualizare memorie ca o gramada de aceste tăvi suprapuse, ca să spunem așa, 775 00:49:08,720 --> 00:49:12,660 de jos in sus, astfel încât fiecare tavă pe care se pune pe stiva 776 00:49:12,660 --> 00:49:16,530 reprezintă o funcție care este în prezent fiind numit. 777 00:49:17,900 --> 00:49:20,260 Alte întrebări? 778 00:49:20,260 --> 00:49:22,640 Permiteți-mi să pun o întrebare aici. 779 00:49:22,640 --> 00:49:27,890 Lasă-mă să simplifice această înapoi la ceea ce a fost înainte o parte din Q & A. noastre anterioare 780 00:49:27,890 --> 00:49:35,570 Faptul că incrementului are paranteză deschisă, numărul de int, închis paranteza - 781 00:49:35,570 --> 00:49:39,110 ceea ce nu reprezintă numărul de int? 782 00:49:39,110 --> 00:49:42,790 [Elev] Un argument. Un argument >>. Bine. Dar ce e un argument? 783 00:49:42,790 --> 00:49:46,370 [Răspuns studentul nu pot fi auzite] >> Ce e asta? >> [Elev] Ceva ce treci inch 784 00:49:46,370 --> 00:49:49,940 Ok, deci ceva ce treci inch Și, în general, mai mult, e doar de intrare. 785 00:49:49,940 --> 00:49:52,450 Dacă ați fost scris o funcție și scop care funcționează în viața 786 00:49:52,450 --> 00:49:55,770 este de a face ceva un pic diferit de fiecare dată când îl folosiți, 787 00:49:55,770 --> 00:50:00,110 atunci singura cale pentru ca să se întâmple într-adevăr ar părea să fie să îi furnizeze cu intrare 788 00:50:00,110 --> 00:50:03,510 astfel încât să poată face ceva diferit cu care de fiecare dată de intrare. 789 00:50:03,510 --> 00:50:06,650 >> Deci, trebuie să specificați două lucruri atunci când o functie are intrare. 790 00:50:06,650 --> 00:50:09,590 Ai nevoie de a specifica numele pe care doriți să dea la intrare 791 00:50:09,590 --> 00:50:12,700 pur și simplu pentru confortul dvs., astfel încât să puteți referi la ea 792 00:50:12,700 --> 00:50:16,540 în funcție de care te-ai scris sunt, așa cum am făcut-o aici, în linia 32. 793 00:50:16,540 --> 00:50:20,800 Dar de asemenea, trebuie să specificați tipul său, deoarece C este un limbaj de programare 794 00:50:20,800 --> 00:50:25,940 ca doar prevede că în cazul în care doriți o variabilă, trebuie să spun calculatorului ce tip de date este, 795 00:50:25,940 --> 00:50:30,200 în mare parte, astfel încât să știe câți biți să le aloce pentru variabila 796 00:50:30,200 --> 00:50:33,020 deoarece ar putea fi 6 - Îmi pare rău, nu va fi 6. 797 00:50:33,020 --> 00:50:37,080 Acesta poate fi de 16, acesta poate fi de 8, acesta poate fi de 32, chiar 64, 798 00:50:37,080 --> 00:50:39,130 dar calculatorul trebuie să știe. 799 00:50:39,130 --> 00:50:43,180 Acum, int pe partea stângă reprezintă ceea ce, prin contrast? 800 00:50:46,350 --> 00:50:48,850 [Răspuns studentul nu pot fi auzite] >> Ce e asta? >> [Elev] Tipul de funcție. 801 00:50:48,850 --> 00:50:53,610 Tipul de o funcție și, mai precis, tipul rezultatelor acestuia. Corect. 802 00:50:53,610 --> 00:50:57,380 Deci, întrucât lucru în paranteze reprezintă intrarea acestuia, dacă este cazul, 803 00:50:57,380 --> 00:50:59,660 lucru pentru a stânga reprezintă producției sale. 804 00:50:59,660 --> 00:51:03,530 Și în acest caz, se pare că o creștere întoarce int, 805 00:51:03,530 --> 00:51:07,690 și așa int este tipul întoarsă de această funcție. 806 00:51:07,690 --> 00:51:09,340 Ce înseamnă să se întoarcă? 807 00:51:09,340 --> 00:51:15,090 Literalmente, utilizați retur cheie și apoi, dacă ceea ce se întorc 808 00:51:15,090 --> 00:51:18,600 la dreptul de cuvinte cheie este un număr întreg, 809 00:51:18,600 --> 00:51:21,660 apoi că este într-adevăr în concordanță cu ceea ce am promis. 810 00:51:21,660 --> 00:51:26,410 Tu nu ar putea face așa ceva - Bună ziua, lume, - pentru că este un șir. 811 00:51:26,410 --> 00:51:28,860 >> Evident, acesta nu este un număr întreg. 812 00:51:28,860 --> 00:51:33,140 Deci, pe scurt, sarcina este într-adevăr pe noi, programator, să fie specifice 813 00:51:33,140 --> 00:51:37,770 cu privire la ceea ce suntem și de a se întoarce apoi mergi de fapt, despre returna. 814 00:51:37,770 --> 00:51:43,440 Contextul aici este faptul că memoria computerului este un gigabyte, 2 gigaocteți - 815 00:51:43,440 --> 00:51:45,920 orice - poate e mai mult, poate e mai putin, 816 00:51:45,920 --> 00:51:49,050 dar care computerul îl vede ca având secțiuni diferite. 817 00:51:49,050 --> 00:51:51,200 Ceva nu merge acolo, ceva merge acolo sus, 818 00:51:51,200 --> 00:51:54,290 chestii diferite merge în mijloc, iar astăzi vom începe doar spune povestea, 819 00:51:54,290 --> 00:51:56,340 dar ne vom reveni la această dată peste. 820 00:51:56,340 --> 00:51:59,980 Pentru moment, singura piesă de memorie ne pasă cu adevărat despre este segmentul de text 821 00:51:59,980 --> 00:52:03,360 pentru că reprezintă doar 0s și 1s, care a zăngănit emise. 822 00:52:03,360 --> 00:52:06,050 Deci, atunci când executați o comandă de la tastatură ca a.out 823 00:52:06,050 --> 00:52:09,110 sau faceți clic dublu o icoana de pe Mac OS sau Windows, 824 00:52:09,110 --> 00:52:11,880 programul este încărcat de pe hard disk în memoria RAM 825 00:52:11,880 --> 00:52:16,330 și este plopped la partea de sus a memoria RAM a computerului dumneavoastră, ca să spunem așa. 826 00:52:16,330 --> 00:52:20,450 Între timp, ca program începe să curgă și principalele este chemat 827 00:52:20,450 --> 00:52:23,640 în programul scris sau programul Microsoft sau Apple a scris, 828 00:52:23,640 --> 00:52:27,860 oricare dintre variabilele sale locale ajung acolo, la partea de jos a memoriei computerului. 829 00:52:27,860 --> 00:52:33,230 Dar, în cazul în care solicită un alt principalele funcții pe care ea însăși are variabile sau argumente, acestea sfârșesc deasupra. 830 00:52:33,230 --> 00:52:36,680 Și dacă această funcție solicită ceva, ei sfârșesc deasupra ei, deasupra ei, deasupra ei. 831 00:52:36,680 --> 00:52:41,460 >> Și doar o singură dată o funcție se face de executare nu teancul de tăvi, ca să spunem așa, 832 00:52:41,460 --> 00:52:43,240 începe pentru a obține mai mici și mai mici. 833 00:52:43,240 --> 00:52:48,250 Și asta este ceea ce, atunci, într-o coajă de nucă, explică de ce atunci când apelați cub 834 00:52:48,250 --> 00:52:51,550 sau te sun creștere, sunteți trece într-o copie a valorii. 835 00:52:51,550 --> 00:52:55,520 Și ce înseamnă asta pictural este că sunteți scris literalmente numărul 1 836 00:52:55,520 --> 00:53:00,460 într-o altă parte a memoriei, care schimba 1 la 2 în cazul incrementului 837 00:53:00,460 --> 00:53:04,820 sau la un 8, în cazul cubului și apoi aruncat departe că memoria 838 00:53:04,820 --> 00:53:09,140 de îndată ce creșterea sau revine cub funcția. Întrebare. 839 00:53:09,140 --> 00:53:12,900 [Elev] În cazul în care sunt stocate variabilele globale? 840 00:53:12,900 --> 00:53:18,100 Variabilele globale sunt stocate în ceea ce se numește în prezent, datele inițializată sau date neinițializate, 841 00:53:18,100 --> 00:53:21,920 diferența fiind în cazul în care aveți o variabilă globală și îl atribuiți o valoare imediat 842 00:53:21,920 --> 00:53:24,640 cu semnul egal, se termină în partea de sus acolo, 843 00:53:24,640 --> 00:53:29,200 și dacă spune doar x int; cu nici o valoare, aceasta ajunge ușor mai scăzute în memoria RAM 844 00:53:29,200 --> 00:53:31,710 pur și simplu prin convenție. 845 00:53:31,710 --> 00:53:34,940 Alte întrebări? Bine. 846 00:53:34,940 --> 00:53:37,340 Deci, această imagine va veni înapoi ca vom ajunge mai puternice 847 00:53:37,340 --> 00:53:39,170 cu ceea ce putem face cu calculatorul, 848 00:53:39,170 --> 00:53:42,720 dar pentru acum, haideți să o introducere scurtă criptografie, 849 00:53:42,720 --> 00:53:46,080 un anumit tip de criptografie care nu rezolva toate problemele lumii 850 00:53:46,080 --> 00:53:47,720 dar nu rezolva unele dintre ele. 851 00:53:47,720 --> 00:53:51,700 În acest caz aici, avem ceva numit secret de-cheie criptografiei. 852 00:53:51,700 --> 00:53:56,410 Secret-cheie criptografiei, așa cum sugerează și numele, provine de securitate de la un secret. 853 00:53:56,410 --> 00:54:00,690 >> De exemplu, dacă te-ai întors în școala primară și ai fost trece un pic scrisoare de dragoste secretă 854 00:54:00,690 --> 00:54:04,850 pentru băiat sau fată ai fost de concasare pe, dacă ai vrut să treci prin această notă publicul, 855 00:54:04,850 --> 00:54:08,380 probabil că nu ar scrie o astfel de notă în limba engleză sau orice limba dvs. maternă este. 856 00:54:08,380 --> 00:54:13,340 Mai degrabă, s-ar putea cripta sau s-ar putea doar trimite-le un mesaj text în aceste zile. 857 00:54:13,340 --> 00:54:15,460 Dar s-ar putea trece de fapt, le-o notă de-a lungul sala de clasă. 858 00:54:15,460 --> 00:54:18,700 Și pentru a face acest lucru în siguranță, în așa fel încât prietenii și profesorilor 859 00:54:18,700 --> 00:54:22,650 Nu știu ce scrii, s-ar putea veni cu un algoritm destul de simplu, 860 00:54:22,650 --> 00:54:25,920 tânără, deși s-ar putea să fie, pentru a se lupta doar cuvintele. 861 00:54:25,920 --> 00:54:28,130 Deci, în loc de a scrie un s-ar putea scrie b, 862 00:54:28,130 --> 00:54:30,220 în loc de b s-ar putea scrie c, 863 00:54:30,220 --> 00:54:32,140 în loc de c s-ar putea scrie d, și așa mai departe. 864 00:54:32,140 --> 00:54:34,360 Sau ai putea veni cu o traducere mai sofisticat 865 00:54:34,360 --> 00:54:36,720 de scrisori către diferite litere. 866 00:54:36,720 --> 00:54:39,740 Dar captura este băiat sau fată căreia îi trimiteți această notă 867 00:54:39,740 --> 00:54:45,020 trebuie să știi ceva, care este ceea ce, în mod evident? >> [Elev] Ceea ce trimit. 868 00:54:45,020 --> 00:54:49,720 Ce secret este, ca ceea ce este faptul că de cartografiere între lui și a lui b și c și a lui d'uri. 869 00:54:49,720 --> 00:54:54,650 Este adăugând doar 1 pentru fiecare dintre litere pentru a merge de la A la B, B la C? 870 00:54:54,650 --> 00:54:56,670 Este mult mai complex decât asta? 871 00:54:56,670 --> 00:55:01,540 >> Deci tu și zdrobi dvs. trebuie să aibă aceste informații secrete, 872 00:55:01,540 --> 00:55:03,190 dar e un fel de Catch-22 aici. 873 00:55:03,190 --> 00:55:06,830 Dacă aceasta este prima dată când trimiteți acest scrisoare de dragoste prin clasa, 874 00:55:06,830 --> 00:55:10,720 cum este faptul că băiatul sau fata de gând să știu ce este secretul, chiar? 875 00:55:10,720 --> 00:55:13,930 Deci, secretul-cheie criptografic nu rezolva toate problemele lumii, 876 00:55:13,930 --> 00:55:16,320 și nu există de fapt, o relatie aici, pe care ne vom întoarce la sfârșitul semestrului spre lui. 877 00:55:16,320 --> 00:55:25,110 În mod similar nu mai mulți dintre noi cunosc pe cineva care lucreaza, de exemplu, de la Amazon.com, 878 00:55:25,110 --> 00:55:28,190 și, totuși, mulți dintre noi au cumparat, probabil, lucruri pe Amazon.com, 879 00:55:28,190 --> 00:55:31,990 și am fost învățați să se presupună că aceste tranzacții e-commerce sunt sigure. 880 00:55:31,990 --> 00:55:36,470 URL-ul, probabil, spune https, poate exista o pictogramă lacăt prostuță mică undeva, 881 00:55:36,470 --> 00:55:39,930 e un fel de criptografie securizarea informațiilor dvs. de card de credit 882 00:55:39,930 --> 00:55:42,160 între tine și Amazon.com. 883 00:55:42,160 --> 00:55:45,430 Și totuși, în cazul în care criptografia implică cunoașterea vreun secret 884 00:55:45,430 --> 00:55:48,620 și totuși eu nu cunosc pe nimeni de la Amazon și am aranjat cu siguranță, nu orice fel de secrete 885 00:55:48,620 --> 00:55:52,710 cu cineva de la Amazon, cum este calculatorul meu sau browser-ul meu face acest lucru? 886 00:55:52,710 --> 00:55:55,720 Se pare că există și alte tipuri de criptografie cu totul, care rezolva această problemă. 887 00:55:55,720 --> 00:55:57,670 Dar pentru ziua de azi, ne vom concentra pe unul simplu 888 00:55:57,670 --> 00:56:00,290 în cazul în care vă puteți aranja în avans pentru a cunoaște vreun secret 889 00:56:00,290 --> 00:56:03,760 cum ar fi o cartografiere sau unele dintre un lui și a lui B. 890 00:56:03,760 --> 00:56:05,840 Și procesul de criptografie implică, în general, acest lucru. 891 00:56:05,840 --> 00:56:08,620 Ai un text simplu, descrise aici, la stânga, 892 00:56:08,620 --> 00:56:12,930 ce îl rulați printr-un fel de algoritm sau procedurii de criptarea ea - 893 00:56:12,930 --> 00:56:15,100 Poate că e doar o devine b, c b. devine - 894 00:56:15,100 --> 00:56:17,490 și apoi termina cu text cifrat. 895 00:56:17,490 --> 00:56:20,380 Între timp, odată ce v-ați îndrăgostit primește această notă secretă, 896 00:56:20,380 --> 00:56:24,200 el sau ea trebuie să-l decripta apoi, în general, prin inversarea acestui algoritm 897 00:56:24,200 --> 00:56:27,190 în așa fel încât să mă întorc text simplu. 898 00:56:27,190 --> 00:56:28,960 Momentan nu sunt încarnări fizice ale acestui. 899 00:56:28,960 --> 00:56:31,680 >> De exemplu, acest lucru este un pic decodor inel secrete, 900 00:56:31,680 --> 00:56:35,110 și acest lucru este un inel în sensul că există două cadrane aici. 901 00:56:35,110 --> 00:56:38,490 La periferia afara de acest lucru, nu e litere de la A la Z, 902 00:56:38,490 --> 00:56:40,340 deși acestea sunt în ordine aleatorie, 903 00:56:40,340 --> 00:56:42,880 și pe interior, nu e de fapt niste numere 904 00:56:42,880 --> 00:56:46,620 astfel că prin acest inel vă puteți transforma un fel de afara, dar nu în interiorul 905 00:56:46,620 --> 00:56:49,140 în scopul de a alinia numere cu litere. 906 00:56:49,140 --> 00:56:53,020 Dintr-un film numit o poveste de Crăciun, veți vedea că Ralphie mic 907 00:56:53,020 --> 00:56:58,000 a fost atât de dornic să ne dăm seama ce mesaj secret orfane Annie Little a fost să-l 908 00:56:58,000 --> 00:57:02,570 care au fost comunicate, cred, în formă de mesaje numerice de pe o cutie de cereale 909 00:57:02,570 --> 00:57:07,220 și a trebuit să acumuleze toate cărțile mici care au venit în cutie de cereale, 910 00:57:07,220 --> 00:57:09,770 trebuia să le expediați prin poștă, în, trebuia să te întorci inelul decodor secrete 911 00:57:09,770 --> 00:57:13,910 astfel încât să vă puteți da seama în cele din urmă ceea ce este de cartografiere între litere și cifre 912 00:57:13,910 --> 00:57:15,550 sau scrisori și scrisori. 913 00:57:15,550 --> 00:57:19,520 Cum într-un calculator putem merge despre punere în aplicare sau care reprezintă lucruri de genul asta? 914 00:57:19,520 --> 00:57:22,560 Avem nevoie de o modalitate de a ne exprima un pic mai flexibil 915 00:57:22,560 --> 00:57:25,080 decat variabilele noastre până în prezent au permis. 916 00:57:25,080 --> 00:57:29,000 Am avut Ints, am avut de caractere, am avut flotoare și duble și câteva, 917 00:57:29,000 --> 00:57:34,200 dar cei care sunt piese individuale de memorie, care nu permit într-adevăr ne-a exprima lucrurile 918 00:57:34,200 --> 00:57:36,440 cum ar fi cuvinte și propoziții și fraze. 919 00:57:36,440 --> 00:57:38,630 Într-adevăr, am sunat siruri de astfel de lucruri, 920 00:57:38,630 --> 00:57:42,660 dar promit că acesta este de fapt doar o simplificare în bibliotecă CS50 921 00:57:42,660 --> 00:57:45,540 că suntem intenționează să coaja înapoi. 922 00:57:45,540 --> 00:57:47,500 Și deci haideți să încep să fac asta aici. 923 00:57:47,500 --> 00:57:49,840 Lasă-mă să mergeți mai departe și de a deschide un fișier - 924 00:57:49,840 --> 00:57:54,100 toate aceste fișiere sunt disponibile, ca de obicei, on-line - array.c numitul 925 00:57:54,100 --> 00:57:58,960 pentru a rezolva o problemă fără legătură cu siruri de caractere, dar că înfățișează o imagine aici 926 00:57:58,960 --> 00:58:01,520 de modul în care am putea folosi ceva numit-o matrice. 927 00:58:01,520 --> 00:58:04,050 >> Un tablou este un tip de date. 928 00:58:04,050 --> 00:58:10,730 E un tip de variabile de felul care are mai multe tipuri de date mai mici în interiorul de ea 929 00:58:10,730 --> 00:58:12,680 spate în spate la spate în spate. 930 00:58:12,680 --> 00:58:16,980 Deci, de exemplu, în cazul în care am vrut să scrie un mic program care vă oferă dumneavoastră medie Quiz 931 00:58:16,980 --> 00:58:19,780 pentru un curs care are ca 50 2 teste, 932 00:58:19,780 --> 00:58:23,450 ai putea foarte ușor a scrie acest program bazat chiar pe unele din material de săptămâna trecută 933 00:58:23,450 --> 00:58:28,830 prin utilizarea GetInt și un cuplu de variabile: int quiz1, int quiz2. 934 00:58:28,830 --> 00:58:30,550 Și e destul de simplu. 935 00:58:30,550 --> 00:58:33,500 E poate 10, 20 de linii de cod maxim pentru a pune în aplicare un program de 936 00:58:33,500 --> 00:58:38,940 care cere utilizatorului pentru rezultate test 2 și apoi calculează media lor 937 00:58:38,940 --> 00:58:42,020 adăugându-le împreună, împărțind cu 2, iar apoi tipărirea rezultatelor. 938 00:58:42,020 --> 00:58:46,400 Am putea face destul de ușor, probabil, că acum, după un numar de minute. 939 00:58:46,400 --> 00:58:49,450 Dar problema este că presupunem că 50 au avut 3 sau 4 chestionare. 940 00:58:49,450 --> 00:58:52,830 Să presupunem că ai vrut să utilizați același program pentru o clasă care a avut săptămânal teste. 941 00:58:52,830 --> 00:58:55,100 Gândiți-vă la o clasă care a săptămânal teste. 942 00:58:55,100 --> 00:58:58,840 Dacă există 16 sau atât de săptămâni într-un semestru, acum ai 16 variabile: 943 00:58:58,840 --> 00:59:03,030 int quiz1, int quiz2, int quiz3, int quiz4. 944 00:59:03,030 --> 00:59:06,870 De îndată ce începe să vedeți acest concediere, această copierea și lipirea de cod, 945 00:59:06,870 --> 00:59:09,810 aceasta ar trebui să înceapă să te fac să doriți exista un mod mai bun. 946 00:59:09,810 --> 00:59:13,610 Și din fericire, din cauza matrice există. Deci, hai sa facem asta. 947 00:59:13,610 --> 00:59:16,700 În primul rând, permiteți-mi să introducă un lucru foarte simplu, care nu ne-am folosit până acum, 948 00:59:16,700 --> 00:59:18,820 dar veți vedea, ocazional, în cod. 949 00:59:18,820 --> 00:59:21,270 >> Aceasta este ceea ce se numește, în general, o constantă. 950 00:59:21,270 --> 00:59:24,410 Deci, este o constantă în sensul că niciodată nu schimbă această valoare. 951 00:59:24,410 --> 00:59:26,450 Convenție umană atunci când se creează o constantă 952 00:59:26,450 --> 00:59:30,420 este de a folosi toate majuscule doar pentru că într-adevăr iese în evidență în cod, 953 00:59:30,420 --> 00:59:34,270 și cuvântul cheie speciale pe care le utilizați în C # define este. 954 00:59:34,270 --> 00:59:39,970 Deci, noi spunem # define, apoi un spațiu, apoi cuvântul pe care doriți să o utilizați pentru numele lui constanta 955 00:59:39,970 --> 00:59:41,730 și apoi valoarea constantă. 956 00:59:41,730 --> 00:59:44,710 Observa acest lucru este diferit de la atribuirea ceva la o variabilă. 957 00:59:44,710 --> 00:59:46,430 Nu e nici o inscriere egal, nu e nici o virgulă. 958 00:59:46,430 --> 00:59:49,140 Aceasta este ceea ce este, în general, cunoscut sub numele de o directivă preprocesor, 959 00:59:49,140 --> 00:59:50,840 dar mai mult pe altă dată. 960 00:59:50,840 --> 00:59:56,350 Pentru moment, acest lucru creează o valoare invariabilă numit QUIZ 961 00:59:56,350 --> 00:59:58,290 a căror valoare reală numerică este 2. 962 00:59:58,290 --> 01:00:02,180 Deci, oriunde vedeți teste, Teste, Teste pe parcursul acestui fișier, 963 01:00:02,180 --> 01:00:04,230 asta e doar numărul 2. 964 01:00:04,230 --> 01:00:06,550 Dacă mă uit la principal acum, să vedem cum funcționează. 965 01:00:06,550 --> 01:00:09,770 În primul rând se pare un pic criptic, dar e tot chestii din săptămâna 1. 966 01:00:09,770 --> 01:00:12,210 Solicita utilizatorul pentru clasele. Cum facem acest lucru? 967 01:00:12,210 --> 01:00:17,350 În linia 22 - aceasta este într-adevăr partea suculent - Declar un flotor 968 01:00:17,350 --> 01:00:23,240 dar nu doar un singur flotor. Sunt declara, mai degraba, o serie de valori în virgulă mobilă. 969 01:00:23,240 --> 01:00:27,700 Această variabilă va fi numit clase, așa cum se sugerează aici, 970 01:00:27,700 --> 01:00:31,420 dar singura bucată de noua sintaxă, atunci sunt aceste paranteze pătrate. 971 01:00:31,420 --> 01:00:37,280 Faptul că am spus clasele float și apoi suportului deschise și apoi un număr - 972 01:00:37,280 --> 01:00:40,980 observați dacă aceasta este o constantă acest lucru este la fel ca noi am făcut asta - 973 01:00:40,980 --> 01:00:46,840 aceasta înseamnă, "Hei calculator, da-mi 2 flotoare și să numim în mod colectiv le note." 974 01:00:46,840 --> 01:00:51,780 >> Acest lucru este în contrast cu un proces mult mai plictisitor ca aceasta: float grade1; 975 01:00:51,780 --> 01:00:54,580 float grade2, și așa mai departe. 976 01:00:54,580 --> 01:00:58,310 Deci, un tablou ne permite să pună în aplicare această idee, dar mult mai puțin messily, 977 01:00:58,310 --> 01:01:04,560 în așa fel încât să putem scrie o linie de cod in loc de, sa zicem, 16 pentru un semestru de 16 săptămâni. 978 01:01:04,560 --> 01:01:09,060 Nu am vrut să-hard codul 2 pentru că dacă te gândești la asta acum logic, 979 01:01:09,060 --> 01:01:12,560 Presupun că anul viitor CS50 modificări la 3 concursuri de schimb 980 01:01:12,560 --> 01:01:15,010 si am avut numărul 2 aici, am avut numărul 2 aici, 981 01:01:15,010 --> 01:01:17,210 Am avut numărul 2 aici, numărul 2 aici. 982 01:01:17,210 --> 01:01:19,890 Ea devine foarte obositor si foarte usor de bară 983 01:01:19,890 --> 01:01:26,550 și de a schimba accidental o valoare 3 și dor de o alta valoare de 2. 984 01:01:26,550 --> 01:01:30,660 Așa că am de gând să schimb abstracte această distanță și de a folosi această constantă faptul că, 985 01:01:30,660 --> 01:01:32,520 cum sugerează și numele, niciodată modificări. 986 01:01:32,520 --> 01:01:35,870 Și acum, indiferent dacă avem diferite chestionare acest an sau viitor, 987 01:01:35,870 --> 01:01:39,380 Trebuie doar să-l schimbați într-un singur loc aici, la partea de sus. 988 01:01:39,380 --> 01:01:41,230 Deci, asta e tot o constantă este. 989 01:01:41,230 --> 01:01:47,100 Între timp, noua caracteristică conceptuală este aceea a unei matrice. 990 01:01:47,100 --> 01:01:55,030 Deci parantezele pătrate Dă-mi asta pluteste in mai multe și îmi permite să le numim colectiv clase aici. 991 01:01:55,030 --> 01:01:56,720 Deci, acum să vedem ce am de gând să fac. 992 01:01:56,720 --> 01:01:59,220 Aici, în linia 24 este începutul unei bucle pentru. 993 01:01:59,220 --> 01:02:03,380 >> Acest lucru este într-adevăr nimic extravagant. Este folosind doar QUIZ în loc de un număr de hard-coded. 994 01:02:03,380 --> 01:02:06,740 Dar nu e nimic intelectual diferit acolo de săptămâna trecută. 995 01:02:06,740 --> 01:02:11,650 Aceasta este doar printf, deci printf ("Quiz d #% d din%:") 996 01:02:11,650 --> 01:02:16,670 pentru că vreau doar să imprime-mi dea testul numarul 1 din 2 și apoi 2 din 2. 997 01:02:16,670 --> 01:02:18,480 Deci, acesta este un lucru pur estetic. 998 01:02:18,480 --> 01:02:21,000 Dar partea interesantă este acum în linia 27. 999 01:02:21,000 --> 01:02:27,840 În scopul de a umple intr-unul din cele două substituenților, cu o valoare în virgulă mobilă, 1000 01:02:27,840 --> 01:02:29,640 folosi din nou paranteze pătrate. 1001 01:02:29,640 --> 01:02:35,170 În acest caz, eu i folosind, deoarece acest lucru pentru bucla a început cu i egaleze ce valoare, aparent? 1002 01:02:35,170 --> 01:02:36,670 [Elev] 0. >> [Malan] 0. 1003 01:02:36,670 --> 01:02:40,990 Astfel, pe prima iterație a acestui bucla, este ca și cum am scris acest lucru în cod, 1004 01:02:40,990 --> 01:02:46,310 dar pe a doua repetare a acestei bucla, este ca și cum am scris asta în codul meu. 1005 01:02:46,310 --> 01:02:49,970 Dar faptul că mă folosind o variabilă este perfect, deoarece, după cum sugerează și numele, 1006 01:02:49,970 --> 01:02:52,600 e variind valoarea sa pe fiecare iterație, 1007 01:02:52,600 --> 01:02:55,900 așa că eu sunt de umplere această matrice-un singur loc la un moment dat. 1008 01:02:55,900 --> 01:02:57,380 Ce înseamnă acest tablou arata? 1009 01:02:57,380 --> 01:03:01,570 Motivul pentru care am desenat dreptunghiul super-simplu pe ecran aici înainte a fost pentru acest motiv. 1010 01:03:01,570 --> 01:03:05,590 O matrice este doar o bucată de memorie, urmat de un alt segment de memorie 1011 01:03:05,590 --> 01:03:08,570 urmat de un alt segment de memorie și așa mai departe. 1012 01:03:08,570 --> 01:03:13,120 Deci, dacă matrice mea este de mărimea 2, în acest caz aici, tot aș fi făcut 1013 01:03:13,120 --> 01:03:20,200 prin tastarea în scorurile test mele place aici - am luat 100 la aceasta, și apoi am primit un 99 de data asta - 1014 01:03:20,200 --> 01:03:24,970 atunci această memorie ar putea să nu fi folosit chiar și pentru că am cerut doar calculatorul 1015 01:03:24,970 --> 01:03:26,840 pentru o gamă largă de dimensiuni 2. 1016 01:03:26,840 --> 01:03:28,600 Aceste piete sunt încă acolo, nu? 1017 01:03:28,600 --> 01:03:32,670 Ai inca 2 GB de RAM, chiar daca esti doar cer pentru 2 flotoare. 1018 01:03:32,670 --> 01:03:36,840 Deci, ideea din spatele tablourilor este faptul că computerul are doar o bucată de memorie 1019 01:03:36,840 --> 01:03:41,340 și distribuie proporțional apoi bucati mai mici spate în spate la spate în spate. 1020 01:03:41,340 --> 01:03:43,310 Si pentru ca e tot o matrice este. 1021 01:03:43,310 --> 01:03:47,350 >> E o bucată de contiguu în interiorul memoriei pe care le pot pune lucrurile. 1022 01:03:47,350 --> 01:03:50,700 Acest lucru se întâmplă pentru a face apoi doar câteva aritmetică plictisitor. 1023 01:03:50,700 --> 01:03:54,640 Dacă aș defila în jos aici, acest lucru este în cazul în care am repeta apoi peste matrice. 1024 01:03:54,640 --> 01:03:58,020 Am venit cu însumarea tuturor valorilor din matrice, 1025 01:03:58,020 --> 01:04:02,470 si apoi am folosi funcția rundă aici pentru a face de fapt suma împărțit Teste. 1026 01:04:02,470 --> 01:04:06,320 Dar permiteți-mi să mișcați mâna mea la acel ca un fel de aritmetică suficient pentru acum. 1027 01:04:06,320 --> 01:04:08,370 Dar tot ce face pentru mine în cele din urmă este o medie de calcul. 1028 01:04:08,370 --> 01:04:13,580 Deci, primul test, plus două Quiz împărțit la 2 și apoi imprimarea ca un întreg. 1029 01:04:13,580 --> 01:04:17,280 Dar haideți să acum trecerea la o alt exemplu numit șir1, 1030 01:04:17,280 --> 01:04:20,700 care relevă o imagine similară, dar siruri de caractere folosind. 1031 01:04:20,700 --> 01:04:23,940 Lasă-mă să mergeți mai departe și de a simplifica aceasta doar pentru un moment. 1032 01:04:23,940 --> 01:04:27,090 Iartă-indentarea pentru acum. 1033 01:04:27,090 --> 01:04:30,870 Comunicarea în linia 19 din acest exemplu, am obține un șir de utilizator. 1034 01:04:30,870 --> 01:04:34,640 Dar observați ce fac eu următoare, în linii 22 mai departe. 1035 01:04:34,640 --> 01:04:41,250 Sunt de fapt iterarea de la I până la - și acest lucru este un truc nou - strlen, lungimea șirului. 1036 01:04:41,250 --> 01:04:44,880 Aceasta este o funcție care vine cu C, care, dacă-l dați un șir, 1037 01:04:44,880 --> 01:04:47,730 vă spune cât de multe caractere sunt în șir. Asta e tot. 1038 01:04:47,730 --> 01:04:51,550 Și faptul că e strlen în loc de lungimea șirului este doar pentru că e mai succintă. 1039 01:04:51,550 --> 01:04:55,100 Treizeci de ani în urmă, oamenii îi plăcea să scriu lucrurile așa cum succint posibil, 1040 01:04:55,100 --> 01:04:57,630 așa că am păstrat această convenție aici. 1041 01:04:57,630 --> 01:05:00,660 i + + înseamnă doar incrementa I, în fiecare iterație. 1042 01:05:00,660 --> 01:05:02,990 Și observați acum acest lucru, ceea ce este cu adevarat interesant. 1043 01:05:02,990 --> 01:05:09,180 În linia 24, am spus, "Computer, dă-mi un personaj, 8 biți, și îl numesc c". 1044 01:05:09,180 --> 01:05:12,630 Dar ce este acest lucru pe partea dreaptă spui? 1045 01:05:13,490 --> 01:05:16,530 În limba engleză, ceea ce nu reprezintă faptul că? 1046 01:05:16,530 --> 01:05:18,730 [Elev] primul caracter din matrice. 1047 01:05:18,730 --> 01:05:20,790 Exact. Dă-mi primul caracter din matrice. 1048 01:05:20,790 --> 01:05:24,090 Sau, mai general, dă-mi-lea caracter din matrice. 1049 01:05:24,090 --> 01:05:26,100 Și dau seama că e important acum ca, oamenii de știință de calculator, 1050 01:05:26,100 --> 01:05:27,890 suntem de fapt, numărând de la 0. 1051 01:05:27,890 --> 01:05:29,720 >> Nu aveți putere de apreciere pentru a începe a face acest lucru. 1052 01:05:29,720 --> 01:05:34,160 Acum trebuie să se comporte în conformitate cu așteptările computerului și numărați de la 0 1053 01:05:34,160 --> 01:05:38,180 deoarece [0] va fi primul caracter într-un șir, 1054 01:05:38,180 --> 01:05:42,150 [1] va fi a doua, [2], va fi al treilea, și așa mai departe. 1055 01:05:42,150 --> 01:05:49,720 Deci acest program, în cazul în care l-am compila, aceasta este din nou șir1, asa ca șir1, 1056 01:05:49,720 --> 01:05:54,670 si acum am alerga șir1 în fereastra terminalul meu. 1057 01:05:54,670 --> 01:05:58,330 Se așteaptă de intrare, așa că am de gând să tastați în David, Enter, 1058 01:05:58,330 --> 01:06:02,540 iar acum se imprimă David totul pe diferite linii, deoarece Notă ceea ce fac. 1059 01:06:02,540 --> 01:06:05,820 Sunt imprimarea unui caracter la un moment dat. 1060 01:06:05,820 --> 01:06:10,100 Nu vom intra în detalii astăzi pe asta, dar am eliminat un moment în urmă acest cec aici. 1061 01:06:10,100 --> 01:06:15,480 Se pare că, dacă utilizatorul este obraznic,, contradictorie, sau pur și simplu confuz 1062 01:06:15,480 --> 01:06:20,210 aveți posibilitatea să nu reușesc, de fapt pentru a da un șir de o anumită lungime. 1063 01:06:20,210 --> 01:06:22,860 Dacă te-a lovit tasta greșit pe tastatură, s-ar putea da nici un șir, la toate, 1064 01:06:22,860 --> 01:06:26,950 sau daca esti rău intenționat, ați putea încerca să lipiți într valoare de un gigabyte de un eseu 1065 01:06:26,950 --> 01:06:29,290 pentru a umple acest șir, și dacă computerul rămâne fără memorie, 1066 01:06:29,290 --> 01:06:32,710 se dovedește că vom primi înapoi această valoare specială numită NULL. 1067 01:06:32,710 --> 01:06:35,580 Deci, pentru moment, știu doar că există această valoare specială numită NULL 1068 01:06:35,580 --> 01:06:39,580 care ne va permite să verificați când suntem afară din memorie, printre alte lucruri. 1069 01:06:39,580 --> 01:06:45,630 Dar dacă am deschide acum șir2, observați o diferență aici. 1070 01:06:45,630 --> 01:06:48,210 Observa o diferență aici cu șir2. 1071 01:06:48,210 --> 01:06:51,340 Cu șir2, acest lucru pentru bucla este un pic diferit. 1072 01:06:51,340 --> 01:06:55,010 >> Lasă-mă să ștergeți valori nule, astfel încât să putem vorbi despre cei altă dată. 1073 01:06:55,010 --> 01:06:57,800 Ce este diferit la bucla pentru acest timp? 1074 01:06:59,620 --> 01:07:01,670 Mă pot întoarce la exemplul anterior. 1075 01:07:01,670 --> 01:07:08,580 Deci, asta e versiunea 2, aceasta este versiunea 1. 1, 2. 1076 01:07:08,580 --> 01:07:11,980 1, 2. 1077 01:07:13,520 --> 01:07:16,660 Apel strlen este locul unde? 1078 01:07:16,660 --> 01:07:18,860 Este scris în prima parte a buclei pentru. 1079 01:07:18,860 --> 01:07:21,830 Orice gânduri ca de ce fac asta? Da. 1080 01:07:21,830 --> 01:07:24,560 [Elev] Deci nu suna funcția de fiecare dată singur. 1081 01:07:24,560 --> 01:07:26,440 [Malan] Deci, nu ne numim funcția de fiecare dată singur. Exact. 1082 01:07:26,440 --> 01:07:28,300 Recall pentru bucle de la faptul că ei sunt super-simplu 1083 01:07:28,300 --> 01:07:31,770 odată ce fel de înțeles că aceasta este initializare, starea, si actualizare. 1084 01:07:31,770 --> 01:07:34,750 Problema este că această condiție se întâmplă la fiecare iterație a buclei. 1085 01:07:34,750 --> 01:07:40,010 Și astfel, în acest exemplu aici, ceea ce este rău despre faptul că aceasta este starea mea? 1086 01:07:40,010 --> 01:07:41,830 [Elev] Esti de asteptare strlen. 1087 01:07:41,830 --> 01:07:44,340 [Malan] Esti de asteptare strlen din nou și din nou și din nou. 1088 01:07:44,340 --> 01:07:47,410 Dar, odată ce l-am scris în David, lungimea șir care este de 5, 1089 01:07:47,410 --> 01:07:49,650 și nu se va schimba la fiecare iterație a buclei 1090 01:07:49,650 --> 01:07:51,670 deoarece șirul este încă D-o-v-i-d. 1091 01:07:51,670 --> 01:07:55,320 Deci, aceasta este o aluzie la ceea ce va deveni o idee în ce mai important 1092 01:07:55,320 --> 01:08:00,410 Cunoscut și drept o decizie de proiectare în cazul în care pur și simplu nu fac calculatorul face munca inutilă. 1093 01:08:00,410 --> 01:08:03,920 >> Doar ca o previzualizare a pset2, pset2 în ediția standard 1094 01:08:03,920 --> 01:08:07,030 este de gând să vă provoc să pună în aplicare de fapt, un numar de cifruri, 1095 01:08:07,030 --> 01:08:10,410 un numar de algoritmi de criptare, astfel încât să puteți atât cripta 1096 01:08:10,410 --> 01:08:13,840 și decripta mesaje secrete de mult, cum ar fi Ralphie de acolo decodat. 1097 01:08:13,840 --> 01:08:16,810 În ediția de hacker pset2, vom merge un pic mai departe. 1098 01:08:16,810 --> 01:08:19,649 Mergem să dea un fișier dintr-un sistem informatic actual 1099 01:08:19,649 --> 01:08:23,479 care conține o grămadă de nume de utilizator si parole criptate reale, 1100 01:08:23,479 --> 01:08:26,939 și provocare pentru ediția hacker va fi de a sparge aceste parole 1101 01:08:26,939 --> 01:08:33,200 și dau seama ce criptografia sau ce secrete a fost folosit pentru a genera de fapt, aceste parole. 1102 01:08:33,200 --> 01:08:36,109 Și vom face acest lucru prin utilizarea o caracteristică nouă de aici C 1103 01:08:36,109 --> 01:08:40,630 că am să-ți dau doar un demo de cunoscut sub numele de argumente de linie de comandă. 1104 01:08:40,630 --> 01:08:44,229 Se pare că, așa cum unii dintre voi poate au văzut în secțiune sau în manuale, 1105 01:08:44,229 --> 01:08:48,260 principal nu are întotdeauna să fie anulate în paranteze. 1106 01:08:48,260 --> 01:08:52,430 Se pare că principala poate fi, de asemenea, scris ca aceasta, cu două argumente, 1107 01:08:52,430 --> 01:08:56,870 argc și argv, în cazul în care argc este numarul de cuvinte 1108 01:08:56,870 --> 01:09:00,020 pe care le tastați după numele programului pe linia de comandă dvs. 1109 01:09:00,020 --> 01:09:03,420 și argv este cuvintele reale. 1110 01:09:03,420 --> 01:09:07,540 Și, după cum sugerează parantezele pătrate de acolo, argv este aparent o matrice. 1111 01:09:07,540 --> 01:09:12,210 O să fie un șir de caractere, după un șir după un șir în memorie. 1112 01:09:12,210 --> 01:09:16,010 >> Deci, ceea ce am de gând să fie capabil să facă începând cu PSET 2 este ceva de genul asta. 1113 01:09:16,010 --> 01:09:21,350 Dacă am face argv1, care este un exemplu ne vom întoarce la luni, și rulați-l, 1114 01:09:21,350 --> 01:09:23,370 observa că acesta nu pare să facă nimic încă. 1115 01:09:23,370 --> 01:09:25,490 Este doar imprimă propriul nume. 1116 01:09:25,490 --> 01:09:31,479 Dar dacă spun la revedere clasa, observați că acest program aparent iterează 1117 01:09:31,479 --> 01:09:35,479 pe fiecare dintre cuvintele care au fost introduse la prompt. 1118 01:09:35,479 --> 01:09:41,630 Și mijloacele prin care vom avea acces la cuvintele pe care utilizatorul a tastat la prompt 1119 01:09:41,630 --> 01:09:49,160 este de a schimba principal pornind de la acest week-end int main (void) la int main (argc, argv) 1120 01:09:49,160 --> 01:09:52,050 și, astfel, se vor naste argumente de linie de comandă. 1121 01:09:52,050 --> 01:09:57,100 Și odată ce ați obține cu adevărat sofisticat la acest lucru, vei fi capabil de a scrie programe cu adevărat trippy 1122 01:09:57,100 --> 01:09:59,610 cum ar fi asta de aici, care merge de mai sus și dincolo de 1123 01:09:59,610 --> 01:10:03,940 unele dintre funcționalități care le-am făcut până acum, dar tot destul de puternic. 1124 01:10:03,940 --> 01:10:08,950 >> Deci, vom lăsa acest lucru cu acest lucru pe ecran, iar noi va vom vedea pe luni. 1125 01:10:17,570 --> 01:10:20,000 >> [CS50.TV]