[Powered by Google Translate] David J. MALAN: În regulă. Acest lucru este CS50, iar acest lucru este sfârșitul de doua saptamani. Dacă vă așteptați să fie în jurul valorii de foame mâine pe vremea asta, știu că vom să convoace un grup mic de mâine, joi, 1:15 PM. Nu e aici, această adresă URL dacă doriți să RSVP. Spațiul este limitat, așa încât vă rugăm ierta dacă formularul a umplut de dată când completați asta. O altă adresă URL totuși că ar putea fi de interes este aceasta. Deci, în doar despre timp de o lună, cursul este de gând să fie puse la dispoziție toate mai larg prin EDX, prin care oameni de pe Internet va fi posibilitatea de a urmări de-a lungul, se angajeze în curs destul de activ, de fapt. Vor fi folosind Aparatura CS50 CS50 și Discuta si de cele mai multe diverse instrumente software care deja am fost folosind acest semestru. Iar una dintre inițiativele ne-am dori să-și asume ca un experiment în acest an este de a vedea cat de mult continut putem traduce în alte vorbit și limbile scrise. Deci, dacă s-ar putea avea un interes de a participa la acest proiect, prin care va vom oferi transcrieri de engleză și subtitluri pentru a cursului prelegeri și seminarii și pantaloni scurți și secțiunile și cum ar fi - daca vorbesti fluent sau scrie fluent o altă limbă, ne-ar plăcea să vă angajeze în acest proiect, prin care te ia pe una sau mai multe dintre videoclipuri, traducându-le într-o limbă pe care cunosc destul de bine. Pentru a vă da un sentiment de interfață, există această interfață web-based de utilizare că vom folosi, care va crea în esență, o interfață de utilizare ca asta. Acest lucru a fost mă învăța ceva de Halloween în urmă. Și pe partea dreapta acolo, în negru de lângă aceste timbre de timp, veți vedea lucruri diferite care au iesit din gura mea în acea zi. Și apoi sub ea, vei fi capabil de a traduce în altă limbă. Exact ceea ce de cartografiere este între, în acest caz, Engleza și, să zicem, spaniolă. Deci e de fapt un foarte user-friendly instrument. Puteți derula rapid înainte și foarte ușor, cu scurtături de la tastatură. Deci, dacă v-ar dori să ia parte la acest experiment și au cuvintele tale văzute și citite de mii de oameni potențial acolo, vă rugăm să vă simțiți liber să participe. Acum, un cuvânt despre pisoi de luni, ca nu cumva ne-am trimis un excesiv înfricoșător mesaj. Își dau seama că așa cum sugerează orelor de program și în secțiunile sugerează, de proiectare a cursului este foarte mult de a fi studenți și colaborarea vorbesc de a lucra prin intermediul seturi de probleme și probleme împreună. Și într-adevăr linia de doar vine în jos pentru a, din nou, munca pe care în cele din urmă ar trebui să prezinte ar trebui să fie a ta. Și așa e, destul de sincer - în ore de birou, e absolut normal - este în totalitate de așteptat, chiar și - să fie chat cu unele Prietenii de langa tine. În cazul în care el sau ea se luptă cu un subiect, si tu esti ca, oh, lasa bine mi să vă dau o idee de o linie de cod pe care am scris. Asta e bine. Asta se întâmplă. Și asta e foarte mult favorabil, cred, cu procesul de învățare. În cazul în care linia, din nou, se trecut este atunci când capul este înclinat fel de peste aici pentru mult prea multe secunde sau minute pentru care într-adevăr să aibă doar a fost o oportunitate de deblocare pentru prietenul tău. Și cu siguranță, atunci când lucrurile se schimbate prin e-mail și Dropbox și ca, acolo este linia. Deci, prin toate mijloacele, se simt confortabil și se simt încurajați să chat cu prietenii și colegii despre psets și mai mult. Și dau seama doar că ceea ce trimiteți în cele din urmă ar trebui să fie într-adevăr produsul de creația voastră și nu de altcineva. Deci, în aceeași ordine de idei de creaturi de plus, s-ar putea cunosc pe tipul ăsta aici. Deci, aceasta este un film groaznic brânzos de ani în urmă. La văzut cineva pe aici Spaceballs? Bine. Deci, un număr bun aici. Deci asta este modul nostru minunat academică de introducere astăzi în cele din urmă noțiunea de criptografie. Și astfel una dintre problemele specifice domeniilor de PSET 2, care va veni out mâine seară târziu, este de a arunca cu capul în lume de criptografie, care este arta de a criptare sau de codare informații. Și în cele din urmă se referă la această lume de securitate. Acum, cea mai mare securitate pentru noi, vine sub forma de mecanisme destul de banale. Toate dintre noi au numele de utilizator și parole. Și noi toți avem nume de utilizator și parole foarte proaste, cel mai probabil. Dacă parola este aceeași pe site-urile multiple, care nu e, probabil, cea mai buna idee, așa cum vom discuta spre sfârșitul semestrului lui. Dacă parola este scris într-o notă lipicios - nu gluma - pe dvs. monitor, că prea nu este neapărat cel mai bun design, dar destul de comună fenomen. Și dacă nu ești utilizați criptografia pentru a cripta parolele tale, ele sunt deosebit de vulnerabile. Deci, dacă crezi că ești deștept fiind super-de a avea un cuvânt ascuns documenta undeva pe hard disk care are toate parolele tale, dar E într-un dosar pe care nimeni nu o să uite în aceea că nu prea este un foarte securizat mecanism. Și deci ce PSET 2 va introduce această artă este de criptografie și codare de informații, astfel că lucrurile sunt cum ar fi parolele toate mai sigur. Deci, ca să motiveze această problemă foarte real-lume, cu o foarte non-real-lume scenariu, lasă-mă să te prezint la unul dintre clipurile noastre preferate aici, din această film, Spaceballs. [PLAYBACK VIDEO] -Casca, tu diavol, ce se întâmplă? Ce faci cu fiica mea? -Permiteți-mi să introducă chirurg genial plastic tineri, dr. Philip Schlotkin, cel mai mare de locuri de muncă om nas în întregul univers și Beverly Hills. -Alteță. -Nas de locuri de muncă? Nu înțeleg. A avut deja un loc de muncă nas. A fost un dulce 16 prezent. -Nu, nu e ceea ce crezi. E mult, mult mai rău. Dacă nu-mi dai combinație a scutului de aer, Dr. Schlotkin va da fiica înapoi nasul ei vechi. -Nu! În cazul în care ai luat-o? -În regulă. Îi voi spune. Îi voi spune. -Nu, tati, nu. Tu nu trebuie. -Ai dreptate, draga mea. Voi dor de nas nou. Dar eu nu le va spune combinația, indiferent de ce. -Foarte bine. Dr. Schlotkin, face cel mai rau. -Cu plăcere. -Nu! Stai, stai. Îi voi spune. Îi voi spune. -Știam că va funcționa. În regulă, dă-mi-. -Combinație este unul. -One. -One. -Doi. -Doi. -Doi. -Trei -Trei. -Trei. -Patru. -Patru. -Patru. Cinci- -Cinci. -Cinci. -Deci combinația este unu, doi, trei, patru, cinci. Asta e stupid combinația care l-am auzit în viața mea. Asta e genul de lucru un idiot ar avea asupra bagajele sale. -Mulțumesc, înălțimea voastră. -Ce-ai făcut? -M-am intors de pe perete. -Nu, nu. Ai oprit tot filmul. -Cred că am apăsat pe butonul greșit. -Ei bine, pune-l la loc. Pune filmul înapoi pe. -Da, domnule. Da, d-le. -Să mergem, Erna. Vino, Gretchen. Desigur, știi că va trebui în continuare să vă factura pentru asta. -Ei bine, a mers? Unde e poarta? -Ea a lucrat, domnule. Avem combinația. -Mare. Acum putem lua fiecare ultima suflare de aer proaspăt de pe planeta Druidia. Care e combinatia? -Unu, doi, trei, patru, cinci. -Unu, doi, trei, patru, cinci? -Da. -Asta e uimitor. Am aceeași combinație pe bagajele mele. Pregătiți Spaceball 1 pentru plecare imediata. -Da, domnule. Și-a schimba combinația de la bagajele mele. -Au! [VIDEO PLAYBACK END] David J. MALAN: Un film uimitor acum, ar trebui să vezi toate. Deci, aici este contextul care vine cu date nesecurizate o oportunitate de a cripta ea și să-l coate. Și astfel aceasta, de exemplu, este un exemplu de un mesaj criptat. Acest fapt spune ceva în limba engleză. Dar nu e clar în întregime evident. Și vom veni cerc complet astăzi să tachineze pe langa ce acest secret Mesajul este aici. Dar în lumea reală de calculatoare, lucrurile nu arata chiar ca acestea ar putea Expresii fi limba engleză. De exemplu, aceasta este ceea ce s-ar putea găsi pe un Linux sau Mac sau standard, Calculator Unix într-un fișier care a fost o dată la un moment numit parola fișier. În prezent, acesta a fost mutat la alte locuri. Dar dacă te uiți în locul potrivit pe un sistem, veți vedea nu numai dvs. numele de utilizator sau a altor persoane de pe sistem, dar veți vedea o Versiunea criptată a parolei lor. Într-adevăr, cuvântul cripta acolo sugerează că lucrurile următoare este criptat. Și această serie de litere și caractere aleatorii și a numerelor și așa mai departe pot fi decriptate doar prin cunoașterea, în general, un secret - un cuvânt secret, un număr secret. Și astfel, într-adevăr, arta de a criptografiei în cele din urmă se reduce la încredere unor sortare și știind ceva ce altcineva nu o face. Vom explora în detaliu un pic mai mult în prezent și în PSET să vină. Și acum un cuvânt pe pass / fail. Deci în special, după cum unii dintre voi s-au prăbușit în PSET 1, aparat, și o lume foarte nou pentru tine, a dat seama că frustrările și dificultăți confuzie și doar tehnică sunt de așteptat. Mai ales cu PSET în primul rând, în cazul în care există doar atât de mult nouă, doar pentru a familiarizat cu ls și CD-uri și toate aceste comenzi arcane într-un mediu nou. Și asta e separat de materialul real și programarea în sine. Deci dau seama, de asemenea, că există cu siguranță oră de birou care exista ca structură de sprijin. Secțiuni începe această duminică vine. Dar cel mai important, dacă te simți pur și simplu că acest lucru nu este lume pentru tine, dai seama că într-adevăr nu ia doar de timp. Și dacă nu ar pentru această oportunitate de ani în urmă pentru mine de a lua o clasă admis / respins, sincer, n-aș fi stabilit chiar piciorul în sala de clasă. Și vă puteți schimba acest lucru până, să zicem, al cincilea luni cursului. Deci, dacă ești pe margine acum, dau seama că, mai degrabă decât capul într-un alt apele cu totul, cu siguranță, nu ia în considerare doar schimbarea pentru a trece / nu. Din nou, nu e chiar această cultură aici, de la Harvard de a lua lucrurile admis / respins, deoarece toată lumea vrea cu adevărat să realizeze sau overachieve. Dar sincer, aceasta este o modalitate minunată de a încerca ceva care ar putea să nu fie familiar pentru tine. Si vei ajunge să faci, în cele mai multe cazuri destul de fine, probabil, spre surprinderea ta. Și în termeni mai concreți, ceea ce cred că admis / respins, în general, nu, mai ales ca s-ar putea s-au confruntat cu PSET 0, dacă ați pus in 10 ore, 15 ore, 25 de ore în unele PSET - Și tu ești doar trage capul de perete, și este din ce în ce super-noaptea târziu, dar v-ați luat PSET ca 90% din drum, stii tu chiar nu se poate da seama un lucru - treci / nu are într-adevăr de pe marginea unei clase de acest fel, în cazul în care aveți posibilitatea să sortați din fericire spun ok, știu că nu e perfect. Dar am muncit fundul meu off pe asta. Sunt destul de fericit cu ea în cazul în care sa încheiat. Și care vor satisface așteptările pentru pass / fail. Deci, nu țin minte. Bine. Deci, cei care au luptat pentru a utiliza Universitatea Harvard Wi-Fi știu că există un SSID CS50, o conexiune Wi-Fi plutesc în jurul valorii de faptul că te ar putea avea mai mult noroc pentru. E un pic ironic faptul că parola pentru acest lucru - dacă doriți să încercați conectarea la acest lucru pentru viteze mai bune și să ne anunțați dacă nu e mai bine - este unul, doi, trei, patru, cinci, tot drumul până la opt, deoarece opt este mai sigure decât cinci. Deci, dacă aveți nevoie de parola de acces Wi-Fi gratuit, conectați la CS50 fără fir aici. Unu, doi, trei, patru, cinci, șase, șapte, opt. Și mesaj pe CS50 Discutați dacă aveți încă probleme intermitente de conectivitate, și vom lăsa puterile care se cunosc pentru acest spațiu. Bine. Deci, un teaser rapidă, în special pentru aceia dintre voi care sunt băieți sau fete ventilator Apple a tuturor lucrurilor. Ceea ce am dezgropat din urmă cu câțiva ani a fost acest fișier aici, ilock.c, doar pentru a un fel de a face mai concret și mai complexă o parte din C mai mult de bază Programele pe care le-am fost scris. Așa că am deschis acest dosar, ilock.c. Este disponibil pe pagina de prelegeri pentru ziua de azi. Pe partea stângă, veți vedea o listă lungă de funcții. Deci, tipul care a scris acest scris o mulțime de funcții, mai mult decât principalul. El a folosit o grămadă de biblioteci aici. Și dacă vom începe parcurgerea, ce este de fapt este foarte în primul rând, cred că, crack pentru iPhone-ul original. Când ai vrut să jailbreak iPhone-ul original, ceea ce înseamnă despriponi l de la AT & T și, de fapt instala software-ul special pe ea și de a face lucruri că Apple nu a vrut ca oamenii să facă - Ei bine, cineva a avut timp să dau seama exact modul în care acestea ar putea exploata defecte de software, greseli, bug-uri, în software-ul de la Apple. Și astfel sa născut ilock.c. Că dacă îl compilat pe un computer și instalat pe un iPhone, care a fost conectat la computer prin, să zicem, un cablu USB, acest lucru ar da privilegii administrative sau rădăcină de pe iPhone-ul dvs. și vă permit să faci destul de mult ce vrei. Și astfel acolo a fost aceasta pisica joc fascinant și mouse-ul între Apple și restul lumii, în special în ceea ce ei, ca multe companii, încercați pentru a bloca lor lucruri în jos, astfel încât să puteți face doar cu el ceea ce intenționează. Dar, datorită oamenii de acest gen și înțelegerea lor de low-level detalii si, in acest caz, C de programare și o mulțime de constructe familiare că am început să joc cu, sunteți în stare să impulsioneze într-adevăr hardware-ul într-o manieră tu de cuviință, și nu neapărat o entitate corporativă. Deci, de exemplu, nu am nici o idee ce toate astea se face. Dar GetVersion sună destul de simplu. Si se pare ca aceasta este o funcție care această persoană a scris. Ia un fel de întreg ca un argument, nu se întoarce nimic, dar Apare la bucla cu o buclă de aici și o condiție în cazul în care, în cazul în care condiția, rupe, și cumva se referă la numerele de versiune. Dacă vom defila în jos - chiar dacă o mulțime de aceste cuvinte cheie vor fi noi, și există o mulțime de funcții de aici ne-am văzut niciodată și nu s-ar putea vedea vreodată peste cursul semestrului - la sfârșitul zilei, ea urmează aceleași reguli și logica pe care am fost jucându-se cu până în prezent. Deci, acest lucru este mult prea vechi pentru a sparge 3s iPhone 4s sau 5s sau mai curând, în aceste zile, dar știu că e foarte mult derivat din aceasta lume care ne-am scufundat în. Deci, haideți să aruncăm o privire la un exemplu ceva mai simplu. Aceasta, doar pentru a obține încălzit cu unele sintaxa si, de asemenea, unele alte date Tipul de care am vorbit despre, dar nu au cu adevărat văzut în C. Deci, aceasta este o fișier numit positive1.c. Și pe comentariile de la partea de sus, aceasta cere ca doar un utilizator furnizează o pozitivă număr. Deci e un exemplu de bucla do-timp, ceea ce este frumos pentru user-interactiv programe în cazul în care aveți nevoie pentru a spune utilizatorului de a face ceva. Și în cazul în care nu cooperează, țipi la ei sau de a respinge intrarea acestora. Cazul de față, am de gând să fac liniile 19 și 24, atât timp cât utilizatorul are Nu mi-a dat un număr pozitiv. Acum, acest detaliu aici, pe linia 18, de ce m-am declar n sus acest întreg construct looping spre deosebire de dreptul de lângă linia 22, unde am de fapt, grijă pentru a obține n? Da? [Neauzit] David J. MALAN: Da, deci această problemă a domeniului de aplicare. Și în termen laic, ce se referă la domeniul de aplicare? Da? [Neauzit] David J. MALAN: Poți vorbi un pic mai tare? DIFUZOR 1: În cazul în care vă puteți accesa o variabilă special. David J. MALAN: Perfect. În cazul în care puteți accesa o anumită variabilă. Și, în general, regula de degetul mare până acum a fost că domeniul de aplicare al unor variabilă este definită prin acolade cele mai recente buclat pe care le-ați văzut. Și astfel, în acest caz, dacă am făcut greșeala de a declara n pe linia 22, această linie ar merge. Mi-ar lua o int, și aș pune în faptul că n variabile, în linia 22. Dar care linia de cod ar avea acum nici o idee despre ce vorbesc despre? Deci 25, și se pare că 24, precum și, pentru că în acest caz, acesta nu intră în de acolade. Deci, doar un pic de o pacoste, dar foarte ușor de rezolvat prin simpla declarare a în afara variabilă a funcției de sine. Acum vom vedea mai târziu astăzi, poti sa mergi la un pas mai departe. Și ai putea obține chiar și un pic leneș - și acest lucru nu trebuie să fie recomandată, în general - dar ai putea obține chiar și leneș și a pus-o variabilă la nivel global, ca să spunem așa, nu în interiorul unei funcții, nu în interiorul unei bucle, dar în fișierul propriu-zis, în afara din toate funcțiile care le-ați scris, așa cum am făcut-o aici, pe linia 15. Dar acest lucru este, în general, dezaprobat. Dar realiza acest lucru este o soluție, uneori, la alte probleme, cum vom în cele din urmă a se vedea. Deci, pentru moment, ne vom lăsa așa. Dar hai sa vedem daca putem rescrie acest lucru doar pentru a începe a ne exprima o pic diferit. Deci acest program, doar pentru a fi clar, este positive1. Lasă-mă să merg mai departe aici și în fereastra terminalul meu face positive1, Enter. Compilează, bine. Am de gând să ruleze positive1, apăsați Enter. Eu cer ca să-mi dați un număr întreg pozitiv. Voi spune -1. Că nu au de lucru. 0, 99, care pare să funcționeze. Poate că nu testul cel mai riguros. Dar cel puțin e un cec bun-simț frumos că suntem pe drumul cel bun. Asa ca lasa-ma acum mergeți mai departe și să deschidă versiunea a doua a acestui. Și ceea ce este diferit deja? Aceasta implementează același lucru. Dar ceea ce sari pe cât de clar diferit de data asta? Da, deci acest bool în verde. Gedit a subliniat în verde acest cuvânt cheie cunoscut sub numele de bool, care este un tip de date. Ea nu vine incorporat în toate versiunile de C. Trebuie să includă o specifică bibliotecă. În cazul nostru, am inclus biblioteca CS50, astfel încât să au acces la bool. Dar, în linia 18, se pare că avem o valoare booleană aici numit recunoscători. Așa că am fi putut numit acest nimic. Dar am numit-o recunoscător doar pentru a transmite un fel de vreun sens semantic. Deci, inițial pe linia 18, eu sunt recunoscător pentru că pare că nu Valoarea booleană recunoscător este inițializat la fals în linia 18. Și apoi se pare că ceea ce am făcut aici, în linii 21 până la 23 este tocmai am un fel de rescrise logica mea. Deci, nu funcțional diferit. Dar, în linia 22 acum, am verificați dacă int utilizatorul a furnizat este mai mare decât 0, atunci am schimba pur și simplu valoarea recunoscător adevărate. Și de ce am face asta? Pentru că în linia 25, se pare, am de gând să verifice o condiție. Face acest lucru în timp ce bucla recunoscator este falsă. Deci, propun acest lucru ca pe o alternativa la versiunea una, pentru că e cel puțin un pic mai mult intuitiv, probabil. E un pic mai mult pământ în limba engleză. Deci, faceți următoarele în timp ce nu sunteți recunoscător sau în timp ce recunoscator este falsă. Și de data asta, de asemenea, am aparent nu-mi pasă să-și amintească ceea ce utilizatorul tastat în anunțul pentru ca nu exista nici n variabile. Deci, de fapt, eu - o minciună nevinovată acolo. Funcțional, programul este un pic diferit, odată ce vom ajunge la partea de jos a pentru că nu mă amintesc ce n este. Dar am vrut să demonstreze aici, de asemenea, că, deși le-am văzut și GetInt GetString fiind folosit pe partea dreaptă a unui semn egal, astfel, de departe, astfel încât ne amintim valoarea, punct de vedere tehnic, nu e strict necesar. Dacă pentru orice motiv, tu chiar nu-mi pasă pentru a salva valoarea, vrei doar pentru a verifica valoarea, observați că putem scrie pur și simplu acest lucru ca GetInt deschis paren, paren aproape. Această funcție este de gând să se întoarcă o valoare, așa cum ne-am spus. O să te dai înapoi un int. Și așa că, dacă mental că acest lucru se întâmplă de când am tip în 99, GetInt returnează numărul 99. Și așa conceptual, e ca și cum codul meu au fost de fapt acest lucru. Deci, dacă 99 este într-adevăr mai mare decât 0, atunci recunoscători devine adevărată. Apoi, linia 25 își dă seama ooh, am terminat pentru că eu sunt acum recunoscător. Și în linia 26, noi pur și simplu spunem, mulțumește pentru întreg pozitiv, orice ar fi sa întâmplat să fie. Acum, hai să facem o ușoară zahăr sintactică aici, ca să spunem așa. Să vedem dacă putem curăța această linie 25, cu această variație a treia și ultima în positive3. Deci, observați singura diferenta este acum ceea ce linie de cod? Da, așa 25. Și nu ne-am văzut într-adevăr acest truc doar încă. Dar am făcut-o vedea semn de exclamare de luni, ceea ce denotă ce? Deci, nu, sau negare. Astfel încât să ia o valoare Boolean și flip valoarea sa. Adevărat devine fals. Fals devine adevărată. Deci acest lucru, aș propune, este chiar un pic mai intuitiv de un mod de a scrierea codului pentru că am inițializa încă recunoscător fals. Eu fac tot următor. Am setat la adevărat recunoscător atunci când vine momentul. Dar acum puteți într-adevăr să traducem doar acest cod verbal la stânga la dreapta, în timp ce nu recunoscător. Deoarece bubuitură, sau semnul exclamării, denotă noțiunea de a nu, astfel încât în ​​timp Nu recunoscător. Deci, din nou, nu am introdus nici concepte noi pe sine. Am vorbit despre Booleans înapoi când am jucat cu Scratch. Dar dau seama acum putem începe doar scrierea de cod noastră în mai multe moduri diferite. Deci, în special în pset1, daca esti un fel de luptă pentru a afla modul de a scrie un alt program, cote sunt sunteți în noroc, deoarece acolo va fi nici numărul de soluții pe care le poate intampla la. De exemplu, acest lucru este doar trei chiar și pentru cea mai simplă de programe. Bine. Și acum amintesc luni, am plecat de pe acest act cu valori de returnare. Deci, pentru prima oară, am scris un program care nu are doar principală, ea are, de asemenea, funcția sa personalizat pe care l-am scris aici. Deci, în linia 31, prin 34, am implementat o funcție cub. Nu e complexă. E doar un nr de ori de ori pe o, în acest caz. Dar ceea ce este important despre el este că eu iau de intrare în formă de i Mă întorc de ieșire în formă de mai multe ori de mai multe ori o. Asa ca acum am capacitatea, la fel ca am folosit la cu printf singur, pentru a apela această funcție prin apelarea funcției cub. Și funcția de cub are nevoie de câteva intrare. Și funcția de cub returnează ceva de ieșire. Și astfel prin contrast, printf făcut ceva. Ea nu sa mai întors nimic din ce ne pasa - chiar dacă, în calitate de deoparte, o face sa returneze o valoare. Trebuie doar ignora-l, în general,. Printf făcut ceva. Ea a avut un efect secundar de imprimare a ecranului. Prin contrast aici, avem funcția de cub, care returnează de fapt ceva. Deci asta este, în general - pentru cei familiarizați cu acest lucru, este o idee destul de simplă. Dar, pentru cei mai puțin familiarizați cu această idee de a trece în intrări și obținerea ieșiri spate, hai să încercăm ceva simplu super. Este cineva confortabilă vine pe scenă pentru scurt timp? Trebuie sa fie confortabil cu o camera pe tine, la fel de bine. Da. Ok, care e numele tău? KEN: Ken. David J. MALAN: Ken. În regulă, Ken. Vino sus. Deci, Ken va fi o funcție de felul aici. Și hai să mergem mai departe și de a face acest lucru. Să luăm un pic de fantezie. Îmi pare bine. Bine ați venit la centrul scenei. Bine. Să lovit acest buton aici. Bine. Deci, aici ai o tabla modernă. Și ceea ce am este funcția principală, de exemplu. Iar eu nu am un iPad în mâna mea. Nu-mi aduc aminte cu adevărat cum să - ei bine, de fapt, nu se poate spune asta. Eu nu prea am scrierii de mână bună. Și astfel, prin urmare, vreau să imprimați ceva pe ecran pentru mine. Deci, eu sunt fiind programul principal. Și am de gând să vă spun acest lucru avem de scris-o în zgârieturi și puiul meu apoi trecând pe lângă tine o intrare. Deci, ca o prostie, deși acest exercițiu este, noțiunea de funcții și de asteptare un Funcția și returnarea o funcție într-adevăr se reduce la asta. Eu am Main. Tocmai am scris printf ("ceva"), pe ecran. Eu conduc acest program. Și, de îndată ce printf este chemat, este nevoie de un singur argument - sau un parametru, uneori - între ghilimele duble. Aici este acest argument. Eu o trecerea la Ken. Acum, el este o cutie neagră scris un numar de ani in urma, care aparent știe doar cum să imprimați lucruri pe ecran. Deci, executa. Asta nu e rău. Deci, foarte bine. Deci, acum, Ken se face de executare. Are el nevoie să-mi dai ceva inapoi? Deci, nu că ne-am văzut până acum. Din nou, printf se întoarce de fapt un număr. Dar vom ignora faptul că pentru acum, pentru că n-am folosit-o. Deci, asta e ea pentru Ken. Și acum vine inapoi principal de a executa - Principalul preia controlul asupra programului din nou, pentru că linia de cod, printf, se face de executare. Și vom merge despre modul nostru de executare indiferent de alte linii sunt acolo. Bine. Deci, acum să încercăm un exemplu ușor diferit. Și de data asta aici, hai să deselectați mai întâi ecranul de aici. Și de data asta, vom face funcția de cubaj. Dar de data asta, mă aștept la o valoare de ieșire. Așa că hai să mergem mai departe și de a face acest lucru. Asa ca acum am o linie de cod care spune x = cub (x). Deci, de fapt hai - Linia de cod, rechemare, arata ca aceasta. x = cub (x). Deci, cum este aceasta va funcționa? Așa că hai să mergem mai departe și vă va oferi un ecran alb din nou. Și am de gând să scrie acum în jos valoarea lui x, care la acest moment, în timp se întâmplă să fie, să zicem, 2, să-l păstrați simplu. Deci, am scris pe o bucată de hârtie valoarea de 2, care este x mea valoare. L-am preda la Ken. KEN: Si scriu doar răspunsul? David J. MALAN: Da, hai să scrie doar răspunsul. Bine. Și acum el trebuie să se întoarcă ceva. Așa - perfectă. Nisa segue. Așa că acum mi mâinile înapoi valoarea de 8, în acest caz. Și ce fac cu ea? Ei bine, de fapt, să vedem. Înscrieți-vă acest drept. Ce am de gând să fac cu ea? Acum am de gând să profit de această valoare și de fapt, se păstrează în cele biți aceleași în memorie. Dar Notă, eu sunt un fel de luptă aici. Sunt un pic confuz, deoarece în cazul în care nu scriu de fapt valoarea lui x? Pentru că ceea ce am făcut este doar fizic mana Ken o bucată de hârtie care a avut valoarea 2, care a fost x. Și într-adevăr, asta este exact ceea ce se întâmplă. Deci, se dovedește că, atunci când apelați o funcție, iar tu treci într-un argument ca "Hello World" sau te treci într-un argument cum ar fi 2, în general, ești trecerea într-o copie a acestui argument. Și așa cum am scris în jos numărul 2 aici, și a predat-Ken, că trebuie să înseamnă că am încă o copie a 2 Valoarea undeva. Pentru că, într-adevăr, acum că am ajuns înapoi valoarea 8, am nevoie să mă întorc în RAM și, de fapt scrie 8, unde am avut o dată numărul 2. Deci vizual retineti aceasta notiune de a trece în mod literal o copie a valorii. Ken face treaba, întinde-mi înapoi ceva - în acest caz, o valoare cum ar fi 8. Și atunci am să fac ceva cu acea valoare, dacă am doriți să-l păstrați în jurul valorii de. Deci, toate acestea vor fi mult prea familiarizat înainte de mult timp. Va multumesc foarte mult pentru această demonstrație aici, Ken. Bine. Foarte bine făcut. Deci, hai sa vedem cum că în cele din urmă se referă la unele dintre funcții de asteptare pe care le-am făcut aici. Așa că lasă-mă să mergeți mai departe și să ne aducă înapoi la exemplul cubaj aici. Și observați că, dacă vrem să începeți să luați acest fapt, în continuare, vom trebui să fie conștient de faptul că x număr care este în curs de trecut aici este diferit de ceea ce de fapt a fi trecut în funcția. Deci, din nou, aceasta a trecut prin copiere va deveni destul de Germane în doar o clipă. Deci, haideți să aruncăm o privire la ceva care nu funcționează destul de bine încă. Am de gând să merg mai departe și să deschidă un exemplu buggy treia, care este viciată de natura. Și se numește buggy3, și-l pune în aplicare o funcție de pompare. Deci, aici avem o funcție principală care a x și y arbitrar pregătit pentru a 1 și 2, respectiv. Am putea folosi GetInt, dar avem nevoie doar de un simplu exercițiu. Deci e greu codate ca 1 și 2. În linii 21 și 22, am imprima aparent afară x și y, câte unul pe fiecare rând. Apoi, pe linia 23, eu pretind am swapping aceste valori, punct, punct, punct. Eu numesc aparent o funcție în linia 24 numit de swap care ia două argumente. E complet legal pentru funcțiile de a lua două argumente. Am văzut printf o fac deja. Deci, de swap are aparent x și y. Și, după cum sugerează și numele, sper că o să schimba aceste două valori. Deci, apoi m-am pretinde pe linia 25, schimbat. Și am retipărită x și y în ipoteza că într-adevăr, le-am fost schimbate. Dar dacă am alerga de fapt, acest program - lasă-mă să deschid o fereastră de terminal. Lasă-mă să fac buggy3. După cum sugerează și numele, acest lucru nu se va termina bine. Pentru că atunci când am lovit Enter, observați că x este: 1. y este 2. Și totuși, la sfârșitul programului, ele sunt încă, de fapt, același lucru. Deci bazează pe demonstrarea chiar acum cu Ken, ceea ce se întâmplă de fapt aici? Ei bine, hai să se arunca cu capul în această funcție de swap. E foarte scurt. E doar câteva linii de cod lung. Dar ceea ce este problema fundamentală pe baza povestea simpla a declarat pentru aici cu Ken? De ce este rupt de swap? [Neauzit] Exact. Deci, suntem stocarea într-o copie care nu, variabila în sine. Cu alte cuvinte, de swap are două argumente aparent, un int. Și se numește mod arbitrar a și b. Și aici, am trecut în x și y, care sunt, respectiv, 1 și 2. Dar eu nu sunt literalmente trece în x. Nu mă literalmente trece în y. Mă trece o copie a lui x și o copie a lui y. E ca și cum aproape ca și cum ați copiat și inserat în schimb valorile pe care doriți să-l manipuleze, de fapt. Deci, dacă acesta este cazul, atunci când am, programul, începe de executare linia 35, apoi 36 - cand ajung la linia 37, în acest moment, în poveste, ceea ce este valoarea unei? În acest moment, în poveste, linia 37, care este valoarea unei la acest punct? Deci, ar trebui să fie doar 1. Corect? Pentru ca X a fost adoptată în ca prim argument. Și această funcție doar arbitrar este de asteptare argument în primul rând, o. În mod similar este y, al doilea argument. Și e doar asteptare arbitrar b doilea argument. Acum, această dihotomie este, de fapt destul de simplu explicat. Gândiți-vă la asta. Nici unul dintre noi nu s-au întâlnit persoana care a scris printf. Deci, cu siguranță, el sau ea nu are nici o idee despre ceea ce variabilele de cei 30 de ani mai târziu, se vor să fie numit. Deci, trebuie să existe o distincție între ceea ce numim variabile în Funcțiile pe care le scrieți și ceea ce voi numiți în funcțiile variabile esti de asteptare sau folosind. Deci, cu alte cuvinte, am scris variabile mele ca x si y. Dar dacă altcineva a scris funcția de swap, el sau ea cu siguranță n-ar ști ce variabilele mele sunt de gând să fie numit. Deci dau seama că acest lucru este de ce aveți această dualitate de nume. Punct de vedere tehnic, am putea face acest lucru prin coincidență. Dar ei vor fi în continuare în trecut drept copii. Ar fi doar o pura coincidenta punct de vedere estetic în cazul în care persoana care a scris swap-au folosit aceleași nume. Bine. Deci, în acest moment, în poveste, linia 37, a este 1. b este 2. Și acum am proceda pentru a le schimba. Ei bine, în primul rând, permiteți-mi să fac asta, de fapt mult mai simplu. Nu știu ce aceste trei linii de cod au fost faci. Lasă-mă să fac asta. b. primește o. b. o primește. Adoptată. De ce este acest rupt, în mod logic? E un fel de lucru intuitiv, nu? Deci, un devine B. Și b. devine o. Dar problema este că de îndată ce linia 37 execute, ceea ce este Valoarea lui A și B? Același, 1. Pentru că ai clobbered, ca să spunem așa, v-ați schimbat pe b pentru a egale cu o. Deci, odată ce linia 37 este executat, asta e grozav. Acum aveți două copii ale numărul 1 interiorul acestei funcții. Deci, atunci când spui în linia 38, o primește b, ei bine, ești un fel de greșit. Pentru ca esti atribuirea doar 1 la 1. Ati cam pierdut valoarea îți pasă. Deci, în versiunea originală a acestui, observați ceea ce am făcut. Am avut în schimb o treia linie de cod care arata ca acest lucru. Am declara o variabilă temporară - tmp este un nume foarte comun pentru o variabilă temporară. E un int, deoarece trebuie să se potrivească ceea ce vreau să fac o copie a. Am stoca o copie a unui interior de tmp. Deci, odată ce linia 37 a executat, valoarea a este - bun-simț rapid check - 1. Valoarea b este 2. Și valoarea tmp este de asemenea, 1. Așa că acum am executa linia 38. Deci, odată ce linia 38 execută, o ia pe valoarea de b. Și b. a fost de 2. Deci, este acum un 2. Deci, în acest moment, în poveste, un este 2, b este 2, și tmp este 1. Deci, acum în mod logic, putem doar valoarea plop tmp lui in b. Și am terminat. Deci am rezolvat problema. Din păcate, atunci când am rula acest program în această formă, ea nu schimba de fapt orice valori. Dar pentru a fi clar, de ce? Am fixat problema logică de la doar o clipă în urmă. Dar, din nou, dacă am rula acest program, x și y rămân neschimbate până la sfârșitul anului programul de execuție. [Neauzit] David J. MALAN: Deci nu s-au întors nimic. Deci asta e adevărat. Dar se pare că nu e un pic de o problemă aici, deoarece până în prezent, Singurul lucru pe care am putut să se întoarcă este un lucru. Și aceasta este o restricție de C. Puteți reveni cu adevărat numai o singură valoare, caz în care, eu sunt un fel de blocat aici pentru că am putut reveni noua valoare a lui x sau aș putea întoarce noua valoare a lui y. Dar vreau amândoi înapoi. Deci, revenind, nu este o soluție simplă aici. Dar problema fundamental este de ce? Ceea ce am de fapt schimbat? a și b. Dar a și b sunt copii ale lui x și y, ceea ce înseamnă că a făcut doar toate astea muncă - ne-am petrecut cam trei minute vorbind despre schimbul funcția și toate aceste trei variabile. Și asta e minunat, perfect corect în izolare. Dar un domeniu de aplicare și b lui numai în aceste linii aici. Deci, doar ca o bucla de, daca declara un întreg i în interiorul pentru buclă - în mod similar, interior dacă sunteți de declarare a și b de o funcție care care le-ați scris, sunt valabile doar în interiorul de această funcție. Ceea ce înseamnă că de îndată ce se face schimb de executare și vom trece de la linia de la 24 la linia 25, x și y nu au fost modificate deloc. Ai pierdut doar o mulțime de timp pompare copii ale variabilelor. Deci, se dovedește că soluția la această este de fapt non-evidente. Nu e destul de suficiente pentru a returna valori, deoarece putem returna o singură valoare. Și eu chiar nu vreau să schimb atât x și y, în același timp. Deci, ne vom întoarce la asta. Dar pentru moment, realizăm că problema fundamental derivă din faptul care a și b sunt copii. Și ei sunt în sfera de aplicare propria lor. Ei bine, hai să încercăm să rezolve această într-un fel. Lasă-mă să derulați înapoi de fapt, aici și să se deschidă, să zicem, o variantă patra de acest lucru, buggy4. Și ce zici de asta? Aceasta este o problemă similară, dar mai simplu să se uite la înainte de a lua o lovitură de cuțit la rezolvare. Acest program se numeste incrementare. Și se pare că acesta inițializează un număr întreg de la 1 x, în linia 18. Apoi am pretind x este 1. Apoi am mențiune de incrementare, punct, punct, punct. Eu numesc apoi increment. Dar, apoi, în linii 22 și 23, eu pretind că a fost incrementat. Eu pretind x este acum orice ar fi, probabil 2. Dar acest program este buggy. Care e problema? Da? [Neauzit] David J. MALAN: Exact. Deci x a fost declarată în mod evident pe linia 18. Care este în interiorul acolade principalele lui. Deci, răspunsul simplu este că, ei bine, există aici x. Ea nu există în linia 32. Deci, de fapt, acest program nu se va compila chiar. Compilator, atunci când am încerca elaborarea prezentului cod, se va țipa la mine despre unele identificatorul nedeclarate sau ceva în acest sens. De fapt, hai să încercăm. Acest lucru este de a face buggy4. Acolo este. Utilizarea x identificator nedeclarate în linia 32. Și, de fapt, să fie mai explicit aici, astăzi, astfel că acest lucru este util în orelor de serviciu și la domiciliu. Observați că e un pic criptic scris. Dar faptul că zăngănit are strigat la noi, spunând buggy4.c: 32:5, este, de fapt util. Aceasta înseamnă că eroarea este pe linia 32, la poziția caracterului cinci. Deci, un, doi, trei, patru, cinci. Asta e, de fapt, în cazul în care problema este. Și, de asemenea, să țină cont de la ore de birou și acasă, am noroc aici. Am o greșeală. Acesta va fi relativ ușor să se stabilească. Dar dacă aveți un ecran plin de mesaje de eroare copleșitoare, din nou, dau seama că cea mai de jos s-ar putea să fie doar simptomatic de cele mai de sus. Deci, alerga mereu în jos bug-uri dvs. de sus în jos. Pentru că nu ar putea fi doar un efect daisy-chain care te sugerând au probleme mult mai mult decât tu de fapt face. Deci, cum am putea rezolva această problemă în cazul în care obiectivul meu este de a incrementa x? Ce-i asta? Bine. Astfel încât să putem face x la nivel mondial. Să luăm de comenzi rapide pe care am avertizat mai devreme. Dar naiba, avem nevoie doar de o soluție rapidă. Deci, haideți să spunem doar x int aici. Asta face x la nivel mondial. Deci, acum, principala are acces la acesta. Și creșterea are acces la acesta. Și lasă-mă merge mai departe și a compila acest lucru acum. Asigurați-buggy4, Enter. Pare a compila acum. Să fugi buggy4, și se pare să funcționeze efectiv. Acum, acesta este unul din aceste lucruri - faci cum spun eu, nu ce fac eu, așa cum tocmai am terminat aici. Pentru că, în general, programele noastre sunt mergi la a lua mult mai interesant și mult mai mult decât asta. Și dacă soluția la problemele vieții se află la doar ah, a pus toate variabile de la partea de sus a fișierului, foarte repede face programele să groaznic de dificil de a gestiona. Ea devine mai greu să ne gândim la nume noi variabile. Ea devine mai greu să înțeleagă ceea ce este variabilă ce face. Și așa, în general, aceasta nu este o soluție bună. Deci, hai sa facem acest lucru mai bine. Noi nu doriți să utilizați o variabilă globală aici. Eu vreau să incrementa x. Asa ca am putut în mod evident - la sfârșitul zilei, e un fel de poveste prostie pentru că facem asta. Dar dacă nu știam despre acel operator, sau nu mi sa permis să schimba-l în principal sine, cum altfel aș putea să pună în aplicare Ken aici, această timpul nu a cub, ci pentru a incrementa? Cum pot schimba acest lucru aici? Da. [Neauzit] David J. MALAN: Bine, bine. Deci, de ce nu am trece în x? Și apoi, mai degrabă decât a reveni, de ce nu am face doar revenirea x + 1? Acum, lucrurile un cuplu mai multe trebuie să se schimbe aici. Sunt pe drumul cel bun. Ce altceva mai am nevoie să tweak? Altcineva. Da? [Neauzit] David J. MALAN: am nevoie pentru a schimba tipul de retur de creștere deoarece nu este anulat. Void înseamnă nimic nu se returnează. Dar în mod clar, acum este. Deci, acest lucru trebuie să se schimbe pentru a int pentru a fi în concordanță cu ceea ce Sunt de fapt întorc. Acum altceva este încă buggy aici. Da? [Neauzit] David J. MALAN: Deci, am nevoie pentru a incrementa x? [Neauzit] David J. MALAN: Ah, asa ca am nevoie pentru a trece x. Așa că am nevoie să fac asta aici. Deci prototip, trebuie să schimbe asta aici. Deci, acest lucru trebuie să devină un int. Acest lucru trebuie să devină - hmm. Am de fapt un bug aici. Să rezolva această problemă primul. Ce ar trebui să fie, de fapt asta? Așa că trebuie să fie un ceva int. Ar putea fi x. Dar, sincer, dacă începeți de asteptare toate variabilele x dumneavoastră, o să obțineți mai puțin și mai puțin clară, care este care. Așa că hai să aleagă arbitrar o convenție de denumire diferită pentru meu Funcțiile helper, funcțiile scriu. Vom numi o. Sau am putea-o numi - să-l numim even_number a fi chiar mai explicită. Deci, atunci am să se întoarcă, indiferent de numărul este de plus 1. Și acum am de a schimba un lucru aici și una Un alt lucru aici. Ce trebuie să se schimbe pe linia 21 primul? Am să le atribuie x. Deci, eu nu pot suna doar x incrementare. Am nevoie să-mi amintesc răspunsul prin schimbarea valorii lui x pe stânga lateral. Și chiar dacă x este acum pe stânga și dreapta, asta e cu totul bine, deoarece partea dreaptă este executat primul, apoi se plopped în stânga lucru manual, x, în acest caz. Și apoi în cele din urmă, aceasta este o repara ușor acum. Acest lucru trebuie să se potrivească exact ceea ce e mai jos. Int număr. Bine. Deci, o grămadă de modificări pentru o funcție foarte prost. Dar reprezentant al lucrurilor pe care le veți dori să facă din ce în ce. Deci, a face buggy4. Am greșit undeva. Oh, Doamne. Cinci greseli in, cum ar fi, un program de șase line. Deci, ce e în neregulă pe linia 18, caracterul 5? Bine. Așa că trebuie să declare acest lucru int. Bine. Deci, haideți să vedem, o grămadă de alte erori. Oh, Doamne. 19, 18, 21. Dar, din nou, să debifați ecran - L de control aici - și re-run zăngănit. Deci, cinci probleme este de fapt doar asta. Deci, acum să ruleze buggy4, Enter. Uau. x a fost incrementat corect. Bine. Orice întrebări cu privire la modul de a incrementa numere? Da? DIFUZOR 2: De ce este că puteți schimba doar x la numărul în variabila numi și o să știu ce vrei să spui? David J. MALAN: Bună întrebare. Cum se face că eu pot schimba doar x la numărul și programul va ști imediat? Deci, din nou, cred ca e asta abstractizare. Deci, dacă eu sunt principala si Ken este incrementală, sincer, nu-mi pasă ceea ce Ken numește iPad lui. Nu-mi pasă ce el numește ceva care are de a face cu punerea în aplicare sa din această funcționalitate. Deci, acesta este un detaliu de implementare pe care am, principal, nu Trebuie să aibă grijă despre. Și așa pur și simplu schimbarea în mod constant în interiorul funcției, numărul de aici și numărul de aici, este tot ce durează atât de mult cât am recompilați. E un fel de, dacă credeți despre - mulți dintre noi, cei dintre voi cu șofer licențe care au condus, sau în cazul în care ați condus chiar și într-o mașină - cele mai multe dintre noi nu au nici o idee cum functioneaza o masina sub capota. Și literal, dacă vă deschideți capota, cele mai multe dintre noi - inclusiv eu - nu sunt de gând să știu cu adevărat ce ne uita la. Un fel de v-ar simti cu chestii de genul asta acum. Dar noi nu avem într-adevăr să aibă grijă cum functioneaza masina. Noi nu trebuie să aibă grijă ce toate tije și pistoanele și cabluri din interiorul auto sunt, de fapt fac. Deci, ceva de genul ceea ce voi numiți cu piston nu contează aici, în acest caz. Aceeași idee. Da? [Neauzit] David J. MALAN: Dacă ar exista mai multe utilizări ale momentului variabila xa în urmă, te, programator, ar trebui să le schimbe peste tot. Sau ai putea face literalmente fișier, Meniu, iar apoi Find / Înlocuire, ceva de genul asta. Dar aveți de gând să aibă de a face aceste modificări tine. Trebuie să fie consecvente. [Neauzit] David J. MALAN: Un ordin special ca aici? În cazul în care acest lucru a fost un alt număr de int? Da. Deci, scopul conteaza, atunci când sunt de asteptare funcția. Deci, dacă am fost de asteptare incrementului aici cu ceva virgulă ceva, există o mapare directă. Variabilă în primul rând, orice se numește, în care se face o copie a primei Argumentul aici. Ne pare rău, acest lucru nu ar trebui să fie o paranteză. Liniile doilea argument până cu cea de a doua. Deci ordine, da, materie. Bine. Îmi pare rău că a luat un drum lung pentru a ajunge acolo. Alte întrebări? Bine. Deci, hai sa vedem daca nu putem picta o imagine a ceea ce se întâmplă de fapt pe aici sub capota, ca să spunem așa. Deci, aceasta este un dreptunghi care ar putea reprezenta memoria computerului. Deci, chiar dacă nu aveți nici o idee cât de memorie functioneaza sau modul în care funcționează RAM, cel puțin presupunem că aveți legături de ea in aceste zile. Ai megabytes de ea. Ai gigabytes de ea. Și știm de la zero săptămâni că un octet este doar ceea ce? 8 biți. Corect, deci 8 zerouri și cele. Deci, în cazul în care computerul are un gig de RAM, două concerte de RAM aceste zile, aveți o sau 2 miliarde de miliard de octeți de memorie, sau aproximativ 8 miliarde euro sau 16 miliarde biți, în interiorul computerului. Acum, spre deosebire de exemplul lanos mic Willy, nu e particule magnetice de obicei mai. Din ce în ce, în laptop-uri, cel puțin, e drive-uri solid de stat, SSD-uri, care doar nu au nici piese în mișcare. Totul e electronic. E toată energia electrică pe baza. Deci, cred că, deși, din acest dreptunghi ca reprezentând doar unul sau două gigabytes de memorie pe care le au. Deci e un segment de memorie. Acum, lumea științei computer are un fel de bucăți partiționate pe de de memorie pentru a face lucruri diferite. Deci, de exemplu, în cazul în care acest lucru este memoria RAM a computerului - după cum a sugerat dreptunghi acolo - se dovedește că, prin convenție, în partea de sus a RAM-ul, astfel încât de a vorbi, este, în general, ceea ce se numește un segment de text. Acestea sunt zerourile și cele pe care le-ați compilate. Așa că atunci când ne-am uitat sub capota la ceea ce este a.out, toate de zerouri și cele - atunci când executați un program, aceste zerouri și cele sunt încărcate de pe hard dvs. unitatea în ceva numit RAM. Și în memoria RAM, acestea sunt puse la partea de sus. Acum Între timp, aveți alte lucruri. Datele inițializată, date neinițializate. Aceste două brazde de memorie se referă la variabile globale, care nu folosiți des. Dar, uneori, dacă ai face, ei sfârșesc acolo, de asemenea. Apoi, există alte lucruri. Variabile de mediu, pe care nu vom petrece mult timp departe. Dar, apoi, două lucruri importante care vor reveni pe parcursul acestui semestru, stiva si heap. Deci, cele mai multe dintre memoria calculatorului este rezervat când se rulează un program pentru ceva numit stivă și ceva numit heap. Și nu vom vorbi despre heap astăzi, dar vom vorbesc despre stiva. Și stiva este menit să evoca vizual ca și cum sala de mese tăvi de masă în Mather House, sau ori de câte ori se întâmplă să fie, în cazul în care sala de mese personalului curățați-le în fiecare zi. Le adune de la podea pe sus. Și în mod similar în memorie, nu există această idee de a pune ceva pe o stivă, pune ceva pe o stivă, pune ceva pe o stivă. Si ce ne spun prin aceasta? Ei bine, hai să mări doar pe jumătatea inferioară a acestui tablou, computerului RAM, să propună următorul. Se pare că, atunci când executați un program ca a.out sau hello, indiferent de programul este că ați scris, din nou, aceste zerouri și cele sunt încărcate de pe hard disk-ul - care este depozitarea pe termen lung, rămâne acolo chiar și atunci când vă trageți plug - încărcate în memoria RAM. RAM este mai rapid decât hard disk-uri. E mai mic decât hard disk-uri. Dar e în cazul în care programele locuiesc în timp ce le execută. Deci, faceți dublu clic pe un program de un Mac sau un PC - aceasta e încărcată de la unitatea hard disk în memoria RAM. De îndată ce este încărcat în memoria RAM, zerourile și cele du-te în partea de sus calea, așa-numita segmente de text. Dar apoi, cât mai curând program de fapt începe să curgă, principalul Funcția se numește. Și principal, așa cum am văzut, are adesea variabile locale. Și are Ints și siruri de caractere și caractere și similare. Deci, dacă programul dumneavoastră că ați scris sau programul pe care îl aveți dublu clic folosit unele variabile în interiorul principal, acestea ajung la partea de jos a stiva de memorie, ca să spunem așa. Acum, mai concret, ce înseamnă de fapt? Acest lucru înseamnă doar că, dacă am fost de gând la numărul de lucruri - daca am fost de gând să numarul de bytes de RAM pe calculator, observați că acest lucru ar putea fi zero numărul de octet. Acest lucru ar putea fi numărul de octet unu, doi, trei, patru, cinci, șase, toate drumul până să-mi placă - 2 miliarde ar fi tot drumul până acolo la partea de sus. Deci, cu alte cuvinte, atunci când vorbim despre memoria RAM sau în termeni de octeți, aceasta înseamnă doar că cineva a decis ce la numărul de fiecare aceste bucăți de memorie. Deci, atunci când aveți nevoie de 32 biti pentru un int, sau aveți nevoie de 8 biți pentru un char, în cazul în care nu ajung în memorie? Ei bine conceptual, ajung doar până la partea de jos a acestei lucru numit stivă. Dar ceea ce este interesant este acum când apelează o funcție principală. Să presupunem că o funcție numită foo, doar un nume arbitrar. Ce se întâmplă este principal este de la partea de jos a acestei stivei de memorie. Foo acum se pune pe partea de sus a principal în memorie. Deci, orice variabile locale, care foo a ajunge un fel de conceptual de mai sus cele din principal. În cazul în care solicită o altă funcție foo bar numit, aceste variabile ajung aici. Dacă bara solicită altceva, aici, aici, aici. Deci, ce e interesant despre executarea unui program este ca pe masura ce numesc funcții, și în care aceste funcții apel funcții, și ca aceste funcții apel funcții, vă construi acest teanc de funcții în memorie. Și numai o dată la funcția întoarce începi obtinerea că memoria înapoi. Deci, una dintre cele mai simple moduri de a alerga afară de memorie într-un program de calculator este de a scrie funcții care nu returnează. Deci, de exemplu, să demonstreze la fel de mult cu un în mod intenționat buggy programului. Lasă-mă să merg mai departe și nu includ # , int main (void). Și am de gând să fac în timp ce (2> 1), care, probabil, nu va niciodată schimba pe noi. Și lasă-mă să merg mai departe și de a face acum printf. De fapt, asta va fi mai puțin interesant vizual. Hai să facem asta. Pentru int (i = 0; i> 0). Hai să facem această greșeală, i + +. Și să nu printf aici. Să practica ceea ce am fost predica. Să aveți o metodă aici. Cor anulate, iar noi vom spune: int i. Și apoi am de gând să spun, printf - oh, hai să facem asta mai interesant. Să nu imprima nimic, la toate. Hai să facem asta. Refren (i). Bine. Deci, aceasta este buggy, deoarece de ce? Fac asta ca merg, deoarece programul nu face de fapt nimic de interes. Dar asta nu e gol. Scopul este de a scrie un program a cărui funcție principală ce face, aparent? Suna sine. Și, de fapt, nu avem nevoie de bucla. Să simplifica chiar și acest lucru doar în așa fel încât să nu se piardă din vedere cu adevărat fundamentală bug. Solicită Principalele cor să cânte niște cor. Apoi am făcut o prostie, si am avut apel refren refren pentru că am presupus altcineva a fost de gând să-l pună în aplicare poate. Iar acum acest lucru nu se va compila încă. Trebuie să fac ce? Am nevoie de prototip, amintiți. Așa că am nevoie să aibă până aici, cor void (int i);. Deci, acum, daca ma duc aici - De fapt, hai să utilizați fereastra mai mare. Să mergem mai departe și să facă cor. Să mergem mai departe și să facă cor. Utilizarea declarantul neidentificate i. Oh, asta a fost o prostie. Nu avem nevoie de argument. Hai să facem asta. Doresc am inceput acest drum. Acesta ar fi fost un program mult mai ușor să scrie. Deci nu. Acum hai să mergem pe la fereastra terminalul meu, re-run zăngănit. Și aici vom merge. Asta a fost foarte rapid. Ce sa întâmplat de fapt, doar, totuși? Ei bine, acum voi adăuga linia de imprimare, astfel încât să putem vedea. Deci, permiteți-mi să spun printf, să zicem, eu sunt aici. Bine, nu variabile, ne vom lăsa așa. Lasă-mă să re-rula fac. Lasă-mă să re-run cor. Și haide. Continuă. Ca o paranteza, de ce nu a sa prăbușit încă? Eroare de segmentare sa întâmplat super rapid înainte. [Neauzit] David J. MALAN: Exact. Deci, este nevoie de timp pentru a imprima. Este nevoie doar de mai mult de lucru pe partea computerului. Și acolo este. Segmentarea vina. Deci, observați cât de programe rapide a alerga. Dacă nu sunteți de imprimare nimic, super rapid. Dar avem încă această eroare de segmentare pentru că ceea ce se întâmplă? Ei bine, dacă te gândești la modul în care memoria computerului este stabilită, această se întâmplă să fie principal. Dar aici - hai sa numim doar acest cor, și hai să numim acest cor. Și acum, dacă eu fac estetica mele drept, acest lucru este doar de gând să spun cor, cor, cor, cor, cor, cor, cor, nauseum anunț. Și în cele din urmă, ceea ce se va întâmpla? Dacă imaginea de ansamblu este literalmente acest lucru, ceea ce se întâmplă pur și simplu conceptual? Depășirile coșul de fum heap. Sau mai rău, ai depășit totul, inclusiv segmentul de text, care este de zerouri și cele care reprezintă programul dumneavoastră. Pe scurt, aceasta este doar rău super, super. Corect? Programul tău a scăpat de sub control. Te folosind memorie mult mai mult decât ați intenționat toate din cauza unui prost greșeală, în acest caz. Sau, în acest caz, o functie foarte deliberat făcut ea însăși de asteptare. Acum, acest lucru nu este așa de rău. Funcții de asteptare s-au de fapt, are o mare putere atunci când este utilizat în mod corect. Eu nu l-am folosit corect aici. Deci, acest lucru nu este așa de rău. Dar faptul că nu m-am opri de fapt, de asteptare mine este un drept fundamental slăbiciune aici, de acest program. Deci, unde mergem cu toate astea? Ei bine, ce se întâmplă cu adevărat? Când am apela funcția creștere, ca și cum făceam în aceste exemple, Am o valoare cum ar fi 1, care trec inch Trec într-o copie a numărul unu. Deci, se întâmplă următoarele. Așa că hai să mergem în exemplul incrementului. Și tipul ăsta chiar aici. Deci, aici e ceea ce se intampla de fapt. Când i-am sunat creștere, iar eu trec în x, pictural ce e se întâmplă aici este aceasta - dacă am valoare de 1 depozitate aici, iar eu sun de fapt creștere, care acum se numește cor - Da, asta ma aruncat de pe aici. Deci, hai să numim această creștere. Și nu știm ce această funcție următoare va fi. Deci, ce se intampla de fapt este pe aici pe undeva, în principal, am o bucată de de memorie care este stocarea numărul 1. Când m-am apel creștere, eu sunt, folosind un alt segment de memorie, dar acum am au copia 1. Când m-am incrementa această valoare, aceasta devine 2 - oribil scris pe Ecranul aici. Dar atunci, ce se întâmplă cât mai curând se întoarce de creștere? Această memorie se doar dat înapoi la sistemul de operare, ceea ce înseamnă toate ai facut nimic util. Cel care a fost inițial incluse în principal, de fapt este încă acolo. Deci, unde mergem cu asta? Ei bine, se pare că, în memoria aveți această back to back secvență de octeți pe care le poti pune chestii inch Și se pare că le-am văzut deja ceva care implica punerea lucrurile spate în spate la spate în spate. Ce este un șir de caractere, bazat pe o saptamana, iar acum doua saptamani? Deci e doar o colecție de caractere. Deci, se dovedește, la fel cum puteți pune numere în memorie, în mod similar puteți pune de caractere în memorie. Și, odată ce vom începe caractere punerea în memorie spate în spate în spate pentru a înapoi, se dovedește că utilizarea simplă a lucrurilor pentru ca o buclă sau o buclă în timp ce, putem itera - de la stânga la dreapta de-a lungul caractere dintr-un șir - și începe să masaj-le in diferite personaje cu totul. A ar putea deveni B. B ar putea deveni în cele din urmă C. Așa că, putem lua o Teză engleză care face de fapt sens și de a converti fiecare dintre cele Scrisori de una la un moment de mers pe jos prin memoria calculatorului nostru a plecat la dreptul de a cripta de fapt. Așa că haideți să ne cinci minute pauză aici, și când ne întoarcem, vă vom începe acest proces de codare de informații. Bine. Deci, înainte de a ne scufunda la anumite Crypto si aceste lucruri numite matrice, permiteți-mi să pauză pentru orice întrebări pentru că mă simt ca și cum aș într-adevăr un fel de confuze unora dintre aceste subiecte. Așa că hai să stabilească acum dacă putem. Așa că ne-am vorbit despre valorile de returnare. Am vorbit despre argumente. Și am vorbit despre această noțiune, pe care vom reveni în următoarele săptămâni vin, de care vizionează memorie ca o gramada de aceste stivuite tăvi, ca să spunem așa. De jos in sus, astfel încât fiecare tavă pe care se pune pe stiva reprezinta o funcție care este în prezent fiind numit. Alte întrebări? Deci, cum despre - permiteți-mi să încerc a pune o întrebare. I a păstra rasfat asta, dar acum este - L-ai vazut tot chipul băiatului. Deci, ne vom întoarce la asta. Așa că lasă-mă să pun o întrebare aici. Lasă-mă să simplifice această înapoi la ceea ce a fost înainte o parte din Q & A. noastre anterioare Și faptul că creșterea are paranteză deschisă, numărul de int, închis paranteză. Ce înseamnă numărul de int reprezinta? [Neauzit] David J. MALAN: Un argument. Bine, dar ce e un argument? [Neauzit] David J. MALAN: Îmi pare rău, ce e asta? DIFUZOR 3: Ceva ce treci inch David J. MALAN: Ok. Deci, ceva care te treci inch Și mai mult, în general, e doar de intrare. Dacă sunteți scris o funcție și scop care funcția lui în viață este de a face ceva un pic diferit de fiecare dată când îl utilizați, apoi singura cale pentru care să se întâmple într-adevăr ar părea să fie să îi furnizeze cu intrare, astfel încât să poate face ceva diferit cu care de fiecare dată de intrare. Deci, trebuie să specificați două lucruri atunci când o functie are intrări. Ai nevoie de a specifica numele pe care doriți să dea la intrare, exclusiv pentru comoditatea ta, astfel încât să se poate referi la ea în funcția pe care ați te sunt scris, așa cum am făcut-o aici, în linia 32. Dar de asemenea, trebuie să specificați tipul său, deoarece C este un limbaj de programare ca doar cere că, dacă doriți o variabilă, trebuie să spun calculatorului ce tip de date este, în mare parte, astfel încât să știe cât de multe biți pentru a alocă pentru variabila. Deoarece ar putea fi sase - Ne pare rău, nu va fi șase. Acesta poate fi de 16. Acesta poate fi 8. Acesta poate fi de 32, chiar 64. Dar calculatorul trebuie să știe. Acum, int pe partea stângă reprezintă ceea ce, prin contrast? [Neauzit] David J. MALAN: Ce e asta? [Neauzit] David J. MALAN: tipul de funcție și, mai precis, Tipul din producția sa. Corect. Deci, întrucât lucru în paranteze reprezintă intrarea acestuia, dacă este cazul, lucru la stânga reprezintă producției sale. Și în acest caz, se pare că o creștere întoarce int. Și așa int este tipul întoarsă de această funcție. Ce înseamnă să se întoarcă? Literalmente, să utilizați cuvinte cheie întoarcere. Și apoi, dacă ceea ce se întorc la dreapta cuvânt cheie este un întreg, atunci este într-adevăr în concordanță cu ceea ce am promis. Tu nu ar putea face ceva de genul asta - salut, lume - pentru că este un șir. Evident, acesta nu este un număr întreg. Deci, pe scurt, sarcina este într-adevăr pe noi, programator, pentru a fi specifică la ceea ce suntem și de a se întoarce apoi mergi de fapt, despre returna. Și apoi pentru a face un pic mai clar contextul - iată-l din nou. Contextul - mare surpriză vine intr-un moment. Contextul aici este faptul că memoria computerului este, din nou, un gigabyte, doi gigaocteți, indiferent. Poate că e mai mult. Poate că e mai puțin. Dar care computerul îl vede ca având secțiuni diferite. Ceva nu merge acolo. Altceva se duce acolo. Chestii diferite merge în mijloc. Și astăzi, vom începe doar spun această poveste. Dar ne vom reveni la această dată peste. Pentru moment, singura piesă de memorie ne pasă cu adevărat despre este segmentul de text pentru că reprezintă doar zerouri și cele care face să răsune a emise. Deci, atunci când executați o comandă de la tastatură cum ar fi a.out, sau faceți dublu faceți clic pe o pictograma de pe Mac OS sau Windows, programul este încărcat de pe hard dvs. conduce în memoria RAM. Și se plopped la partea de sus a memoria RAM a computerului dumneavoastră, ca să spunem așa. Acum Între timp, ca program începe să curgă și principalele este chemat în program scris sau programul Microsoft sau Apple a scris, oricare dintre ei variabilele locale ajung acolo, la partea de jos a memoriei computerului. Dar, în cazul în care solicită un alt principal de funcția pe care ea însăși are variabile sau argumente, ei sfârșesc deasupra. Și dacă această funcție solicită ceva, ei sfârșesc deasupra ei, deasupra ei, deasupra ei. Și doar o singură dată o funcție se face de executare face topul de tăvi, astfel încât să vorbească, începe să mai mici și mai mici. Și asta este ceea ce, atunci, într-o coajă de nucă, explică de ce, atunci când apelați cub - sau te sun increment - te trece într-o copie a valorii. Și ce înseamnă asta pictural este că sunteți scris literalmente numărul 1 în altă parte a memoriei, care schimba 1 la 2, în cazul creștere - sau la un 8, în cazul cubului - și a aruncat apoi că memoria departe, cât mai curând creșterea sau cub funcție o întoarce. Întrebare. [Neauzit] David J. MALAN: În cazul în care - variabile globale sunt stocate în ceea ce este în prezent numit datele inițializată sau date neinițializate. Diferența fiind, în cazul în care aveți o variabilă globală, și tu-l atribuiți imediat o valoare cu semnul egal, se termină în partea de sus de acolo. Și dacă spui doar int x virgulă, cu nici o valoare, se termină în sus ușor mai mică în memoria RAM pur și simplu prin convenție. Alte întrebări. Bine. Deci, această imagine va veni înapoi ca vom ajunge mai puternic cu ceea ce putem face cu calculatorul. Dar pentru acum, haideți să o introducere scurtă la criptografie, un tip specific de criptografie care nu rezolva toate problemele lumii, dar nu rezolvă unele dintre ele. În acest caz aici, avem ceva numit criptografia cheie secretă. Și criptografie cheia secretă, așa cum sugerează și numele, provine de securitate sa de la un secret. Deci, de exemplu, dacă te-ai întors în școala primară și sunteți trece printr-un Scrisoarea de dragoste pic secret pentru băiat sau fată sunteți de concasare pe - dacă aveți a vrut să treacă prin faptul că publicul, probabil că nu ar scrie o astfel de notă în limba engleză sau orice limba dvs. maternă este, mai degrabă, te l-ar putea cripta. Sau s-ar putea doar trimite-le un mesaj text în aceste zile. Dar s-ar putea trece de fapt, le-o notă de-a lungul sala de clasă. Și pentru a face acest lucru în siguranță, astfel încât prietenii și profesorilor Nu știu ce scrii, s-ar putea veni cu o destul de simplu Algoritmul - tânără, deși s-ar putea să fie - pentru a se lupta doar cuvintele. Deci, în loc de a scrie un, s-ar putea scrie B. În loc de B, s-ar putea scrie C. În loc de C, s-ar putea scrie D, și așa mai departe. Sau ai putea veni cu o traducere mai sofisticat de litere la litere diferite. Dar captura este băiat sau fată căreia îi trimiteți această notă trebuie să știi ceva. Care este ceea ce, în mod evident? Ca, ceea ce este secretul tău. Ca, ceea ce este faptul că cartografiere între Ca și B si C si DS? Este adăugând doar una, ca să spunem așa, la fiecare dintre literele pentru a merge la De la A la B, B la C? Este mult mai complex decât asta? Deci tu și zdrobi dvs. trebuie să aibă aceste informații secrete. Dar există un fel de Catch-22 aici. Dacă aceasta este prima dată când trimiteți această scrisoare prin iubire clasă, cum este faptul că băiatul sau fata de gând să știu ce este secretul, chiar? Deci, secretul cheie cripto nu rezolva toate problemele lumii. Și nu e de fapt o relatie care ne vom întoarce la spre semestru sfârșitul anului. În mod similar, au nici unul dintre noi, probabil, vreodata a trimis-o - În mod similar, nu mai mulți dintre noi cunosc pe cineva care lucreaza, de exemplu, la Amazon.com. Și totuși, mulți dintre noi au cumparat, probabil, lucruri pe Amazon.com. Și noi am fost învățați să se presupună că aceste e-commerce tranzacțiile sunt sigure. Corect? URL-ul spune, probabil, https. E poate o pictogramă lacăt prostuță mică undeva. E un fel de criptografie securizarea informațiilor dvs. de card de credit între tine și Amazon.com. Și totuși, în cazul în criptografie implică cunoașterea vreun secret, și totuși eu nu fac cunosc pe nimeni de la Amazon, și am aranjat cu siguranță, nu orice fel de secret cu cineva de la Amazon, cum este calculatorul meu sau browser-ul meu face acest lucru? Ei bine, se pare că există și alte tipuri de criptografie în total, care rezolva această problemă. Dar pentru ziua de azi, ne vom concentra pe unul simplu, în cazul în care puteți aranja în avansa să știi un secret, cum ar fi, plus 1 sau unele de cartografiere între Ca și Bs. Și procesul de criptografie implică, în general, acest lucru. Ai un text simplu, descrise aici, la stânga. Ai executați printr-un fel de algoritm sau o procedură pentru criptarea ea. Poate că e doar un devine B, B devine C. Și apoi termina cu Cipher text. Între timp, odată ce v-ați îndrăgostit primește nota secretă, el sau ea trebuie să atunci decripta prin inversarea în general, că algoritmul astfel încât să obțineți copii de text simplu. Acum, există încarnări fizice ale acestui. De exemplu, acest lucru este un inel decodor pic secret. Și acest lucru este un inel în sensul că există două cadrane aici. La periferia afara de acest lucru, nu e litere de la A la Z, deși acestea sunt, în ordine aleatorie. Și pe interior, nu e de fapt niste numere, astfel încât cu această inel, puteți transforma un fel de afara, dar nu în interior, în scopul de a alinia numere cu litere. Și în clipul pe care ești pe cale să vezi - dintre care unele este posibil să fi văzut 24/7 în jurul valorii de sezonul de Craciun dintr-un film numit o poveste de Crăciun. Veți vedea că Ralphie mic era atât de dornic să ne dăm seama ce mic orfan Mesaj secret lui Annie a fost să-l care au fost comunicate, cred că, în forma de mesaje numerice de pe o cutie de serie. Și ai avut de a acumula toate cărțile mici care s-au în cutia de cereale. Ai avut de a le trimite prin poștă inch A trebuit să mă întorc inelul decodor secrete, astfel încât să puteți da seama în cele din urmă ce de cartografiere este între litere și cifre, sau scrisori și scrisori. Deci, eu vă dau acest clip scurt de la A Poveste de Crăciun pentru a motiva PSET 2 și nostru de discuții, într-un moment, de matrice. Deci, aici avem Ralphie. [PLAYBACK VIDEO] -Fie ca este vorba de cunoscut de toți și diverse, care Ralph Parker este numit un membru al Micul orfan Cercul Secret Annie și are dreptul la toate onorurile și beneficiile care apar acestea. -Semnat, mic orfan Annie. Contrasemnat, Pierre Andre! În cerneala! Onoruri și beneficii, deja de la vârsta de nouă ani. Haide, să mergem mai departe cu ea. Nu am nevoie de tot ce jazz despre traficanți și pirați. -Ascultă mâine seară pentru aventura de încheiere a Negre Pirate Ship. Acum e timpul pentru mesaj secret lui Annie pentru voi, membrii Cercul Secret de. Amintiți-vă, copii, membri ai Cercului Secret numai lui Annie pot decoda Annie secret mesaj. Amintiți-vă, Annie este în funcție de tine. Setați pini dvs. la B2. Aici este mesajul. 12, 11 - -Sunt în ședință secretă mea prima. -14, 11, 18, 16 - -Pierre a fost în seara asta voce mare. Aș putea spune că mesajul din seara asta a fost foarte important. -3, 25. Asta e un mesaj de la Annie ea. Amintiți-vă, să nu spui nimănui. -90 Secunde mai târziu, eu sunt în camera doar in casa unde un băiat de nouă ar putea sta în intimitate și de decodare. Aha, m-am dus la B. următoare. E. Primul cuvânt este sa fie. S. A fost mai ușor vine acum. U. -Oh, haide, Ralphie. Trebuie să plec. -Voi fi dreapta jos, ma. Gee-whiz. -T, O. Asigurați-vă că pentru a. Asigurați-vă că ce? Ce-a fost orfane Annie Micul încearcă să spună? Asigurați-vă că ce? -Ralphie! Randy a ajuns să mergem. Te rog iesi? -Bine, mamă. Voi fi imediat. -Am fost obtinerea mai aproape acum. Tensiunea a fost teribilă. Ce-a fost asta? Soarta planetei poate atârna în balanță. -Ralphie! Randy trebuie sa plece. -Voi fi imediat, pentru numele lui Dumnezeu. -Doamne, aproape acolo. Degetele mele au zburat. Mintea mea a fost o capcană de oțel. Fiecare por vibrat. A fost aproape limpede. Da, da, da, da. -Asigurați-vă că pentru a bea Ovaltine dumneavoastră. Ovaltine? Un nenorocit comerciale? Fiu de catea. [VIDEO PLAYBACK END] David J. MALAN: Deci nu avem criptografie. Deci, cum într-un calculator putem merge despre punere în aplicare sau reprezentând lucruri de genul asta? Ei bine, avem nevoie de o modalitate de a exprima noi înșine un pic mai flexibil decât variabilele noastre până în prezent au permis. Am avut Ints. Am avut caractere. Am avut flotoare și duble și câteva altele. Dar acestea sunt piese individuale de memorie, care nu permit într-adevăr să ne exprima lucruri, cum ar fi cuvinte și propoziții și fraze. Într-adevăr, am sunat siruri de astfel de lucruri. Dar am promis că aceasta este de fapt doar o simplificare, în CS50 Biblioteca de faptul că suntem intenționează să coaja înapoi. Și deci haideți să încep să fac asta aici. Lasă-mă să mergeți mai departe și de a deschide un fișier - toate aceste fișiere sunt disponibile on-line ca de obicei - array.c chemat pentru a rezolva o problemă fără legătură cu siruri de caractere, dar că înfățișează o Imagine aici despre cum am putea folosi ceva numit-o matrice. Un tablou este un tip de date. E un tip de variabilă, de soiuri, care are mai multe tipuri de date mai mici în interiorul acestuia spate în spate la spate în spate. Deci, de exemplu, dacă vrem să scrie un mic program care vă oferă dvs. quiz medie pentru un curs ca 50 care are două teste, ai putea foarte ușor scrie acest program - bazat chiar pe unele din material de săptămâna trecută - prin utilizarea GetInt și o pereche de variabile. Int quiz1, int quiz2, si e destul de simplu. E poate 10, 20 de linii de cod, max, să pună în aplicare un program care solicită de utilizator pentru scorurile test două și apoi calculează media lor adăugându-le împreună, împărțind cu doi, iar apoi tipărirea rezultatelor. Am putea face destul de ușor, probabil, că acum, după un numar de minute. Dar problema este că presupunem că 50 a avut trei sau patru chestionare. Să presupunem că ai vrut să utilizați același program pentru o clasă care a avut săptămânal teste. Gândiți-vă la o clasă care a săptămânal teste. Dacă e ca și cum 16 sau asa săptămâni într-un semestru, acum ai 16 variabile - int quiz1, int quiz2, int quiz3, int quiz4. De îndată ce începe să vedeți acest concediere, această copierea și lipirea de cod, acesta ar trebui să înceapă să te fac să doriți exista un mod mai bun. Și din fericire, din cauza matrice, nu există. Deci, hai sa facem asta. În primul rând, permiteți-mi să introducă un lucru foarte simplu, care nu ne-am folosit până acum, dar veți vedea, ocazional, în cod. Aceasta este ceea ce se numește, în general, o constantă. Deci, este o constantă în sensul că niciodată nu schimbă această valoare. Convenție umană atunci când se creează o constantă este de a utiliza toate de capital litere, așa că într-adevăr iese în evidență în cod. Și cuvântul cheie special pe care îl utilizați în C # define este. Deci, dacă spui # define, apoi un spațiu, apoi cuvântul pe care doriți să o utilizați pentru constanta numele, iar apoi valoarea constantă. Deci notificare, acesta este diferit de la atribuirea ceva la o variabilă. Nu e nici un semn egal. Nu e nici o virgulă. Aceasta este ceea ce este, în general, cunoscut sub numele de o directivă preprocesor, dar mai mult pe că un alt timp. Pentru moment, acest lucru creează o valoare invariabilă numit QUIZ reală a cărui Valoarea numerică este 2. Deci, oriunde vedeți teste, Teste, Teste pe parcursul acestui fișier, care este doar numărul 2. Acum, dacă mă uit la principal acum, să vedem cum funcționează. La început, se pare un pic criptic. Dar e toate lucrurile de la o saptamana. Solicita utilizatorul pentru clasele. Cum facem acest lucru? Ei bine, în linia 22 - aceasta este într-adevăr parte suculent - Declar un flotor, dar nu doar un singur flotor. Sunt declara, mai degrabă, o matrice de valori în virgulă mobilă. Această variabilă va fi numit clase, așa cum se sugerează aici. Dar singura bucată de noua sintaxă, atunci sunt aceste paranteze pătrate, fapt care le-am spus clasele float și apoi placuta deschis și apoi un număr. Comunicarea, în cazul în care acest lucru este o constantă, acest lucru este la fel cum am făcut asta. Acest lucru înseamnă calculator hei, da-mi două flotoare, și hai să numim în mod colectiv le clase. Acest lucru este în contrast cu un proces mult mai plictisitor ca asta. Plutesc grade1, plutesc grade2, și așa mai departe. Deci, un tablou ne permite să pună în aplicare această idee, dar mult mai puțin messily, în astfel încât se poate scrie o linie de cod in loc de, sa zicem, 16 pentru un 16 săptămâni semestru. Deci, eu nu am vrut să-hard codul 2 pentru că dacă te gândești la asta acum logic - să presupunem că anul viitor CS50 modificări la 3 concursuri de schimb. Și am avut numărul 2 aici. Am avut numărul 2 aici. Am avut numărul 2 aici. Am avut numărul 2 aici. Ea devine foarte obositor si foarte usor de bară și de a schimba accidental o valoare la 3 și dor de o alta valoare de 2. Așa că am de gând să schimb abstracte această distanță și de a folosi această constantă că, în calitate de ei sugerează și numele, nu se schimbă niciodată. Și acum, indiferent dacă avem diferite chestionare acest an sau viitor, am Trebuie doar să-l schimbe într-un singur loc, aici în partea de sus. Deci, asta e tot constantă este. Între timp, noua caracteristică conceptuală este aceea a unei matrice. Deci parantezele pătrate Dă-mi asta pluteste in mai multe și vă permite-mi colectiv le numesc clase aici. Deci, acum să vedem ce am de gând să fac. Aici, în linia 24 este începutul unei bucle pentru. Acest lucru este într-adevăr nimic extravagant. Este folosind doar teste în loc de un număr de hard-coded. Dar nu e nimic intelectual diferit acolo de săptămâna trecută. Acesta este doar printf. Deci printf ("% d Quiz numar de% d") pentru că vreau doar să imprime-mi dea concurs numărul unu de doi ani și apoi amândouă din cele două. Deci, aceasta este pur estetic un lucru. Dar partea interesantă este acum în linia 27. În scopul de a umple intr-unul din cele două substituenților cu un plutitor-punct valoarea, puteti folosi din nou paranteze pătrate. În acest caz, eu i folosind, deoarece acest lucru pentru bucla a început cu i egaleze ce valoare, aparent? 0. Astfel, pe prima iterație a acestui bucla, este ca și cum am scris acest lucru în cod. Dar pe a doua repetare a acestei bucla, este ca și cum am a scris asta în codul meu. Dar faptul că mă folosind o variabilă este perfect, deoarece, după cum numele sugerează, e variind valoarea sa pe fiecare iterație. Așa că eu sunt de umplere această matrice-un singur loc la un moment dat. Ce înseamnă acest tablou arata? Ei bine, motivul pentru care am desenat acest dreptunghi super-simplu de pe ecran aici înainte de a fost pentru acest motiv. O matrice este doar o bucată de memorie, urmat de un alt segment de memorie, urmat de un alt segment de memorie, și așa mai departe. Deci, dacă matrice mea este de dimensiuni 2, în acest caz aici, tot aș face de către tastarea în scorurile test mele, ca aici. Am 100 la asta. Și apoi mi-am luat un 99 pe asta. Atunci această memorie ar putea să nu fi folosit chiar și numai pentru că am cerut calculator pentru o gamă largă de dimensiuni 2. Aceste piete sunt încă acolo. Corect? Aveți încă două GB de RAM, chiar dacă ești doar cere pentru două flotoare. Deci, ideea din spatele tablourilor este faptul că computerul are doar o bucată de memorie și distribuie proporțional apoi bucati mai mici spate în spate la spate în spate. Si pentru ca e tot o matrice este. E o bucată de memorie contiguă, în interiorul căruia poți pune lucrurile. Acum, acest lucru se întâmplă pentru a face apoi doar câteva aritmetică plictisitor. Dacă aș defila în jos aici, acest lucru este în cazul în care am repeta apoi peste matrice. Am venit cu însumarea tuturor valorilor din matrice. Și apoi am folosi funcția rundă aici pentru a face de fapt, suma este împărțită de chestionare. Dar permiteți-mi să mișcați mâna mea la acel ca un fel de aritmetică suficient pentru acum. Dar tot ce face pentru mine în cele din urmă este o medie de calcul. Deci, primul test, plus Quiz al doilea, împărțit la 2, iar apoi de imprimare l ca un int. Dar haideți să acum trecerea la o alt exemplu numit șir1, care relevă o imagine similară, dar siruri de caractere folosind. Lasă-mă să mergeți mai departe și de a simplifica aceasta doar pentru un moment. Și iartă-indentarea pentru acum. Comunicarea în linia 19 din acest exemplu, am obține un șir de utilizator. Dar observați ce fac eu următoare, în linii 22 mai departe. Sunt de fapt iterarea de la I până la - și acest lucru este un truc nou - strlen, șir de lungime. Aceasta este o funcție care vine cu C ca daca treci un șir, acesta spune vă cât de multe caractere sunt în șir. Asta e tot. Faptul că e strlen în loc de lungimea șirului este doar pentru că e mai succint. Acum 30 de ani, oamenii îi plăcea să scriu lucrurile așa cum succint posibil. Deci, ne-am păstrat această convenție aici. i + + înseamnă doar incrementa I, în fiecare iterație. Și observați acum acest lucru, ceea ce este cu adevarat interesant. Deci, în linia 24, eu zic calculatorul, da-mi un caracter, opt biți, și sună-l c. Dar ce este acest lucru pe partea dreaptă spui? În limba engleză, ceea ce nu reprezintă faptul că? [Neauzit] David J. MALAN: Exact. Dă-mi primul caracter din matrice. Sau, mai general, dă-mi caracterul i-lea în matrice. Și dau seama că e important acum ca, oamenii de stiinta de calculator, suntem de fapt începând de la 0. Nu aveți putere de apreciere pentru a începe a face acest lucru. Acum trebuie să se comporte în conformitate cu așteptările computerului și numerotate de la zero, deoarece [0] va fi primul într-un șir de caractere. [1] va fi a doua. [2] va fi al treilea, și așa mai departe. Deci acest program, în cazul în care l-am compila - aceasta este, din nou, șir1. Deci, a face șir1. Și acum am rulat șir1 în fereastra terminalul meu. Se așteaptă de intrare, așa că am de gând să tastați în, să zicem, David. Enter. Și acum se imprimă DAVID totul pe diferite linii, deoarece observați ceea ce fac. Sunt imprimarea unui caracter la un moment dat. Acum, nu vom intra în detalii astazi pe acest lucru. Dar am șters-o clipă în urmă cu acest cec aici. Se pare că, dacă utilizatorul nu funcționează corect, contradictorie, sau pur și simplu confuz, aveți posibilitatea să nu reușesc, de fapt pentru a da un șir de o anumită lungime. Dacă te-a lovit tasta greșit pe tastatură, s-ar putea da nici șir, la toate. Sau, dacă ești rău intenționat, ați putea încerca să lipiți într valoare de un gigabyte de o eseu pentru a umple acest șir. Și dacă computerul rămâne fără memorie, se pare că vom să ne întoarcem această valoare nulă special numit. Deci, pentru moment, știu doar că există această valoare nulă special numit ca ne va permite să verificați când suntem afară din memorie, printre alte lucruri. Dar dacă am deschide acum șir2, observați o diferență aici. Observa o diferență aici cu șir2. Cu șir2, acest lucru pentru bucla este un pic diferit. Lasă-mă să ștergeți valori nule, astfel încât să putem vorbi despre cei altă dată. Dar ceea ce este diferit despre bucla de data asta? Și eu pot să mă întorc la exemplul anterior. Deci, asta e versiunea doi. Aceasta este versiunea unul. Unu, doi, unu doi. Deci, în cazul în care apelul este strlen? Este scris în prima parte a buclei pentru. Orice gânduri ca de ce fac asta? Da. [Neauzit] David J. MALAN: Deci, noi nu numim funcția de fiecare dată singur. Exact. Recall pentru bucle de la faptul că sunt super-simplu o dată ce fel de Înțeleg că aceasta este initializare, condiție, și actualizarea. Problema este că această condiție se întâmplă la fiecare iterație a buclei. Și astfel, în acest exemplu aici, ceea ce este rău despre faptul că aceasta este starea mea? Ești de asteptare strlen din nou și din nou și din nou. Dar, odată ce l-am scris în David, lungimea șir care este de cinci. Și nu se va schimba la fiecare iterație a buclei, deoarece șir este în continuare D-A-V-I-D. Deci, aceasta este o aluzie la ceea ce se întâmplă pentru a deveni un Ideea ce în ce mai importantă cunoscut ca o decizie de design, în cazul în care - nu doar face calculatorul face munca inutilă. Acum, la fel ca și o previzualizare a PSET 2, PSET 2 în ediția standard este O să vă provoc să pună în aplicare de fapt, un numar de cifruri, unele Numărul de algoritmi de criptare, astfel încât să puteți atât cripta și decripta mesaje secrete, la fel ca Ralphie de acolo decodat. În ediția de hacker PSET 2, vom merge un pic mai departe. Mergem să dea un fișier dintr-un sistem informatic actual, care conține un grămadă de nume de utilizator si parole criptate reale, precum și provocarea pentru ediția hacker va fi de a sparge aceste parole și figura ce criptografie sau ce secrete a fost de fapt utilizat pentru a generează aceste parole. Și vom face acest lucru prin utilizarea o caracteristică nouă aici, din C pe care o voi da ai doar un demo de, cunoscut sub numele de argumente de linie de comandă. Deci, se dovedește, după cum unii dintre voi poate au văzut în secțiune sau în manuale, principal nu are întotdeauna să fie anulate în paranteze. Se pare că principala poate fi, de asemenea, scris ca aceasta, cu două argumente, argc și argv, în cazul în care argc este numarul de cuvinte pe care le tastați, după programul de numele pe linia comanda ta. Și argv sunt cuvintele reale. Și, după cum sugerează parantezele pătrate de acolo, argv este aparent o matrice. O să fie un șir de caractere, după un șir după un șir în memorie. Deci, ceea ce am de gând să fie capabil să facă, începând cu PSET 2, se ceva de genul asta. Dacă am face argv1, care este un exemplu ne vom întoarce la luni, și rulați aceasta, observați că aceasta nu pare să facă nimic încă. Este doar imprimă propriul nume. Dar dacă spun la revedere clasa, observați că acest program aparent iterează pe fiecare dintre cuvintele care au fost introduse la prompt. Și mijloacele prin care vom avea acces la cuvinte care utilizatorul are tastat de la promptul principal este de a schimba, incepand din acest week-end, de la int main (void) la int main (argc, argv). Și astfel se va naste argumente în linia de comandă. Ș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, cum ar fi cel de aici, care merge de mai sus și dincolo de unele dintre funcționalități care le-am făcut până acum, dar tot destul de puternic. Deci, vom lăsa acest lucru cu asta pe ecran. Si te vom vedea pe luni.