[Powered by Google Translate] [Săptămâna 2, Continuare] [David J. Malan, Universitatea Harvard] [Acest lucru este CS50. - CS50.TV] Bine. Acest lucru este CS50, iar acest lucru este sfârșitul săptămânii 2. Dacă vă așteptați să fie în jurul valorii de foame de data asta mâine, știu că vom convoca maine ca un grup mic, joi, 13:15. 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 timpul pe care îl completați asta. Un alt URL, însă, că ar putea fi de interes este aceasta. Î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 vor putea să urmeze de-a lungul, angajeze în curs destul de activ, de fapt. Vor fi folosind Aparatura CS50 CS50 și Discuta și de cele mai multe instrumente software diferite 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 limbi vorbite și scrise. Deci, dacă s-ar putea avea un interes de a participa la acest proiect prin care ne va oferi transcrieri de engleză și subtitluri pentru prelegeri de curs de și pantaloni scurți și seminarii și secțiunile și cum ar fi, daca vorbesti fluent sau scrie fluent o altă limbă, ne-ar plăcea să te angajeze în acest proiect prin care te iau pe unul sau mai multe 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 dreaptă există î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 să traducă în altă limbă exact ceea ce este de cartografiere între, în acest caz, limba engleză ș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 văzut cuvintele tale și citește de potențial mii de oameni acolo, vă rugăm să nu ezitați să participe. Un cuvânt despre pisoi de luni. Ca nu cumva ne-am trimis un mesaj extrem de înfricoșător, nu-i dau seama că, așa cum sugerează oră de birou și, ca secțiuni sugerează, de proiectare a cursului este foarte mult pentru a fi studenți colaborarea și vorbesc să lucreze prin seturi de probleme și probleme împreună, și într-adevăr linia de doar vine în jos pentru a, din nou, munca pe care o depune în cele din urmă ar trebui să fie a ta. Și așa destul de sincer, în ore de birou este absolut normală, este în totalitate de așteptat, chiar, să fie pe chat cu un prieten lângă tine. În cazul în care el sau ea se luptă cu un subiect și ești ca, "Oh, ei bine, permiteți-mi să vă dau o idee de o linie de cod pe care am scris," că e bine, acest lucru se întâmplă, și asta e foarte mult favorabil, cred, cu procesul de învățare. În cazul în care linia devine trecut este atunci când capul este înclinat fel de aici pentru câteva secunde mult prea multe sau minute pentru care într-adevăr să fi fost doar o oportunitate de deblocare pentru prietenul tău, și, desigur, atunci când lucrurile se schimbate prin e-mail și Dropbox și cum ar fi, 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 multe și mai dau seama că doar ceea ce trimite în cele din urmă ar trebui să fie într-adevăr produsul creației dumneavoastră și nu de altcineva. Și astfel una dintre problemele specifice domeniului de pset2, care va ieși mâine seară târziu, este de a se arunca cu capul în lumea criptografiei, care este arta de a criptare sau de codare de informații, și în cele din urmă se referă la această lume de securitate. Acum, de securitate pentru cele mai multe dintre noi vine sub forma unor mecanisme destul de banale. Toate dintre noi au numelor 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, că nu e, probabil, cea mai bună idee, cum vom discuta spre sfârșitul semestrului lui. Dacă parola este scris într-o notă lipicios - nu glumă - pe monitor, că prea nu este neapărat cel mai bun design, dar destul de un fenomen comun. Și dacă nu ești utilizați criptografia pentru a cripta parolele, ele sunt deosebit de vulnerabile. Deci, dacă crezi că ești deștept fiind super-de a avea un document Word ascuns undeva pe hard disk care are toate parolele dar e într-un dosar pe care nimeni nu o să uite în aceea că nu prea este un mecanism foarte sigur. Și deci ce pset2 va introduce aceasta este arta de a criptografiei și codare de informații, astfel încât lucruri cum ar fi parolele sunt mai sigure. Contextul aici este că, cu date nesigure vine o oportunitate de a cripta și să-l coate. Și astfel aceasta, de exemplu, este un exemplu de un mesaj criptat. Acest fapt spune ceva în engleză, dar nu e clar în întregime evident. Și vom veni cerc complet astăzi să tachineze pe langa ceea ce acest mesaj este secretul aici. Dar în lumea reală de calculatoare, lucrurile nu mai arata ca acestea ar putea fi de engleză Expresii. De exemplu, aceasta este ceea ce s-ar putea găsi pe un Linux sau Mac standard, sau de calculator UNIX într-un fișier care a fost o dată la un moment numit parola fișier. In zilele noastre a fost mutat la alte locuri. Dar dacă te uiți în locul potrivit pe un sistem, veți vedea nu numai numele de utilizator sau a altor persoane de pe sistem, dar veți vedea o versiune criptată a parolei lor. Într-adevăr, cuvântul cripta acolo sugerează că lucrurile următoare este criptat, și această serie de litere aparent aleatorii și caractere și numere ș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 de un anumit fel și știind ceva ce altcineva nu o face. Deci, vom explora acest lucru în detaliu un pic mai mult în prezent și în PSET să vină. Și acum un cuvânt pe pass / fail. Mai ales ca unii dintre voi s-au prăbușit în pset1, Appliance, și o lume foarte nou pentru tine, realizăm că frustrările și confuzie și doar dificultățile tehnice sunt destul de de așteptat, în special cu PSET în primul rând, în cazul în care există doar atât de mult nouă, doar familiarizarea cu ls și CD-uri și toate aceste comenzi arcane și un nou mediu, și asta e separat de materialul real și programarea în sine. Deci dau seama de asemenea, că există cu siguranță oră de birou care există ca o 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, dau 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 trecere clasă / nu, sincer, n-aș fi stabilit chiar piciorul în sala de clasă. Și vă puteți schimba acest lucru până, să zicem, luni al cincilea curs, asa ca daca esti pe marginea acum, realizăm că mai degrabă decât capul în unele alte ape cu totul, nu ia în considerare cu siguranță, doar se schimba 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 nu ar putea fi familiar pentru tine, și vei sfârși prin a face, în cele mai multe cazuri, destul de bine, poate de mult 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 pset0, daca pui in 10 ore, 15 ore, 25 ore în unele PSET si tu esti doar trage capul de perete și se obține super-noaptea târziu dar v-ați luat PSET 90% din drum și nu vă puteți da seama singur 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 de fericit spun, "Bine, știu că nu e perfectă, dar am lucrat fundul meu off pe asta, eu sunt destul de fericit cu ea în cazul în care sa încheiat, " și că va îndeplini 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 pe care le-ar putea avea mai mult noroc pentru. E un pic ironic faptul că parola pentru acest lucru, dacă doriți să încercați să vă conectați la acest pentru viteze mai bune - și să ne anunțați dacă nu e mai bine - este 12345, tot drumul până la 8 pentru că 8 este mult mai sigură decât 5. Deci, dacă aveți nevoie de parola de acces Wi-Fi gratuit, conectați la CS50 fără fir aici, 12345678, și post 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 de toate Apple a lucrurilor. Ceea ce am dezgropat din urmă cu câțiva ani a fost acest fișier aici, iUnlock.c, doar pentru a face un fel de mai concrete și mai complexe unele dintre cele mai multe programe de bază C-am fost scris. Așa că am deschis acest dosar, iUnlock.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, iar dacă vom începe parcurgerea, ceea ce este de fapt acest este prima, cred, crack pentru iPhone-ul original. Când ai vrut să jailbreak iPhone-ul original, ceea ce înseamnă că despriponi de la AT & T de instalat și de fapt, un software special pe ea și face lucruri pe care Apple nu au vrut oamenii să facă, cineva a luat timp să dau seama exact modul în care acestea ar putea profita de defecte de software, greșeli, bug-uri, în software-ul Apple, și astfel sa născut iUnlock.c-- că, dacă l-ați compilat pe computer și instalat pe un iPhone care a fost conectat la computer prin intermediul, de exemplu, un cablu USB, acest lucru ar da privilegii administrative sau rădăcină de pe iPhone-ul dvs. si te lasa sa faci cam ce vrei. Și astfel acolo a fost aceasta pisica fascinant și mouse-ul joc între Apple și restul lumii, în special în ceea ce ei, ca multe companii, încearcă să blocheze lucrurile lor, în jos, astfel încât să puteți face doar cu el ceea ce intenționează. Dar, datorită oameni ca aceasta și înțelegerea de nivel scăzut detaliu - și, în acest caz, de programare C - ș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 acestea se face, dar GetVersion sună destul de simplă, si se pare ca aceasta este o funcție care această persoană a scris. Este nevoie de un fel de întreg ca un argument, nu se întoarce nimic, dar pare să bucla cu o buclă de aici și o condiție în cazul în care, în cazul întreruperii condiție, ș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ă pe parcursul semestrului. La sfârșitul zilei, ea urmează aceleași reguli și logica pe care ne-am jucat 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 pe care ne-am scufundat în. 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, alte câteva date de tip pe care le-am vorbit despre, dar nu au cu adevărat văzut în C. Acesta este un fișier numit positive1.c, și pe comentariile de la partea de sus, aceasta doar cere ca un utilizator furnizează un număr pozitiv. Deci e un exemplu de bucla do-timp, ceea ce este frumos pentru programele de utilizator interactive în cazul în care aveți nevoie pentru a spune utilizatorului să facă ceva, și în cazul în care nu cooperează țipi la ele sau respinge intrarea acestora. Cauza în punctul: am de gând să fac liniile 19, prin 24 atât timp cât utilizatorul nu mi-a dat un număr pozitiv. Acest detaliu aici, pe linia 18, de ce m-am declar n sus acest looping toată construi spre deosebire de dreptul de lângă linia 22 unde-mi pasă de fapt, pentru a obține n? Da. [Elev] Domeniu de aplicare. Da >>, astfel încât această problemă a domeniului de aplicare. Și în termeni de nespecialist, ceea ce nu se referă la domeniul de aplicare? Da. >> [Elevului răspunsul neauzit] >> Poți vorbi un pic mai tare? [Elev] În cazul în care vă puteți accesa acea variabila. 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 variabile este definit de 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, care linia va funcționa. 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? >> [Elev] 25. [Malan] 25, și se pare că 24 la fel de bine, deoarece în acest caz se încadrează în afara acolade. Deci, doar un pic de o pacoste, dar foarte ușor de rezolvat prin declararea simpla variabila în afara funcției de sine. Vom vedea mai târziu astăzi puteți merge un pas mai departe și ai putea obține chiar și un pic leneș. Și acest lucru nu este 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, in afara de toate functiile pe care le-ați scris, așa cum am făcut-o aici, pe linia 15. Acest lucru este, în general, dezaprobat, dar realiza acest lucru este o soluție, uneori, la alte probleme, după cum vom vedea în cele din urmă. Deci, de acum vom lăsa ca acest lucru, dar să vedem dacă putem rescrie această doar pentru a începe a ne exprima un pic diferit. 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. Asta pare sa functioneze. Poate că nu mai riguroase de testare, 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 2 a acestui, și ceea ce este diferit deja? Aceasta implementează același lucru, dar ceea ce e clar ca sarind diferit de data asta? 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. Ea nu vine incorporat în toate versiunile de C. Ai nevoie de a include o anumită bibliotecă. În cazul nostru, am inclus biblioteca CS50, astfel încât să avem acces la bool. Dar, în linia 18, se pare că avem o valoare booleană aici numit recunoscători. 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 nu sunt, aparent recunoscător deoarece valoarea booleana 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 am doar un fel de rescrise logica mea. Deci, nu funcțional diferite, dar în linia 22 acum am verifica 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 că am de gând să verifice o condiție. Face acest lucru în timp ce bucla recunoscator este falsă. Deci, am propus acest lucru ca pe o alternativă la versiunea 1 pentru că este cel puțin un pic mai intuitiv, probabil, e un pic mai mult pământ în limba engleză. Deci, faceți următoarele în timp ce nu ești recunoscător sau în timp ce recunoscator este falsă. Și de data asta am prea aparent, nu-mi pasă să-și amintească ceea ce utilizatorul tastat în Notă pentru ca nu exista nici n variabile, astfel încât, de fapt, o minciună nevinovată acolo. Funcțional, programul este un pic diferit, odată ce vom ajunge la partea de jos a acestuia pentru că nu mi amintesc ce n este. Dar am vrut să demonstreze aici, de asemenea, că, deși le-am vazut GetInt și getString fiind folosit pe partea dreaptă a unui semn egal până în prezent astfel încât să 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 să verifice valoarea, observați că putem scrie pur și simplu acest lucru ca GetInt, paren deschis, 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ă din, atunci când am tip în 99, GetInt returnează numărul 99, și astfel 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 devine adevărat recunoscător, atunci linia 25 își dă seama ooh, am terminat pentru că eu sunt recunoscător acum, și, în linia 26, ne spune pur și simplu, "Multumesc pentru întreg pozitiv!" ce 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ă variantă, în al treilea și ultimul positive3. Observați diferența abia acum este ceea ce linie de cod? >> [Elev] 25. >> [Malan] Da, 25. Și nu ne-am văzut într-adevăr acest truc doar încă, dar am vedea semn de exclamare luni, care denotă ce? >> [Elev] Nu. 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 mult intuitiv o modalitate de scriere a codului pentru că am inițializa încă recunoscător pentru 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 (recunoscător!); pentru că punctul-bang-ului sau de exclamare denotă noțiunea de a nu, astfel încât în ​​timp ce nu recunoscător. Deci, din nou, nu am introdus nici concepte noi pe sine. Am vorbit despre Booleans înapoi când ne-am jucat cu Scratch, dar dau seama acum putem începe doar scris codul nostru în mai multe moduri diferite. Deci, în special în pset1 daca esti un fel de luptă pentru a afla modul de a scrie un program, Șansele sunt sunteți în noroc, deoarece nu poate exista orice număr de soluții pe care le poate întâmpla la. De exemplu, aceasta este la doar 3 chiar și pentru cea mai simplă de programe. Bine. Și amintesc acum pe luni am plecat de pe acest act cu valori de returnare. Deci, pentru prima dată am scris un program care nu are numai 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 o * o * o în acest caz. Dar ceea ce este important despre el este că eu iau de intrare în formă de si eu întorc de ieșire în formă de * o * o. Asa ca acum am capacitatea, la fel ca am folosit pentru a prinf cu monoterapie, pentru a apela această funcție prin apelarea funcției cub. Și funcția de cub are unele de intrare, precum și funcția de cub returnează ceva de ieșire. Prin contrast, printf făcut ceva. Ea nu sa mai întors nimic din ce ne pasa, chiar daca ca o parte aceasta nu returneze o valoare; ai ignora, în general, aceasta. 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, 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 ieșiri obtinerea înapoi, Să încercăm doar ceva simplu super. Este cineva confortabilă vine pe scenă pentru scurt timp? Trebuie sa fie confortabil cu un aparat de fotografiat pe tine la fel de bine. Da? Bine. Care e numele tău? >> [Elev] Ken. Ken >>. Bine. Ken, haide sus. Ken va fi o funcție de felul aici. 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, si nu am un iPad în mâna mea. Nu-mi aduc aminte cu adevărat cum să - Ei bine, eu nu pot spune asta. Eu nu prea am scris de mână bună, și așa mai departe, prin urmare, vreau să imprimați ceva pe ecran pentru mine. Sunt fiind programul principal, și am de gând să vă spun acest lucru de scris-o în zero puiul meu și apoi trecând pe lângă tine o intrare. Deci, o prostie, deși acest exercițiu este, noțiunea de funcții și de asteptare o funcție și returnarea unei funcții într-adevăr se reduce la asta. Sunt principal, am scris doar printf, citat-citatul ceva pe ecran, Sunt rulează 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. El este o cutie neagră scris un numar de ani in urma care se pare că doar știe cum să imprimați lucruri pe ecran. Deci executa. Asta nu e rău. Foarte bine. Deci, acum, Ken se face de executare. Are el nevoie să-mi dai ceva inapoi? Nu că ne-am văzut până acum. Din nou, se întoarce de fapt printf un număr, dar vom ignora faptul că, pentru moment pentru că n-am folosit-o. Deci, asta e ea pentru Ken. Și acum principalul preia controlul asupra programului din nou pentru că linia de cod, printf, se face de executare. Și vom merge despre felul nostru, indiferent de executare alte linii sunt acolo. Deci, acum să încercăm un exemplu ușor diferit. De data aceasta sa aici a goli primul ecran, și de data aceasta 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. Acum am o linie de cod care spune x devine cub de x. Linia de cod, rechemare, arată astfel: x = cub (x); Deci, cum este aceasta va funcționa? Să mergem mai departe și vă va oferi un ecran alb din nou. Am de gând să scrie acum valoarea lui x, care la acest moment, în timp se întâmplă să fie, să zicem, 2 să-l păstrați simplu. Am scris pe o bucată de hârtie valoare de 2, care este x mea valoare. L-am preda la Ken. Și >> scriu doar răspunsul? >> Da, să scrie doar răspunsul. Bine. Și acum el trebuie să se întoarcă ceva. Eveniment. Nisa segue. Așa că acum mi mâinile înapoi valoarea de 8, în acest caz, și ce să fac cu ea? De fapt - să vedem, obține 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 aceste biți aceleași în memorie. Dar observați că 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 pe care a avut valoarea 2, care a fost x, și, într-adevăr, asta este exact ceea ce sa întâmplat. Deci, se dovedește că, atunci când apelați funcția și tu treci într-un argument ca salut, lume sau te treci într-un argument cum ar fi 2, în general, te trece î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ă însemne că am încă o copie a valoarea 2 undeva deoarece, într-adevăr, acum că am ajuns înapoi valoarea 8, am nevoie să mă întorc în memoria RAM și scrie de fapt, in scadere cu 8 în cazul în care am avut o dată numărul 2. Deci vizual, amintiți-vă această noțiune de a trece în, literalmente, o copie a valorii. Ken face treaba, mi mâinile înapoi ceva - în acest caz o valoare cum ar fi 8 - și apoi am să fac ceva cu acea valoare dacă vreau să-l păstrați în jurul valorii de. Deci, toate acestea vor veni înapoi pentru a fi mult prea familiarizat înainte de mult timp. Va multumesc foarte mult pentru această demonstrație aici, Ken. [Aplauze] Foarte bine făcut. 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. Lasă-mă să mergeți mai departe și să ne aducă înapoi la exemplul cubaj aici. 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 in pentru a funcționa. Deci, din nou, aceasta trecere prin copiere va deveni destul de Germane într-o clipă. 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 treilea, care este viciată prin natura, și se numește buggy3 și pune în aplicare o funcție de pompare. Aici avem o funcție principală care a x și y arbitrar inițializat cu 1 și 2, respectiv. Am putea folosi GetInt, dar avem nevoie doar de un exercițiu simplu, deci e greu codate ca 1 și 2. În linii 21 și 22, am imprima aparent afară x și y, 1 pe linie. Apoi, pe linia 23, eu pretind am swapping aceste valori, punct, punct, punct. Am aparent apela o funcție în linia 24 de swap numitul care ia 2 argumente. Este complet legitim pentru funcțiile de a lua 2 argumente. Am văzut printf o fac deja. Deci, de swap are aparent x și y, și cum sugerează și numele, Sper că se va schimba aceste 2 valori. Deci, apoi m-am pretinde pe linia 25 "schimbat!" si eu reimprimați x și y în ipoteza în care le-am fost într-adevăr schimbate. Dar dacă am alerga de fapt, acest program - lasă-mă să deschid o fereastră de terminal, permiteți-mi să buggy3 - 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, acestea sunt încă, de fapt, același lucru. Deci bazează pe demonstrarea chiar acum cu Ken, ceea ce se întâmplă de fapt aici? Haideti sa patrundem in aceasta functie de swap. E foarte scurt. E doar câteva linii de cod lung. Dar ceea ce este problema fundamentală pe baza povestea simpla a spus aici cu Ken? De ce este rupt de swap? [Elev] Ai stocarea într-o copie, nu variabila. Exact. Suntem stocarea într-o copie care nu, variabila în sine. Cu alte cuvinte, de swap are 2 argumente aparent, un int, și se numește arbitrar a și b, și până 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 aproape ca și cum l-ați copiat și inserat în schimb valorile pe care doriți să-l să manipuleze efectiv. Deci, dacă acesta este cazul, atunci când am început programul 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? >> [Elev] 1. [Malan] Ar trebui să fie doar 1, dreapta, pentru că a fost adoptată în x ca prim argument, și această funcție doar arbitrar este de asteptare primul argument o. În mod similar este y al doilea argument, și este doar asteptare arbitrar b doilea argument. 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, 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. 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ții de variabile ce te de asteptare sau de a folosi. 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ță nu ar ști Ce variabile mei vor să fie numit, astfel seama că acesta este motivul pentru care aveți această dualitate de nume. Punct de vedere tehnic, am putea face acest lucru prin coincidență, dar ele 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 de swap au folosit aceleași nume. Deci, în acest moment, în poveste, linia 37, a este 1, b este 2, iar acum am proceda pentru a le schimba. Mai întâi de toate, permiteți-mi să fac asta, de fapt mult mai simplu. Nu știu ce aceste 3 linii de cod au fost faci. Lasă-mă să fac asta: b = a; a = b; făcut. De ce este acest rupt, în mod logic? E un fel de lucru intuitiv, nu? Deci, un B devine și b devine o, dar problema este că de îndată ce linia 37 execute, ceea ce este valoarea a și b? Același, 1, pentru că ați clobbered, ca să spunem așa, v-ați schimbat pe b pentru a egale cu o. Deci, odată ce linia 37 a executat, asta e grozav, acum aveți 2 copii ale numărul 1 în interiorul acestei funcții, astfel încât atunci când spui în linia 38 a = b, esti un fel de înșurubat 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ă, și este un int pentru că trebuie să se potrivească ceea ce vreau să fac o copie a. Am stoca o copie a interiorul tmp, astfel încât odată ce linia 37 a executat, valoarea a este - verificare rapidă bun-simț - 1, valoarea lui b este 2, și valoarea tmp este de asemenea, 1. Așa că acum am executa linia 38. 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, iar tmp este 1, asa ca acum logic, putem doar valoarea plop tmp lui in b si am terminat. Deci am rezolvat problema. Din păcate, atunci când am rula acest program în această formă, ea nu schimba de fapt nici o valoare. Dar pentru a fi clar, de ce? Am fixat problema logică de la doar o clipă în urmă, dar, din nou, în cazul în care am rulat acest program, x și y rămân neschimbate până la sfârșitul execuției programului. [Comentariu elev nu pot fi auzite] >> Noi nu am întors nimic, așa că 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, iar aceasta este o restricție a lui C. Puteți reveni cu adevărat numai o 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 ambele înapoi. Deci, revenind, nu este o soluție simplă aici. Dar problema fundamental este de ce? Ceea ce am de fapt schimbat? [Elev] a și b. A și b >>. Dar a și b sunt copii ale lui x și y, ceea ce înseamnă că a făcut doar toate aceste lucrări, am petrecut doar 3 minute vorbind despre funcția de swap și toate 3 din aceste variabile, și asta e minunat, perfect corectă în izolare, dar a și sfera de aplicare a lui B este numai în aceste linii aici. Deci, doar ca o bucla de, daca declara un întreg i în interiorul bucla for, În mod similar, dacă sunteți în interiorul declarare a și b de o funcție care le-ați scris, acestea sunt valabile doar în interiorul acestei funcții, ceea ce înseamnă că de îndată ce se face schimb de executare și vom trece de la linia 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 ne putem întoarce doar 1 valoare, și chiar nu vreau să schimb atât x și y, în același timp, așa că va trebui să se întoarcă la asta. Dar pentru moment, realizăm că problema fundamental derivat din faptul că a și b sunt copii și acestea sunt în domeniul de aplicare propria lor. Să încercăm să rezolve acest lucru în vreun fel. Lasă-mă să derulați înapoi de fapt, aici și să se deschidă, să zicem, o variantă patrulea de acest lucru, buggy4. 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 rezolvarea ei. 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. Apoi am pretind x este 1, atunci eu pretind "incrementare ..." Eu numesc apoi creșterea, dar apoi, în linii 22 și 23, eu pretind că a fost incrementat, Eu pretind x este acum orice ar fi - 2, probabil - dar acest program este buggy. Care e problema? Da. >> [Elevului răspunsul neauzit] >> Exact. Deci x a fost declarată, în mod evident, pe linia 18. Care este în interiorul acolade principalele lui. Deci, răspunsul simplu aici este că în timp ce există aici x, aceasta nu există în linia 32, astfel încât acest program, de fapt nu se va compila chiar. Compilatorul atunci când am încercați să compilați acest cod este de gând să țipi 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 încât acest lucru este util în ore de birou si 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 5. Deci 1, 2, 3, 4, 5. Asta e, de fapt, în cazul în care problema este. Și, de asemenea, de asemenea, să păstreze în minte 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 seama că cel mai de jos ar putea fi doar simptomatic al celui 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 sugerând că este aveți probleme mod mai mult decât tine de fapt face. 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. 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ă, așa că hai să spunem doar x int aici. Asta face x la nivel mondial. Deci, acum, principala are acces la aceasta, și creșterea are acces la acesta, asa ca lasa-ma si merge mai departe și a compila acest lucru acum. Asigurați-buggy4, Enter. Pare a compila acum. Să fugi buggy4. Și se pare că funcționează efectiv. Acesta este unul dintre aceste lucruri pe care facem cum spun eu, nu ce fac eu, cum am făcut doar aici, deoarece, în general, Programele noastre sunt mergi la a lua mult mai interesant și mult mai mult decât aceasta, și în cazul în care soluția la problemele vieții se pune doar toate variabilele din partea de sus a fișierului, foarte repede se ajunge programe groaznic de dificil de a gestiona. Ea devine mai greu să ne gândim la nume noi variabile, devine mai greu să înțeleagă ceea ce este de a face ceea ce este variabilă, ș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, așa că am putut în mod evident - la sfârșitul zilei, acest lucru este un fel de poveste prostie pentru că am face exact acest lucru - dar dacă nu știam despre asta operator sau nu mi sa permis să-l schimbe în principal în sine, cum altfel aș putea să pună în aplicare Ken aici de data aceasta nu sa cub, ci pentru a incrementa? Cum pot schimba acest lucru aici? Da. [Elev] Pass în x și apoi să se întoarcă [neauzit] >> Bine, bine. Deci, de ce nu am trece în x și apoi, mai degrabă decât să îl returnați, de ce nu am mai reveni x + 1. Un cuplu mai multe lucruri trebuie să se schimbe aici. Sunt pe drumul cel bun. Ce altceva mai am nevoie să tweak? Altcineva. Da. [Răspuns studentul neauzit] Am nevoie pentru a schimba tipul de creștere, deoarece revenirea nu este anulat. Înseamnă nimic nu este nulă fiind returnate, dar în mod clar acum este, astfel încât acest lucru trebuie să se schimbe pentru a - >> [elev] int. int pentru a fi în concordanță cu ce am eu de fapt întorc. Acum altceva este încă buggy aici. Da. [Răspuns studentul nu pot fi auzite] >> [Malan] Așa că am nevoie pentru a incrementa x? [Răspuns studentul nu pot fi auzite] >> [Malan] Ah, asa ca am nevoie pentru a trece x. Așa că am nevoie să fac asta aici. >> [Elevului în comentariu neauzit] [Malan] Deci prototip, trebuie să schimbe asta aici. Deci, acest lucru trebuie să devină un int, aceasta trebuie să devină - hmm, de fapt, am un bug aici. Să rezolva această problemă primul. Ce ar trebui să fie, de fapt asta? Trebuie sa fie un ceva int. Ar putea fi x, dar, sincer, dacă începeți de asteptare toate variabilele x dumneavoastră, se va obține 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 funcțiile de ajutorul meu, funcțiile scriu. Vom numi o, sau am putea spune - Să-l numim numărul fi chiar mai explicită. Deci, atunci am să se întoarcă, indiferent de numărul este de plus 1, si acum am de a schimba un alt lucru aici și un alt lucru aici. Ce trebuie să se schimbe pe linia 21 primul? >> [Elevului răspunsul neauzit] [Malan] Am să le atribuie x. Eu nu pot apela doar creștere (x). Am nevoie să-mi amintesc răspunsul prin schimbarea valorii lui x pe partea stângă. Și chiar dacă x este acum pe stânga și dreapta, asta e total bine deoarece partea dreaptă este executat primul, apoi se plopped în chestia stânga - 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, numărul int. Deci, o grămadă de modificări pentru o functie foarte prost dar reprezentativ de lucruri pe care le veți dori să facă din ce în ce. Deci, a face buggy4. Am greșit undeva. Oh, Doamne. Cinci greșeli într-un program de 6-line. Deci, ce e în neregulă pe linia 18, caracterul 5? Așa că trebuie să declare acest lucru int,. Să vedem. Există o grămadă de alte erori. Oh, Doamne - 19, 18, 21 - dar, din nou, să debifați ecran, L control aici, și rulați din nou zăngănit. Deci, 5 probleme este de fapt doar că: 1. 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. [Întrebare elev nu pot fi auzite] >> Bună întrebare. Cum se face că eu pot schimba doar x la numărul și programul va ști imediat? Din nou, cred ca e asta abstractizare. Deci, dacă eu sunt principala si Ken este creștere, sincer, nu-mi pasă ce Ken numește iPad lui. Nu-mi pasă ce el numește ceva care are de a face cu punerea în aplicare a acestuia această funcționalitate. Acesta este un detaliu de implementare pe care am, principal, nu trebuie să pasă. Ș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 permiselor de conducere care au condus sau dacă 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ă cunoști cu adevărat ceea ce ne uitam la, un fel de ca tine s-ar putea simți 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 masinii 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. >> [Intrebare elev neauzit] Dacă există 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. >> [Elev] Dacă există mai multe variabile [neauzit] Un ordin special ca aici, în cazul în care acest lucru a fost un alt număr de int? >> [Elev] Corect. [Malan] Da. Comanda contează, 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 primului argument aici. Scuze. Acest lucru nu ar trebui să fie o paranteză. Liniile doilea argument până cu cea de a doua. Deci ordine, da, materie. Bine. Scuze. Mi-am luat 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. Acesta este un dreptunghi care ar putea reprezenta memoria computerului. 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 megaocteți de ea, ai gigaocteți de ea, și știm de la saptamana 0, care dintr-un octet este doar ceea ce? >> [Elev] 8 biți. 8 biți, nu? Deci, 8 zerouri și 1. Deci, în cazul în care computerul are un gig de RAM, 2 gig-uri de memorie RAM in aceste zile, aveți un miliard sau 2 miliard de bytes de memorie sau de aproximativ 8 miliarde euro sau 16 miliarde biti în interiorul computerului. Spre deosebire de mic Wooly exemplu Willy, nu e de obicei mai particulele magnetice. Din ce în ce - în laptop-uri, cel puțin - e drive-uri solid de stat, SSD-uri, care au doar fără componente în mișcare. Totul e electronic. E toată energia electrică pe bază de. Deci, cred că a dreptunghiului ca reprezentând doar 1 sau 2 GB de memorie pe care le au. Deci e un segment de memorie. Lumea științei calculatoarelor a fel de partiționat în afara bucati de memorie pentru a face lucruri diferite. De exemplu, în cazul în care acest lucru este memoria RAM a computerului, astfel cum a sugerat de către dreptunghi acolo, se dovedește că, prin convenție, în partea de sus a RAM-ul, ca să spunem așa, este, în general, ceea ce se numește un segment de text. Acestea sunt 0s și 1s pe care le-ați compilat. Așa că atunci când ne-am uitat sub capota de la ceea ce este a.out, toate acestea 0s și 1s, când executați un program, cei 0s și 1s sunt încărcate de pe hard disk-ul în ceva numit RAM, și în memoria RAM ei pus la partea de sus. Între timp, aveți alte lucruri: inițializarea datelor, anuleze date. Cele 2 brazde de memorie se referă la variabile globale, pe care nu le utilizați des dar, uneori, dacă faci, ei sfârșesc acolo, de asemenea. Apoi, există alte lucruri: variabile de mediu, care nu va petrece prea mult timp pe, dar apoi 2 lucruri importante care vor veni înapoi de-a lungul semestrului, stiva si heap. Deci, cele mai multe dintre memoria calculatorului este rezervat când se rulează un program de pentru ceva numit stivă și ceva numit heap. Noi nu vom vorbi despre heap astăzi, dar vom vorbi despre stiva. Stivă este menit să evoca vizual al tăvi de masă, în sala de mese Mather Casa 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, 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? Să mări doar pe jumătatea inferioară a acestui tablou, memoria RAM a computerului, să propună următorul. Se pare că, atunci când executați un program ca a.out sau Hello - oricare ar fi programul este că ați scris - din nou, cei 0s și 1s sunt încărcate de pe hard disk, care este depozitarea pe termen lung, stă acolo chiar și atunci când vă trageți de ștecher, î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 PC, este încărcat de pe unitatea hard disk în memoria RAM. De îndată ce este încărcat în memoria RAM, du-te 0s și 1s de la partea de sus drum, segmentul așa-numitul text, dar apoi, cât mai curând program de fapt începe să funcționeze, Funcția principală este numit, ș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 le-ați dublu clic folosit unele variabile din interiorul principal, acestea ajung la partea de jos a stack-ul tău de memorie, ca să spunem așa. Mai concret, ce înseamnă de fapt? Acest lucru înseamnă doar că, dacă am fost de gând să numarul de bytes de RAM în calculatorul dumneavoastră, 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, tot drumul până la 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, înseamnă doar că cineva a decis ce la numărul fiecare dintre 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 se ajunge în memorie? Conceptual, ajung doar până la partea de jos a acest lucru numit stivă. Dar ceea ce este interesant este acum când principala apelează o funcție - să presupunem că o funcție numită foo, doar un nume arbitrar - ceea 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 a foo ajung fel de conceptual de mai sus, în principal cele. Î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 că pe măsură ce numesc funcții și în care aceste funcții apel funcții și în care 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 program intenționat buggy. 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 se va schimba vreodată pe noi, și lasă-mă să mergeți 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 face această greșeală - i + +. Și să nu printf aici. Să practica ceea ce am fost predica. Să aveți o metodă de aici, cor nule, si vom spune: int i, și apoi am de gând să spun printf - nu, hai să facem asta mai interesant. Să nu imprima nimic, la toate. Hai să facem asta: cor (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 într-adevăr bug fundamentală. Solicită Principalele cor să cânte niște cor, apoi am facut o prostie si am avut apel refren refren Am presupus că altcineva a fost de gând să-l pună în aplicare, poate, iar acum acest lucru nu este de gând să compileze î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, dacă mă 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 identificator nedeclarate i. Oh, asta a fost o prostie. Nu avem nevoie de argument. Hai să facem asta. Aș vrea să am inceput acest drum. Acesta ar fi fost un program mult mai ușor să scrie. Acolo. Acum hai să mergem pe la fereastra terminalul meu, rulați din nou 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. Permiteți-mi să spun printf ("Sunt aici") - nu variabile. Ne vom lăsa așa. Lasă-mă să fac reluare. Lasă-mă să rulați din nou 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. [Răspuns studentul nu pot fi auzite] >> Exact. Deci, este nevoie de timp pentru a imprima, nu? Este nevoie doar de mai mult de lucru pe partea computerului. Și acolo este: Segmentation fault. 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ă? Dacă te gândești la modul în care memoria computerului este stabilită, aceasta se întâmplă să fie principal, dar aici 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, literalmente, este aceasta, 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 0s și 1s, care reprezintă programul dumneavoastră. Pe scurt, aceasta este doar rău super, super. Programul tău a scăpat de sub control. Te folosind memorie mult mai mult decât ați intenționat toate din cauza o greșeală stupidă, în acest caz, sau, în acest caz, o functie foarte deliberat făcut el însuș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, eu asteptare Este o slăbiciune fundamentală a acestui program aici. Deci, unde mergem cu toate astea? Ce se întâmplă cu adevărat? Când am apela funcția incrementului ca facem în aceste exemple, Am o valoare cum ar fi 1, care trec inch Trec într-o copie a numărul 1, așa se întâmplă următoarele. Să mergem în creștere de exemplu, tipul ăsta chiar aici. Iată ce se intampla de fapt. Când m-am sun creștere și trec în x, pictural, ce se întâmplă aici este aceasta. Dacă am avea valoarea de 1 depozitate aici și eu sun de fapt creștere, care este acum numit cor - iPad este aruncat de pe mine aici. Să numim această creștere, și nu știm ce această funcție este următoarea va fi. Deci, ce se intampla de fapt este pe aici pe undeva, în principal am o bucată 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 copia 1. Când m-am incrementa această valoare, aceasta devine 2, dar apoi 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ă că tot ce-ai făcut nimic util. 1, care a fost inițial incluse în principal, de fapt este încă acolo. Deci, unde mergem cu asta? Se pare că, în memoria aveți această secvență back-to-back de octeți pe care le pot pune lucrurile în, și se pare că le-am văzut deja ceva care implică punerea lucrurile spate în spate în spate în spate. Ce este un șir bazat pe săptămâna 1 și săptămâna 2 acum? E doar o colectie de caractere. Deci, se dovedește la fel ca tine poate pune numere în memorie, În mod similar se pot pune de caractere în memorie. Și, odată ce vom începe caractere punerea în memorie spate în spate în spate în spate, 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 - ar putea deveni un b, b ar putea deveni c - astfel că în cele din urmă, putem lua o teză română care face de fapt sens și de a converti fiecare dintre aceste scrisori o la un moment dat de mers pe jos, prin memoria calculatorului nostru la stânga la dreapta pentru a cripta de fapt. Așa că haideți să ne cinci minute pauză aici, și când ne vom întoarce, vom începe acest proces de codare de informații. Bine. Înainte de a se arunca cu capul în unele noi Crypto si aceste lucruri numite matrice, lasă-mă să pauză pentru orice întrebări pentru că mă simt ca și cum aș într-adevăr un fel de confuze unele dintre aceste subiecte. Așa că hai să stabilească acum dacă putem. Tocmai 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 să vină, de vizualizare memorie ca o gramada de aceste tăvi suprapuse, ca să spunem așa, de jos in sus, astfel încât fiecare tavă pe care se pune pe stiva reprezintă o funcție care este în prezent fiind numit. Alte întrebări? Permiteți-mi să pun o întrebare aici. Lasă-mă să simplifice această înapoi la ceea ce a fost înainte o parte din Q & A. noastre anterioare Faptul că incrementului are paranteză deschisă, numărul de int, închis paranteza - ceea ce nu reprezintă numărul de int? [Elev] Un argument. Un argument >>. Bine. Dar ce e un argument? [Răspuns studentul nu pot fi auzite] >> Ce e asta? >> [Elev] Ceva ce treci inch Ok, deci ceva ce treci inch Și, în general, mai mult, e doar de intrare. Dacă ați fost scris o funcție și scop care funcționează în viața este de a face ceva un pic diferit de fiecare dată când îl folosiți, atunci singura cale pentru ca să se întâmple într-adevăr ar părea să fie să îi furnizeze cu intrare astfel încât să poată face ceva diferit cu care de fiecare dată de intrare. Deci, trebuie să specificați două lucruri atunci când o functie are intrare. Ai nevoie de a specifica numele pe care doriți să dea la intrare pur și simplu pentru confortul dvs., astfel încât să puteți referi la ea în funcție de care te-ai scris sunt, 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 prevede că în cazul în care doriți o variabilă, trebuie să spun calculatorului ce tip de date este, în mare parte, astfel încât să știe câți biți să le aloce pentru variabila deoarece ar putea fi 6 - Îmi pare rău, nu va fi 6. Acesta poate fi de 16, acesta poate fi de 8, acesta poate fi de 32, chiar 64, dar calculatorul trebuie să știe. Acum, int pe partea stângă reprezintă ceea ce, prin contrast? [Răspuns studentul nu pot fi auzite] >> Ce e asta? >> [Elev] Tipul de funcție. Tipul de o funcție și, mai precis, tipul rezultatelor acestuia. Corect. Deci, întrucât lucru în paranteze reprezintă intrarea acestuia, dacă este cazul, lucru pentru a 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, utilizați retur cheie și apoi, dacă ceea ce se întorc la dreptul de cuvinte cheie este un număr întreg, apoi că este într-adevăr în concordanță cu ceea ce am promis. Tu nu ar putea face așa ceva - Bună ziua, 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, să fie specifice cu privire la ceea ce suntem și de a se întoarce apoi mergi de fapt, despre returna. Contextul aici este faptul că memoria computerului este un gigabyte, 2 gigaocteți - orice - poate e mai mult, poate e mai putin, dar care computerul îl vede ca având secțiuni diferite. Ceva nu merge acolo, ceva merge acolo sus, chestii diferite merge în mijloc, iar astăzi vom începe doar spune povestea, 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 0s și 1s, care a zăngănit emise. Deci, atunci când executați o comandă de la tastatură ca a.out sau faceți clic dublu o icoana de pe Mac OS sau Windows, programul este încărcat de pe hard disk în memoria RAM și este plopped la partea de sus a memoria RAM a computerului dumneavoastră, ca să spunem așa. Între timp, ca program începe să curgă și principalele este chemat în programul scris sau programul Microsoft sau Apple a scris, oricare dintre variabilele sale locale ajung acolo, la partea de jos a memoriei computerului. 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. Ș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 nu teancul de tăvi, ca să spunem așa, începe pentru a obține 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 creștere, sunteți trece într-o copie a valorii. Și ce înseamnă asta pictural este că sunteți scris literalmente numărul 1 într-o altă parte a memoriei, care schimba 1 la 2 în cazul incrementului sau la un 8, în cazul cubului și apoi aruncat departe că memoria de îndată ce creșterea sau revine cub funcția. Întrebare. [Elev] În cazul în care sunt stocate variabilele globale? Variabilele globale sunt stocate în ceea ce se numește în prezent, datele inițializată sau date neinițializate, diferența fiind în cazul în care aveți o variabilă globală și îl atribuiți o valoare imediat cu semnul egal, se termină în partea de sus acolo, și dacă spune doar x int; cu nici o valoare, aceasta ajunge ușor mai scăzute în memoria RAM pur și simplu prin convenție. Alte întrebări? Bine. Deci, această imagine va veni înapoi ca vom ajunge mai puternice cu ceea ce putem face cu calculatorul, dar pentru acum, haideți să o introducere scurtă criptografie, un anumit tip de criptografie care nu rezolva toate problemele lumii dar nu rezolva unele dintre ele. În acest caz aici, avem ceva numit secret de-cheie criptografiei. Secret-cheie criptografiei, așa cum sugerează și numele, provine de securitate de la un secret. De exemplu, dacă te-ai întors în școala primară și ai fost trece un pic scrisoare de dragoste secretă pentru băiat sau fată ai fost de concasare pe, dacă ai vrut să treci prin această notă publicul, probabil că nu ar scrie o astfel de notă în limba engleză sau orice limba dvs. maternă este. Mai degrabă, s-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ță, în așa fel încât prietenii și profesorilor Nu știu ce scrii, s-ar putea veni cu un algoritm destul de simplu, 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 scrisori către diferite litere. 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? >> [Elev] Ceea ce trimit. Ce secret este, ca ceea ce este faptul că de cartografiere între lui și a lui b și c și a lui d'uri. Este adăugând doar 1 pentru fiecare dintre litere pentru a merge 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 e un fel de Catch-22 aici. Dacă aceasta este prima dată când trimiteți acest scrisoare de dragoste prin clasa, cum este faptul că băiatul sau fata de gând să știu ce este secretul, chiar? Deci, secretul-cheie criptografic nu rezolva toate problemele lumii, și nu există de fapt, o relatie aici, pe care ne vom întoarce la sfârșitul semestrului spre lui. În mod similar nu mai mulți dintre noi cunosc pe cineva care lucreaza, de exemplu, de la Amazon.com, și, totuși, mulți dintre noi au cumparat, probabil, lucruri pe Amazon.com, și am fost învățați să se presupună că aceste tranzacții e-commerce sunt sigure. URL-ul, probabil, spune https, poate exista 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 care criptografia implică cunoașterea vreun secret și totuși eu nu cunosc pe nimeni de la Amazon și am aranjat cu siguranță, nu orice fel de secrete cu cineva de la Amazon, cum este calculatorul meu sau browser-ul meu face acest lucru? Se pare că există și alte tipuri de criptografie cu totul, care rezolva această problemă. Dar pentru ziua de azi, ne vom concentra pe unul simplu în cazul în care vă puteți aranja în avans pentru a cunoaște vreun secret cum ar fi o cartografiere sau unele dintre un lui și a lui B. Și procesul de criptografie implică, în general, acest lucru. Ai un text simplu, descrise aici, la stânga, ce îl rulați printr-un fel de algoritm sau procedurii de criptarea ea - Poate că e doar o devine b, c b. devine - și apoi termina cu text cifrat. Între timp, odată ce v-ați îndrăgostit primește această notă secretă, el sau ea trebuie să-l decripta apoi, în general, prin inversarea acestui algoritm în așa fel încât să mă întorc text simplu. Momentan nu sunt încarnări fizice ale acestui. De exemplu, acest lucru este un pic decodor inel secrete, ș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 că prin acest inel vă puteți transforma un fel de afara, dar nu în interiorul în scopul de a alinia numere cu litere. Dintr-un film numit o poveste de Crăciun, veți vedea că Ralphie mic a fost atât de dornic să ne dăm seama ce mesaj secret orfane Annie Little a fost să-l care au fost comunicate, cred, în formă de mesaje numerice de pe o cutie de cereale și a trebuit să acumuleze toate cărțile mici care au venit în cutie de cereale, trebuia să le expediați prin poștă, în, trebuia să te întorci inelul decodor secrete astfel încât să vă puteți da seama în cele din urmă ceea ce este de cartografiere între litere și cifre sau scrisori și scrisori. Cum într-un calculator putem merge despre punere în aplicare sau care reprezintă lucruri de genul asta? Avem nevoie de o modalitate de a ne exprima un pic mai flexibil decat variabilele noastre până în prezent au permis. Am avut Ints, am avut de caractere, am avut flotoare și duble și câteva, dar cei care sunt piese individuale de memorie, care nu permit într-adevăr ne-a exprima lucrurile cum ar fi cuvinte și propoziții și fraze. Într-adevăr, am sunat siruri de astfel de lucruri, dar promit că acesta este de fapt doar o simplificare în bibliotecă CS50 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, ca de obicei, on-line - array.c numitul pentru a rezolva o problemă fără legătură cu siruri de caractere, dar că înfățișează o imagine aici de modul în care am putea folosi ceva numit-o matrice. Un tablou este un tip de date. E un tip de variabile de felul care are mai multe tipuri de date mai mici în interiorul de ea spate în spate la spate în spate. Deci, de exemplu, în cazul în care am vrut să scrie un mic program care vă oferă dumneavoastră medie Quiz pentru un curs care are ca 50 2 teste, ai putea foarte ușor a scrie acest program bazat chiar pe unele din material de săptămâna trecută prin utilizarea GetInt și un cuplu de variabile: int quiz1, int quiz2. Și e destul de simplu. E poate 10, 20 de linii de cod maxim pentru a pune în aplicare un program de care cere utilizatorului pentru rezultate test 2 și apoi calculează media lor adăugându-le împreună, împărțind cu 2, 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 au avut 3 sau 4 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ă există 16 sau atât de 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, aceasta ar trebui să înceapă să te fac să doriți exista un mod mai bun. Și din fericire, din cauza matrice 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 folosi toate majuscule doar pentru că într-adevăr iese în evidență în cod, și cuvântul cheie speciale pe care le utilizați în C # define este. Deci, noi spunem # define, apoi un spațiu, apoi cuvântul pe care doriți să o utilizați pentru numele lui constanta și apoi valoarea constantă. Observa acest lucru este diferit de la atribuirea ceva la o variabilă. Nu e nici o inscriere egal, nu e nici o virgulă. Aceasta este ceea ce este, în general, cunoscut sub numele de o directivă preprocesor, dar mai mult pe altă dată. Pentru moment, acest lucru creează o valoare invariabilă numit QUIZ a căror valoare reală numerică este 2. Deci, oriunde vedeți teste, Teste, Teste pe parcursul acestui fișier, asta e doar numărul 2. Dacă mă uit la principal acum, să vedem cum funcționează. În primul rând se pare un pic criptic, dar e tot chestii din săptămâna 1. Solicita utilizatorul pentru clasele. Cum facem acest lucru? În linia 22 - aceasta este într-adevăr partea suculent - Declar un flotor dar nu doar un singur flotor. Sunt declara, mai degraba, o serie 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. Faptul că am spus clasele float și apoi suportului deschise și apoi un număr - observați dacă aceasta este o constantă acest lucru este la fel ca noi am făcut asta - aceasta înseamnă, "Hei calculator, da-mi 2 flotoare și să numim în mod colectiv le note." Acest lucru este în contrast cu un proces mult mai plictisitor ca aceasta: float grade1; float grade2, și așa mai departe. Deci, un tablou ne permite să pună în aplicare această idee, dar mult mai puțin messily, î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. Nu am vrut să-hard codul 2 pentru că dacă te gândești la asta acum logic, Presupun că anul viitor CS50 modificări la 3 concursuri de schimb si am avut numărul 2 aici, am avut numărul 2 aici, Am avut numărul 2 aici, numărul 2 aici. Ea devine foarte obositor si foarte usor de bară și de a schimba accidental o valoare 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ă faptul că, cum sugerează și numele, niciodată modificări. Și acum, indiferent dacă avem diferite chestionare acest an sau viitor, Trebuie doar să-l schimbați într-un singur loc aici, la partea de sus. Deci, asta e tot o constantă este. Între timp, noua caracteristică conceptuală este aceea a unei matrice. Deci parantezele pătrate Dă-mi asta pluteste in mai multe și îmi permite să le numim colectiv 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 QUIZ în loc de un număr de hard-coded. Dar nu e nimic intelectual diferit acolo de săptămâna trecută. Aceasta este doar printf, deci printf ("Quiz d #% d din%:") pentru că vreau doar să imprime-mi dea testul numarul 1 din 2 și apoi 2 din 2. Deci, acesta este un lucru pur estetic. Dar partea interesantă este acum în linia 27. În scopul de a umple intr-unul din cele două substituenților, cu o valoare în virgulă mobilă, 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? [Elev] 0. >> [Malan] 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 scris asta în codul meu. Dar faptul că mă folosind o variabilă este perfect, deoarece, după cum sugerează și numele, 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? Motivul pentru care am desenat dreptunghiul super-simplu pe ecran aici înainte 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 mărimea 2, în acest caz aici, tot aș fi făcut prin tastarea în scorurile test mele place aici - am luat 100 la aceasta, și apoi am primit un 99 de data asta - atunci această memorie ar putea să nu fi folosit chiar și pentru că am cerut doar calculatorul pentru o gamă largă de dimensiuni 2. Aceste piete sunt încă acolo, nu? Ai inca 2 GB de RAM, chiar daca esti doar cer pentru 2 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 contiguu în interiorul memoriei pe care le pot pune lucrurile. 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, si apoi am folosi funcția rundă aici pentru a face de fapt suma împărțit Teste. 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 două Quiz împărțit la 2 și apoi imprimarea ca un întreg. 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. 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, lungimea șirului. Aceasta este o funcție care vine cu C, care, dacă-l dați un șir, vă spune cât de multe caractere sunt în șir. Asta e tot. Și faptul că e strlen în loc de lungimea șirului este doar pentru că e mai succintă. Treizeci de ani în urmă, oamenii îi plăcea să scriu lucrurile așa cum succint posibil, așa că 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. În linia 24, am spus, "Computer, dă-mi un personaj, 8 biți, și îl numesc c". Dar ce este acest lucru pe partea dreaptă spui? În limba engleză, ceea ce nu reprezintă faptul că? [Elev] primul caracter din matrice. Exact. Dă-mi primul caracter din matrice. Sau, mai general, dă-mi-lea caracter din matrice. Și dau seama că e important acum ca, oamenii de știință de calculator, suntem de fapt, numărâ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 numărați de la 0 deoarece [0] va fi primul caracter într-un șir, [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, asa ca șir1, si acum am alerga șir1 în fereastra terminalul meu. Se așteaptă de intrare, așa că am de gând să tastați în David, Enter, iar acum se imprimă David totul pe diferite linii, deoarece Notă ceea ce fac. Sunt imprimarea unui caracter la un moment dat. Nu vom intra în detalii astăzi pe asta, dar am eliminat un moment în urmă acest cec aici. Se pare că, dacă utilizatorul este obraznic,, 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 un șir, la toate, sau daca esti rău intenționat, ați putea încerca să lipiți într valoare de un gigabyte de un eseu pentru a umple acest șir, și dacă computerul rămâne fără memorie, se dovedește că vom primi înapoi această valoare specială numită NULL. Deci, pentru moment, știu doar că există această valoare specială numită NULL care 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ă. Ce este diferit la bucla pentru acest timp? Mă pot întoarce la exemplul anterior. Deci, asta e versiunea 2, aceasta este versiunea 1. 1, 2. 1, 2. Apel strlen este locul unde? Este scris în prima parte a buclei pentru. Orice gânduri ca de ce fac asta? Da. [Elev] Deci nu suna funcția de fiecare dată singur. [Malan] Deci, nu ne numim funcția de fiecare dată singur. Exact. Recall pentru bucle de la faptul că ei sunt super-simplu odată ce fel de înțeles că aceasta este initializare, starea, si actualizare. 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? [Elev] Esti de asteptare strlen. [Malan] Esti de asteptare strlen din nou și din nou și din nou. Dar, odată ce l-am scris în David, lungimea șir care este de 5, și nu se va schimba la fiecare iterație a buclei deoarece șirul este încă D-o-v-i-d. Deci, aceasta este o aluzie la ceea ce va deveni o idee în ce mai important Cunoscut și drept o decizie de proiectare în cazul în care pur și simplu nu fac calculatorul face munca inutilă. Doar ca o previzualizare a pset2, pset2 în ediția standard este de gând să vă provoc să pună în aplicare de fapt, un numar de cifruri, un numar de algoritmi de criptare, astfel încât să puteți atât cripta și decripta mesaje secrete de mult, cum ar fi Ralphie de acolo decodat. În ediția de hacker pset2, vom merge un pic mai departe. Mergem să dea un fișier dintr-un sistem informatic actual care conține o grămadă de nume de utilizator si parole criptate reale, și provocare pentru ediția hacker va fi de a sparge aceste parole și dau seama ce criptografia sau ce secrete a fost folosit pentru a genera de fapt, aceste parole. Și vom face acest lucru prin utilizarea o caracteristică nouă de aici C că am să-ți dau doar un demo de cunoscut sub numele de argumente de linie de comandă. Se pare că, așa 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ă numele programului pe linia de comandă dvs. și argv este 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 este ceva de genul asta. Dacă am face argv1, care este un exemplu ne vom întoarce la luni, și rulați-l, observa că acesta 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 cuvintele pe care utilizatorul a tastat la prompt este de a schimba principal pornind de la acest week-end int main (void) la int main (argc, argv) și, astfel, se vor naste argumente de linie 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 asta 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 acest lucru pe ecran, iar noi va vom vedea pe luni. [CS50.TV]