[Powered by Google Translate] [Săptămâna 3] [David J. Malan - Universitatea Harvard] [Acest lucru este CS50. - CS50.TV] Lasă-mă să ne orienteze în direcția de unde am rămas data trecută, care a fost începe să se gândească un pic mai mult decât despre sintaxa și încercând să se gândească un pic mai puțin despre toate amanuntele care ia un pic de timp să se aclimatizeze la astfel până în prezent în ceea ce privește punct și virgulă și paranteze și acolade, pentru a începe să luați lucrurile un pic la un nivel conceptual superior astfel încât problemele pe care le începem acum rezolvarea in urmatoarele cateva saptamani sunt de gând să se implice mult mai mult o problemă de nivel superior conceptuale și un pic mai puțin în sintactic ca te uda picioarele tale și mâinile murdare cu unele dintre sintaxa din aceste ultimele saptamani. Deci, reamintim că săptămâna trecută am introdus aceasta notiune a unei matrice. Și o serie în limba engleză poate fi descrisă ca ce? >> [Elevului răspunsul neauzit] Ne pare rău? O colectie de? >> [Elevului răspunsul neauzit] >> Bine, bine. O colecție de obiecte. Deci, am văzut tablouri din Scratch. Dacă sa întâmplat să utilizați pentru PSET 0 una din listele răzuibile că puteți trage lucruri cum ar fi portocale și banane în, un inventar de soiuri, asta e un fel de ceea ce este o matrice. Și apoi mai tehnic, în contextul unui calculator real, o matrice este pur și simplu o bucată de memorie contiguă. Cu alte cuvinte, aveți un octet, apoi un alt octet, octet apoi altul, apoi altul octet, și dacă ar fi să atragă acele octeți într-o imagine, acestea ar trebui să revină la spate în spate în spate. Asta e ceea ce înțelegem prin contiguu. Deci e numărul 1 octet, apoi 2, apoi 3. Aceasta nu înseamnă aici, aici, aici, aici. O matrice este o bucată contiguă de 0 sau mai multe octeți. Deci, ce sunt ele utile pentru? Amintesc am avut acest fel de exemplu artificială de clase de test Oameni de depozitare într-un program de pentru a calcula media tau Quiz pentru un curs, și amintesc că am putea începe să scrie că programul de declarare a unei variabile quiz1. Apoi ne-am putea avea un alt variabilă numită quiz2. Dar, apoi, dacă ar exista 3 teste în această clasă, quiz4. Sau în cazul în care a existat un test săptămânal, ar fi quiz5, quiz6, quiz7. Deci, v-ați putea avea toate aceste variabile declarate în interiorul principal sau în altă parte în program, și problema cu această abordare, ușor, deși este de a copia și lipi doar, este pur si simplu foarte repede devine greoaie. Doamne ferește de fapt are 30 sau 50 de chestionare chestionare. Dacă e ca un test de liceu pop stil de zi cu zi, atunci ai avea doar o listă lungă de ridicol variabilelor declarate, și aceasta doar foarte repede scapă de sub control. E urât, e greu să se mențină, e mult mai ușor să facă o greșeală de scriere daca ai tastat greșit 1 numar undeva în programul tău. Deci, am introdus noțiunea de matrice în loc. Și amintesc că am implementat acest program de a face ceva de genul asta. Lasă-mă să intru în de astăzi Sursa 3 luni directorul și să se deschidă matrice, pe care am văzut ultima oară. Și chiar dacă au existat o serie de noi trucuri C aici, printre ei noțiunea de o constantă, amintesc că am declarat pluteste multiple în esență, prin folosirea acestui sintaxă: float, apoi numele variabilei, apoi am folosit paranteze patrate cu adevărat pentru prima dată, și ceea ce am făcut în interiorul acestor paranteze patrate a fost pus efectiv un număr. Dar, în loc de a pune un număr, am pus acest cuvânt capitalizat, Teste. Și ce a fost motivația pentru a pune un cuvânt capitalizată ca Teste și apoi cu ajutorul liniei 17 truc aici pentru a da de fapt, că un număr? Care a fost motivația acolo? Da. [Răspuns studentul nu pot fi auzite] >> Exact. Dacă vrem să schimbăm această valoare 2, trebuie doar să-l schimbați în locul 1 pentru că ia în considerare - Nu-mi amintesc nici măcar ce acest program a făcut exact, dar dacă degresat doar te văd Teste, Teste. Tu vezi teste, aici jos mai multe chestionare. Deci, dacă nu am avea această constantă, această utilizare a defini ascuțite, ne-am fi tastat 2, apoi 2, apoi 2, apoi 2, ceea ce este bine. Ar fi la fel de corect. Dar să presupunem că anul viitor avem 3 teste în CS50. Așa că trebuie să mă duc și să actualizeze codul, am să-l recompilați, dar problema este dacă fac vreo prostie, ca și cum aș trece cu vederea o mențiune din 2 și uitați să conectați 3, întregul program ar putea foarte bine rupe. Deci, suntem doar cere pentru probleme. Deci, noțiunea de constantă este vorba de factoring din unele bucată de date, indiferent dacă este un șir de caractere sau un caracter sau un flotor sau orice altceva, și declarând că locul 1, astfel încât să puteți mai ușor schimba în viitor. Și este, de asemenea,, sincer, un pic mai ușor de citit pentru că dacă tocmai ați gândi la asta acum, E teste, sau am putea redenumi chiar ceva de genul NUMBER_OF_QUIZZES sau mai mult explicită ceva. Codul de doar devine un pic mai evident ca la ceea ce face, și vă întreb un pic mai puțin ceea ce s-ar putea întâmpla numărul 2 să însemne. Deci, constanta nu a avut nimic de a face cu matrice fundamental. Matrice a fost introdusă prin aceste paranteze patrate. Deci, observăm că, în linia 23 ne întrebăm de utilizator, "Care au fost rezultatele tale test?" Apoi vom avea doar această buclă, care solicită aparent ghidul pentru clasele lor. Cum? Se iterează 0 - 2. Și eu spun 2, deoarece Teste în toate capacele este în prezent 2. Deci, iterează de la 0 până la 2 și apoi se imprimă Quiz din # ceva de ceva, si apoi foloseste GetFloat pentru a obține o valoare de utilizare. Deci observați acest lucru este singura piesă nouă de altă sintaxă de miercurea trecută. Dacă doriți să stocați ceva într-o locație special în această matrice, să utilizați din nou paranteze pătrate. Deci, există un pic de dihotomie aici. Prima dată când utilizați parantezele pătrate ai să-l utilizați pentru a specifica cât de mare vrei să fie matrice. Dar acest context, următoarea aici, unde vom angaja din nou aceste paranteze pătrate înseamnă că în cazul în care, în matrice în care vrei să pui o anumita valoare? Și distincția aici se poate deduce din context. Observați aici avem un tip de date, atunci avem numele unei variabile, apoi ne-am aparat dentar noastre pătrați, cu un număr de interior, punct și virgulă. Asta e tot. Așa că e o declarație. E doar ca și cum am fi făcut ceva ca float grade1; float grade2; dar, din nou, acest lucru foarte repede revine în copie prea mult, pastă, astfel încât în ​​loc ne-am simplificat-l ca atare, ceea ce înseamnă de acum înainte avem un grad care poate fi stocat la consola 0, avem un alt grad care pot fi depozitate la suportul 1, dar ce se întâmplă dacă am nating și, de exemplu, bucla mea merge atât de departe - de exemplu, am face asta mai mică sau egală cu, care amintesc a fost sursa de bug-uri anterioare - ceea ce înseamnă efectiv că pe unele repetare accidentale treime din această buclă Eu folosesc suportul 2. Efectiv, ceea ce s-ar putea întâmpla aici? Ne pare rău? [Elev] O să fie înlocuit. Este >> va fi înlocuit? Ce-ar fi înlocuit? Acest literal spune înlocui ceea ce este în locația 2 cu valoarea de returnare a GetFloat. Dar problema este cât de mare este matrice în acest moment în povestea? [Imperceptibil elev de răspuns] >> matrice este în continuare doar de marimea 2 deoarece matrice, ca orice variabilă, a fost declarată în primul rând, înainte de a l-am folosit, si am specificat aici, din cauza acestei constante pe care am 2 clase pe care am de gând să afișezi. Dar tine minte, oamenii de stiinta de calculator începe numărarea de la 0. Deci, prima locatie din care categorie de matrice este 0. Următoarea locație este 1. Acest lucru este vreodată atât de ușor prea departe de partea. Deci, cu alte cuvinte, în cazul în care am avut de fapt acest vector - și lasă-mă să văd cât de bine cooperează asta aici, pentru noi - dacă am o matrice care pur și simplu l-am întocmit, după cum urmează și am alocat spatiu pentru 2 elemente, s-ar putea trage aceasta ca aceasta în amintirea în cazul în care aceasta panza alba este de mare. E doar RAM am în calculatorul meu, un concert de RAM, 2 gig-uri de memorie RAM, indiferent de, dar aceste 2 cutii acum reprezintă în mod individual un flotor, 32 de biți. Deci, dacă am pus 1 numar aici ca 1.0, atunci am pus un alt număr de aici ca 3.2 dar apoi m-am fac suportul 2, asta e ca pune ceva aici. Și, după cum sugerează imaginea, nu este nimic acolo. E un fel de țară a nimănui, pentru că nu am cerut sistemul de operare să-mi dea acest test al treilea. Dacă am vrut ca test al treilea rând, aș fi avut chibzuire să solicite sistemul de operare pentru aceasta prin a declara QUIZ-a nu fi 2 dar pentru a egala în schimb 3. Deci, cu alte cuvinte, imaginea pe care ne eficient aibă la îndemână pare ca asta aici. Acest lucru din nou, este țara nimănui. Noi nu încercăm mai bine scris valorile aici. Dar, din nou, deoarece oamenii de stiinta de calculator numerotate de la 0, atunci când vorbim despre această locație în matrice, care ar trebui sa fie locatia 0, aceasta se presupune a fi locația 1, iar acest lucru nu există nici pentru că am cerut doar un sistem de operare pentru 2 astfel de locuri. Deci, cei dintre voi cu experienta in programare prealabilă din alte limbi ar putea să știu că acest lucru nu este întotdeauna cazul cu tablouri sau alte lucruri numite vectori. Mai degrabă, puteți să vă păstrați doar să adăugăm și adăugarea și adăugarea de lucruri de matrice, care, sincer, am avut că abilitatea în Scratch și totuși se pare că am dat-o aici deoarece cu C sunteți de programare mult mai explicit. E doar tu și calculatorul chiar acum, iar calculatorul este doar de gând să facă ceea ce se spune să facă. Deci, dacă vă spun doar să vă dau 2 flotoare cu titlu de linia 22 aici, asta e tot ce ai de gând să mă întorc de la sistemul de operare: spațiu pentru 2. Deci, din ce în ce sunt programele vor fi ocazional cărucior cu privire la matrice. Acesta este doar un fel de natura fiarei care toți dintre noi sunt supus greșelii, și la un moment dat va indexa, foarte probabil, dincolo de limita de matrice dumneavoastră. Si asta e doar un mod fantezist de a spune te-ai dus în ceva suport și ceva a fost prea mare a unui număr. Te-ai dus dincolo de limitele matrice dumneavoastră. Dar acum este cu susul în acest sens. Restul acestui program nu are nimic de a face cu fundamental matrice. E totul doar despre unele aritmetică simplă pentru medii de calcul. Deci avem aici, în această buclă pentru prima aici o sumă variabilă numită pe care le inițializează la 0. Apoi ne-am repeta de la 0 până la 2 din nou și vom adăuga la această variabilă însumarea clasa-lea, atât de reglaj 0, apoi suport 1. Și atunci, ca v-ar face în școala primară a calcula media, vom lua pur și simplu că suma intre, împărțiți-l la numărul total de chestionare, și apoi pentru o bună măsură numim o functie numita aici rundă. Acum, ca o paranteză, ceea ce este treaba cu acest int paranteză pe linia 34? S-ar putea au venit deja în secțiune, nu au vorbit deloc despre asta în mod oficial aici, dar ceea ce este acest int în Parens probabil faci? >> [Elevului răspunsul neauzit] Da, aceasta se referă la turnare sau typecasting, ceea ce înseamnă a lua un tip de date și conversia la altul. Nu puteți face acest lucru cu toate tipurile de date, deoarece, uneori, că ar fi un pic ciudat. Dar în acest caz, în cazul în care valoarea întoarcerea rundă este un flotor deoarece, la urma urmei, eu iau un flotor și împărțirea de către un număr de ca 2, Mă duc să mă întorc un flotor. Dar oamenii clasa de școală nu prea place să știe că media lor a fost de 93.4 pentru că ei vor da seama că au fost vreodată atât de aproape de acel punct rotunjire 95. Așa că vrem să utilizați în loc int a rotunji toată lumea la cel mai apropiat int, care în acest caz va fi 94 cu nici un punct după el. Deci, asta e doar un mic truc matematic. Și vom reveni la această noțiune de turnare, deoarece aceasta va avea implicații, în cazul în care nu ați descoperit deja, pentru problema set 2. Deci, o matrice, atunci, vă puteți gândi la - se va ma face sa zambesc toata ziua. Se pare ca acest lucru dacă desena o imagine a acesteia, dar cheia este faptul că dimensiunea este, de asemenea, selectate de tine atunci când îl cere de la sistemul de operare. Orice întrebări, apoi pe tablouri? Da. [Întrebare elev neauzit] Ah, bună întrebare. Întrebarea este ce se întâmplă cu 0 nul în matrice? Ea nu există în acest context. Care există numai în contextul siruri de caractere, pe care suntem pe cale să vină la doar o clipă. Dar pentru o matrice, ca în acest caz, tot ceea ce primiti este ceea ce cere sistemul de operare pentru. Și, ca o paranteză, ca nu cumva aceasta să fie neclară, Eu tot spun să vă întreb sistemul de operare, adresați-vă sistemul de operare. Un sistem de operare, după cum probabil știți, este Mac OS, Windows, Linux. Când sunteți de asteptare funcții, cum ar fi GetFloat sau se declară variabile, cum ar fi note, la sfârșitul zilei vă sunt în mod eficient cere pe altcineva pentru a vă oferi că memoria pentru că aspiră ca programatori nu au nici o idee cum să obțineți de fapt, accesul fizic la memorie. Dar cineva face: sistem de operare. Deci, în afară de noi se prezintă cu icoane frumoase și meniuri și foldere și cum ar fi pe care le vedeți pe desktop, dacă un Mac sau PC-ul, sisteme de operare, de asemenea, face chestii nivelul scăzut lumesc, chestii foarte tehnică de gestionare GIGABYTE sau 2 GB de memorie pe care le au, gestionarea procesor care o ai, și așa mai departe. Așa că atunci când scrii cod, sunteți cu adevărat prindere in pentru a sistemului de operare în acest sens. Am de gând să aibă de a minimiza asta. Bine. Alte intrebari legate de tablouri? Nu? Bine. Deci, trecerea de la natural matrice este de fapt un subiect care e un pic familiar. Și ne-am uitat vreodată atât de scurt în acest moment ultima prea. Acesta a fost un exemplu șir de miercuri. Acest exemplu șir a fost un program destul de simplu, și am simplificat de fapt de un cuplu de linii în scopuri de astăzi. Tot ceea ce face, în linia 19 este de a lua un șir de utilizator, o stochează într-o variabilă numită uri. Apoi, în linia 22 este mai departe de imprimare se pare că șirul de 1 caracter pe fiecare rând. Dar cum se face acest lucru? Suntem de declarare a unei variabile i, setarea este egal cu 0, și acest lucru este din ce în ce vechi obicei acum. Nu am văzut acest lucru până miercuri, dar poți fel de deduc din numele său strlen returnează doar ceea ce atunci când e dat? Lungimea șirului. Deci, dacă am să-l dați un șir, citat-unquote DAVID, se va sperăm să se întoarcă la mine numărul 5, din cauza DAVID. Deci, asta e scopul său în viață este de a lua un șir de caractere, indiferent dacă greu codificate de tine sau, în acest caz, conectat într-o variabilă ca, ca argument, si da seama ce lungimea șir care este. Deci, aici, acum suntem împrumuta ceva de la notația exemplul testul anterior. Acest lucru nu are nimic de-a face cu flotoare, nu are nimic de-a face cu chestionare, dar se pare că minciună nevinovată ne-am spus de la săptămâna 1 este faptul că un șir nu există cu adevărat în C. Un șir la sfârșitul zilei este de fapt doar o matrice. Este o matrice de octeți, octet astfel, octet, octet, octet, care amintesc este la doar 8 biți, astfel bucată de memorie, segment de memorie, segment de memorie, segment de memorie. Și mijloacele prin care un șir este pus în aplicare este de a pune primul caracter aici, apoi aici, apoi aici, apoi aici, spate în spate în spate în memoria calculatorului. Deci, dacă ai vrut să scrie un cuvânt ca HELLO, v-ar pune 1 caracter H, apoi E, apoi L atunci L, atunci O - 5 caractere în total - undeva în memoria RAM a computerului. Dar detaliile cheie aici este că au de gând să se întoarcă la spate în spate în spate, chiar lângă unul cu altul. Cand când spun e [i], ceea ce în limba engleză este asta mi-a dat? Ce nu s [i] reprezintă, în acest caz? Da. [Elev] i-lea caracter din șirul. Exact >>. Caracterul i-lea în șir. Acum, i este de gând să înceapă de la 0 ca pe meu pentru bucla aici, dar asta e bine pentru că totul începe numărătoarea de la 0. Deci, s [0] este de gând să reprezinte litera H într-un cuvânt cum ar fi HELLO, s [1] este de gând să reprezinte o scrisoare ca e intr-un cuvant ca HELLO, și așa mai departe. Și ceea ce am par să se descurce pe fiecare iterație a buclei acest este stocarea temporar personajul-lea intr-o variabila numita C, care este doar un char, și apoi vom imprimarea c astfel încât, la sfârșitul zilei, ceea ce face acest program este următoarea. Dacă mă duc în directorul sursă și fac șir1 și am merge mai departe și a alerga șir1, si apoi am tastați un cuvânt ca HELLO, Enter, tot ce face este tipărarea acest personaj 1 la un moment dat. Deci, există o oportunitate pentru rafinament aici. Sunt un fel de a face mai mult de lucru, chiar dacă e mai clar, poate în acest fel, decât este necesar. Care linie de cod aici pot arunca departe, probabil, cu totul? Da. Linia 24. În linia 24 am de declarare a unei variabile c. Mă stocarea caracterul lea de s în ea, dar atunci eu sunt, folosind c aici. Deci, eu sunt, folosind C, deci mă simt ca și cum eu nu pot arunca doar linia 24 distanță. [Comentariu elev nu pot fi auzite] >> Exact. Deci, atunci când vine vorba de a vorbi despre proiectarea de programe, observați această simplificare ușoară a codului, care este la fel de ușor de citit, dar seama că e este doar o variabilă, tipul de date este o matrice, astfel încât s [i] este doar de gând să se întoarcă imediat la tine personajul-lea în șir. Și dacă doriți să-l imprimați, e în regulă. Trebuie doar să utilizați c%, deoarece nu ești imprimarea unui șir, te imprimarea unui caracter într-un șir, iar acest lucru are un efect prea de imprimare caracter lea. Si amintesc într-adevăr singura diferență de săptămâna trecută, cu ajutorul printf este faptul că în timp ce în ultimele săptămâni ne-ar face ceva super-simplu ca substituent% s, apoi numele unui șir aici, acum suntem într-un pic de scufundări adânc sub capota și spune, nu se imprimă șirul; imprima un singur caracter acestea. Astfel încât să putem face ceva un pic diferit aici, pentru că nu există un alt - nu bug pentru că acest program este drept, dar eu fac ceva stupid pe care am menționat pe scurt miercuri. Dar gândire înapoi, cum ar putea acest design program fi îmbunătățită și mai mult? Da. [Răspuns studentul nu pot fi auzite] >> Oh, bine. Deci, reamintim că am introdus o a doua variabilă numită n ultima dată, care pare a fi noi înșine în contradicție, deoarece obiectivul meu o secundă în urmă a fost doar pentru a arunca o variabilă ca inutilă, dar reamintim că miercuri am făcut de fapt acest lucru. Am schimbat pentru buclă de a avea de fapt o virgulă aici, atunci n = strlen, si apoi aici am facut i > [Elevului răspunsul neauzit] >> Exact. Nu mă amintind strlen din nou și din nou și din nou, deoarece amintesc cum pentru lucrări bucla. Chiar dacă ei încep să devin mai complicate cu aspect, Reamintim că lucrul înainte de virgulă prima de inițializare, care se întâmplă o singură dată. Condiție, însă, este în mijloc, iar acest lucru se verifică de fiecare dată când trec prin bucla. Deci e un fel de stupid să se cere calculatorul aceeași întrebare din nou și din nou - Care este durata de salut? Care este durata de salut? Care este lungimea Alo? - pentru că așa cum vom vedea astăzi și miercuri, aceasta este cu siguranta va avea nevoie de timp, și nu e o utilizare foarte bună de timp, deoarece pentru a descoperi lungimea unui șir de fapt, nevoie de un pic de efort. Nu e instantanee, așa cum este în unele limbi. Deci, prin schimbarea asta n, prețul Plătesc este ceea ce? Vedem un compromis aici. Eu pot economisi timp prin faptul că nu cere aceeași întrebare naibii din nou și din nou, dar o să mă coste ceva, care este ceea ce? [Elev] Ai pierdut o anumită cantitate de memorie. Exact >>. O să mă coste ceva de memorie. Deci, în acest caz, ar costa-mi ce? Alte 32 de biți, deoarece n este doar o int, dupa cum implica int cuvântul aici. Dar este în regulă? Sincer, asta e, probabil în regulă pentru că, dacă te gândești la asta, mai șirul este, mai mult timp am de gând să-și piardă deoarece strlen urmeaza sa se sunat din nou și din nou și din nou pentru fiecare iterație a buclei. Și în aceste zile, Mac-ul meu are 2 giga de RAM, aceste zile 4 gig-uri de memorie RAM, uneori. Cred că-mi pot permite 4 din aceste octeți pentru a accelera de fapt lucrurile. Dar acest lucru va fi un compromis și o temă cu adevărat în programare și în informatică de a nu obține nimic pe gratis. Dacă doriți pentru a îmbunătăți ceva aici, va trebui să plătească pentru el în altă parte într-un fel. Spațiu în funcție de timp, în acest caz. Deci, acest lucru a fost tot dus spre ceva criptic de acest fel, care, după cum probabil ați dat seama până acum, de fapt spune? [Imperceptibil elev de răspuns] >> Da, așa e, Asigurați-vă că pentru a bea Ovaltine dvs., de fapt, folosind un algoritm numit ROT13, ROT 1-3, ceea ce înseamnă doar rotesc toate literele 13 locuri, ceea ce înseamnă să ia o și apoi adăugați-l la 13 și du-te dot, dot, dot tot drumul la scrisoarea al 13-lea la distanță, face același lucru pentru B și C și pentru pentru D și așa mai departe. Și așa, dacă vom converti de fapt asta aici folosind un transfer de 13 de locuri, ne vom întoarce la ceea ce a avut putin Ralphie, care a fost, Asigurați-vă că pentru a bea Ovaltine dumneavoastră. Dar acum pentru problema set 2, în ediția de iarnă, cel puțin, trebuie să fel de face acest lucru singuri enciphering, și trebuie să ia cumva în această intrare ca și cripta sau decripta. Deci, care dintre aceste fel de fundamentale ne conduce la această oportunitate? Să aruncăm o privire la acest exemplu treia aici. În primul rând, se numește ASCII. Ce se referă ASCII înapoi la? Codul american standard pentru schimbul de informații, care este o modalitate foarte lung de a spune ce? Ce este ASCII? [Răspuns studentul nu pot fi auzite] >> Ce e asta? >> [Elev] O hartă caracter. Un personaj >> hartă. Se mapează doar numere la litere, deoarece lumea are standardizat ce numere vor reprezenta ceea ce scrisori, astfel încât fiecare dintre noi poate utiliza calculatoare și toate programele noastre sunt compatibile doar atunci când vine vorba de imprimarea lucruri pe ecran. Deci, amintim că 65 se întâmplă să reprezinte A, 97 se întâmplă pentru a reprezenta litere mici o. Și astfel, acest program simplu aici ASCII este să profite de acest fapt - că lumea știe că capitalul A este de 65 - și este doar tipărirea de cartografiere. Deci, înainte de a ne scufunda in acest cod, lasă-mă să deschid în schimb o fereastră terminal. Lasă-mă să mergeți mai departe și să facă ASCII, iar apoi să rulați acest lucru doar pentru a strica ieșire. Și o face doar acest lucru: o diagramă într-adevăr mare, care tocmai mi-a spus toate codurile diferitelor pentru toate literele diferite. Deci, un program de super-simplu, dar nu am avut la codul greu acele 52 de linii de producție: 26 litere mari, 26 mici. În schimb, am făcut acest lucru în mod programatic, cu o pereche de bucle. Observați ceea ce am făcut aici. Am reiterat din i este de 65 până la 65 la + 26, deoarece am vrut să imprime 26 de litere în alfabetul englez, i + + pe fiecare iterație, iar acum observați acest lucru din nou. E reapariția typecasting prietenul nostru prin conversia 1 tip de date la altul pentru că ceea ce vreau să fac în acest program special? Vreau să conta numeric pentru că modul în care am crescut numărare - 65, 66, 67, și așa mai departe - dar nu vreau să imprimați doar numere. Vreau să imprimați urmată de numărul. Vreau să imprimați A: număr, B: numărul, dar pot face acest lucru cu exact aceeași variabilă. Asa ca am imprima c% ca un substituent pentru un caracter, D% ca un substituent pentru o cifră sau un număr. Atunci ce am conectați în substituenți pentru cele 2? Am conectați mai întâi în echivalent caracterul I, iar apoi am imprima i în sine. Deci observați acest prea pur și simplu funcționează. Așa cum pot arunca dintr-un float la un int în scopul de a trece de la un număr real la un întreg, aici pot merge de la o int la un char, care este un pic ciudat - nu destul pe harta lumii reale -, dar în computere un char este doar un număr de sub capota, așa că ești vreodată atât de explicită aici pentru a calculatorului, spunând, printf, imprimați să nu i afară la fel de 65 de ani, imprimați-l ca echivalentul său numeric. Și se pare că am punct de vedere tehnic, nu au nevoie de nici asta. Ceea ce am făcut a fost un moment în urmă este în mod explicit de turnare prin specificarea ce tip de date vreau să merg la și la. Dar observați că am deja c% substituent și acest alt substituent% c aici. Chiar dacă acest lucru nu este int, calculatorul își dă seama că un char, e doar o int sub capota. Deci, dacă am recompilați de fapt acest lucru și rulați din nou programul de ASCII, observați încă funcționează doar pentru că își dă seama că computerul nu există această corespondență. Acum, e mai important să faci turnare explicită în lumea de flotoare la Ints pentru că nu faci de fapt, o decizie calculată: arunca totul după punctul zecimal. Aici nu e nimic pentru a arunca departe, deoarece un personaj este doar un număr, și un șir este doar o matrice de caractere. Deci, atunci când vine vorba de timp pentru punerea în aplicare unele criptare sau decriptare, cum se face că putem traduce de fapt, ceva de genul asta nonsens sa, Asigurați-vă că pentru a bea Ovaltine dvs.? Ce se întâmplă dacă știm acum - să ia ca ipoteza - care cheia, numărul care suntem rotație toate aceste scrisori către, este numarul 13? Așa că am trecut de la litera B tot drumul la O la începutul teză, Asigurați-vă că pentru a bea Ovaltine dumneavoastră, pentru că dacă fac B și apoi mă duc C, D, E, F, G, H, I, J, K, L, M, N, O, de aceea criptarea litera B devine O pentru ca am adaugat doar 13 la acesta. Deci, dacă vreau să decripta acest lucru, am în esență, trebuie să ia O, apoi scade 13 din el. Sau, sincer, pentru că nu e 26 de litere din alfabet, acest lucru este minunat simetrică, putem, de asemenea, adăuga doar 13, iar noi vom reveni la scrisoarea B. Dar cum te duci despre punerea în aplicare a așa ceva în Caesar sau manipularea într-adevăr siruri de caractere, în general? Dacă litera B este ceea ce număr? Care este litera B? Deci e 66, nu? Deci, dacă litera A este de 65 și litera B este 66, deci 66, tot ce trebuie să faceți este să adăugați 13 la ea, iar acest lucru îmi dă 79. Și dacă mergem la foaia noastră ieftin mica, într-adevăr, 79 hărțile pe O. Dar există un pic de un caz colț aici. Ce este, să spunem, litera Z? Dacă facem 66 + 25 pentru a obține toate mod de a sfârșitul alfabetului, suntem la 91. 91 + 13 îmi dă 104, și ghici ce? 104 nu este egal cu o majusculă. Să ne întoarcem la o foaie de ieftin pic aici. Dacă aș rulați din nou acest program în aparat, observați că 104, în cazul în care mă întorc la fereastră terminal, 104 este, aparent h. litere mici. Deci, avem nevoie de un truc cheia aici, în scopul de a se asigura că, atunci când vom începe de la Z și vom adăuga la 13 la acesta nu dorim să păstrați doar forjare înainte la numere mai mari și mai mare. Ce vrem cu adevărat să fac? Vrei să-și încheie în jurul valorii de. Deci, se dovedește, după cum ați văzut, probabil, în secțiunea acum sau în problema spec. set de sine a dat seama că nu există acest alt operator din C care, de asemenea este un semn la sută, dar întrucât am folosit aici pentru a specifica% un substituent, știu că, în special pentru set de probleme 2, există, de asemenea, ceva de genul asta: int x = y% z. Permiteți-mi să prezint doar acest lucru ca pe o formă foarte generic de acest lucru. La sută înseamnă ceea ce într-un limbaj de programare? >> [Elev] Modulo. Modulo, care este un mod fantezist de a spune restul. Chiar dacă există o distincție ușoară cu definiția acolo, aceasta înseamnă diviza y cu z, dar nu se mai întorc rezultatul acestei diviziuni; în schimb, întoarce restul. Deci, în cazul în care y este, de fapt 3 și z este de fapt 2, 3 împărțit la 2 este 1, cu un rest de 1, Deci, ce face de fapt, x egal în acest scenariu? 1. Aceasta este o astfel de simplu, low-level idee. Este nevoie de un pic de timp pentru a obține mintea ta înfășurat în jurul valorii de ea pentru că a fost, probabil, un timp de când a trebuit chiar sa-i pese resturilor și de a folosi de fapt le pentru ceva scop, dar, în acest caz, simplul fapt că puteți trece de la un număr mare ca 3 la un număr relativ mic ca 2 și apoi înfășurați în jurul valorii de eficient prin utilizarea restul la o valoare mai mică ca 1 se întâmplă să fie un truc de neprețuit pe care le poate folosi atat pentru ceva de genul asta si Cezar Vigenere alt lucru în problema set 2, dar acest lucru va fi un truc recurente de-a lungul semestrului. Această idee simplă, simplă de a lua doar restul, în general, este de gând să ne permită să-și încheie în jurul valorii de. Și, după cum vom începe să joci mai mult, cu tablouri, așa cum am începe să joci mai mult cu memoria singura, acest lucru se întâmplă pentru a deveni mai mult și mai mult de un truc puternic. Deci orice întrebări apoi pe ASCII sau reprezentarea de siruri de caractere ca matrice? Și ne vom ocupa în continuare un notch. Da. [Întrebare elev nu pot fi auzite] >> Bună întrebare. Ce înseamnă atunci când o variabilă are un asterisc în fața lui? Permiteți-mi să amâne răspunde că, în orice detaliu, dar care se referă la un subiect cunoscut ca un pointer. Indicii au de a face cu memorie, iar noi suntem de fapt, astăzi luând primul pas spre această discuție, dar pentru acum, permiteți-mi să pretind că steaua nu există și vom continua asteptare șiruri siruri de caractere în loc de a folosi char *, care le-ați văzut, probabil, înainte și voi pune pe ecran în doar o clipă ca un teaser. Deci, ne vom întoarce la faptul că, în mod detaliat mai mult decat multi dintre voi va dori, probabil,. În cele din urmă, nu azi. Da. [Întrebare elev neauzit] În ce context ai să furnizeze semnul pentru un caracter? >> [Elev] Da. Deci în mod implicit, atunci când nu pune un +, la doar numerele pozitive se presupune. Deci, dacă scrieți doar numărul 1, e un pozitiv 1. Dacă chiar vrei să specificați o valoare de negare, ai literalmente trebuie să faci -1 pe tastatură. Dar acest lucru probabil că nu este întrebarea dvs.. >> [Elevului răspunsul neauzit] Bună întrebare. Bine. Deci, acest lucru are de a face, am aduna, cu un fel de bug-ai fugit în pentru că ai fost un întreg conversia la un caracter, dar cumva negativitate-au implicat, și astfel caracterul tocmai a ieșit munged cumva. Deci, pentru moment, permiteți-mi să simplifica un pic până când ne vom întoarce la acest tip de subiect. Pentru moment, cred că de lucruri în acest fel - și aceasta este o simplificare. Dar în lumea de un număr întreg, aveți câți biți la dispozitia dumneavoastra? Ai 32 de biți. Și până în prezent, am vorbit despre numărul total de numere intregi puteți reprezenta, prin urmare, este de aproximativ 4 miliarde de euro în total, deoarece aveți 32 de biți, asa ca asta e 2 la 32, așa că e de aproximativ 4 miliarde de euro. Dar am vazut o săptămână sau 2 în urmă că nu aveți cu adevărat o serie de numere de la 0 la până la 4 miliarde de euro. Gama de schimb trece de la aproximativ 2 miliarde negativ pozitivă 2 miliarde de euro. Dar acest lucru ridică întrebarea, atunci, cum Reprezentati noțiunea de negativ 2 miliarde să nu mai vorbim negativ 1? Pentru moment, putem simplifica și spun doar că am de gând să utilizeze bit din stânga din cele 32 de biți, și, dacă este un 1 este un număr negativ, și dacă e un 0 este un număr pozitiv. Problema cu această reprezentare simplificată a numere negative este că, dacă ați fost în mod deliberat a fi inteligent și de încercarea de a converti de la un personaj la un număr sau invers, nu există nici un astfel de lucru ca un personaj negativ. În lumea de ASCII, care folosește numai 8 biți, toate cele 8 din cele materiei biți, și biți stânga nu are nimic de-a face cu negativitate. Și doar pentru a fi clar, când spun biți stînga, amintesc că, atunci când am făcut noastre de biți legate de exemple în prima săptămână amintesc că am atras lucruri de genul 1001101, ceva de genul asta. Când spun biți stânga, eu doar spun literalmente 1 pe care le scrie tot drumul pe la stânga. Deci, în lumea de caractere nu exista notiunea de negativitate, astfel încât bit din stânga are de fapt ceva de-a face cu ASCII, nimic de-a face cu negativitate. Deci, se pare ca - si din context, este greu să răspundă exact - dar într-un fel, codul a fost confuz că pic din stânga ca reprezentând o valoare negativă atunci când într-adevăr a fost o parte a caracterului în cauză. Și din nou, eu sunt a simplifica deoarece computerele face de fapt, ceva un pic crescator decât schimbând doar faptul că pic stânga la un 1 pentru un semn negativ față de un 0. Ei în schimb, dacă ești curios în Google, de obicei folosesc ceva numit complement lui 2, care este un pic mai sofisticat de o abordare dar ideea este în cele din urmă aceeași. Deci, pe scurt, a avut de a face cu faptul că ai fost un număr de masaj la un caracter sau invers, dar codul dvs. nu a fost conștientă de faptul că 1 din aceste biți a avut o semnificație în lume numerică. Asta nu e cazul, în lume caracter. Dar se pare ca ai reparat, caz în care Moot acum. Alte întrebări. Bine. Deci pana acum, toate programele pe care le-am scris au luat de intrare poate de utilizator sub formă de funcții cum ar fi GetInt, getString, sau dacă ați fost citit înainte, în diferite cărți sau referințe on-line, voi înșivă ar fi putut folosi functii cum ar fi scanf care, sincer, pe care le folosim în bibliotecă CS50. Dar, într-o săptămână sau 2, vă vom arăta cum de fapt, vă biblioteca CS50 este pus în aplicare astfel încât să putem lua aceste roți de formare oprit cu totul. Dar se pare că există o altă modalitate de a obține informații de la un utilizator. De fapt, ne-am fost folosind argumente în linia de comandă pentru câteva săptămâni acum. De fiecare dată când ne-am alerga zăngănit sau am să rulați make, nu am tastat doar zăngănit, Enter, nu am tastat face, Enter. Ce am de obicei, scrise după cuvântul zăngănit de la noi ferestre de terminal prompte? [Elev] nume de fișier. >> Nume de fișier, nu? Hello.c sau mario.c sau orice nume de fișier relevant este. Și în acest sens, ceea ce ai făcut cu adevărat este ce ați influențat comportamentul zăngănit deoarece cu siguranță, oamenii care au scris zăngănit nu a avut nici o idee pe care ai cam vechi a fost de gând să scrie un program numit ani mai târziu mario.c. Deci, ai avut de a influența într-un fel comportamentul acestui program, și că programul a avut zăngănit să fie scrise în așa fel încât să poată accepta introducerea de la tine prin adăugarea de cuvinte pe Anunță înainte de a hit-uri de utilizator Enter. Deci, se dovedește că de ceva timp am fost declararea aproape toate programele noastre pentru a începe așa - int main (void) - si apoi ne-am dus mai departe și a început să scrie codul nostru. Și am putea avea unele ascuțite include în partea de sus a fișierului, dar aproape toate programele noastre de pana acum au început cu această chiar dacă este posibil să fi văzut în secțiune, în cărți, referințe on-line că acest lucru nu are, de fapt, trebuie să fie anulate. O altă formă legitimă pentru ca aceasta să ia este int argc și argv apoi șirul []. Deci, acum ce este aceasta implică? Se pare că argc, ceea ce este o convenție umană - ai putea numi asta foo, dar ar fi doar o mult mai puțin clar pentru cititori - argc doar este un argument pentru funcția numit principal care reprezintă ceea ce? Ce înseamnă argc stea pentru cei familiarizați? [Răspuns studentul nu pot fi auzite] >> Da, numărul de argumente sau de numărul de argument. Este la fel de simplu ca asta. Câte argumente au fost transmise la acest program? Ce înseamnă asta? În cazul în care linia de comanda am alerga ceva de genul asta - zăngănit mario.c-- argc când am lovit Enter este de gând să ia pe o valoare a, oarecum confuz, 2. Deci, se dovedește că argc este numărul de argument, dar, din motive istorice, numele programului în sine este inclus în numărul. Deci, argc este 2, atunci când am scris zăngănit mario.c. Ce înseamnă argv conține? Mai întâi de toate, argv arata ca un șir, dar nu destul de deoarece, de miercurea trecută și toate mai mult astăzi, aceste paranteze pătrate denotă ce? Asta e un tablou. Nu e nici un număr în matrice, și că ar trebui să facă sens intuitiv pentru că oamenii care au scris ani în urmă zăngănit avut, cu siguranță nici o idee cât de mulți oameni cuvinte ca noi să tastați la prompt înainte de a lovi Enter. Deci, în acest caz, aici, ei au declarat ca funcția principală a lua o serie de argumente, 0 sau mai multe argumente. Ei nu știu în avans cât de multe sunt, deci nu este în mod deliberat nici în interiorul unora dintre aceste paranteze pătrate. Dar faptul că parantezele pătrate sunt acolo se spune calculatorul, aștepta la o matrice. Argv este doar notația prescurtată pentru vectorul argument. Un vector este un mod fantezist de a spune matrice, și matrice este un mod fantezist de a spune o listă sau colecție. Deci, aceasta înseamnă doar că, dacă scrii principal ca această în loc de ca modul în care ne-am făcut-o pentru ultimele două săptămâni, programul are acum puterea de a accepta argumentele liniei de comandă astfel încât să nu mai aveți pentru a scrie Mario și a lovit apoi Enter, apoi tastați într-un număr de cât de multe blocuri de mare vrei să fie piramida, apoi a lovit din nou Enter. Nu avem nevoie chiar de a utiliza mai getString sau GetInt sau GetFloat pentru care contează. Ne putem aștepta doar utilizatorul să tastați aceste cuvinte de la promptul de sine la fel ca autorii zăngănit decis că ar fi un program de foarte enervant în cazul în care pentru a compila codul tastat tu primul zăngănit, apăsați Enter, apoi ne-am spus de utilizator, vă rugăm să tastați numele fișierului pe care doriți să compilați, apoi am tastați în mario.c și apăsați Enter. Dar asta este exact ceea ce am făcut pentru utilizatorii noștri ultimele două săptămâni. Noi folosim getString și așteptăm până când programul se execută pentru a le solicita pentru intrare. Că nu mai are nevoie să fie cazul. Deci, în acest exemplu aici, acum avem șir argv, și acest lucru este de asemenea o simplificare, roți de formare, care va veni foarte curând off. Acest lucru este mult mai buna de a scrie această declarație alternativ de principal deoarece se pare că ceea ce ține de asteptare string are de fapt o stea, un asterisc, în definiția sa reală, dar aceasta doar pare complicat, e confuz la început, așa că am simplifica prin crearea doar un sinonim de felul în biblioteca CS50 că hărțile char * la acest șir de cuvânt mult mai user-friendly. Așa că hai să încercăm de fapt acest lucru, atunci. Lasă-mă să mergeți mai departe și să se deschidă gedit aici. Lasă-mă să mergeți mai departe și să deschidă argv de 1. Acest program afiseaza aparent argumentele, dar în termeni de engleză, de se uită la acest cod, ceea ce înseamnă acest fac mai precis? Dacă aș tip în a.out comanda foo bar, ceea ce se tipărit în fereastra mea alb-negru? A.out foo bar, Enter. Dă-i drumul. Da. >> [Elevului răspunsul neauzit] Bine. Deci a.out, noua linie, foo, noua linie, bar, noua linie. De ce este acest lucru? Putem confirma cu siguranță, în doar o clipă. Aceasta este un fel de linie de cod pufos.  Se imprimă doar o nouă linie doar pentru a face lucrurile mai frumos pe ecran. Aceasta este o buclă care este iterarea de la 0 la pana la argc, și acest lucru este incrementarea pe fiecare iterație + +. Deci, acest lucru este acum spune imprima un șir, așa cum se sugerează prin această% s. Argv [i] este destul de mult aceeași idee de la exemplul anterior. Am folosit pentru a apela variabila, acum se numește, în mod arbitrar, argv. Acest lucru înseamnă imprima argumentul-lea, care a fost introdus la linia de comandă, și apoi, după toată chestia asta se face, doar pentru o bună măsură tipări o altă linie nouă. Deci, haideți să vedem asta. Lasă-mă să deschid fereastra terminalului. Lasă-mă să compileze argv de 1, iar acum lasă-mă să ruleze argv de 1, Enter. Hmm. Bine. Să fugi foo bar. Interesant. Baz. Și dacă v-ați întrebat vreodată de ce tip I acest lucru, aceasta este doar o prostie, de asemenea, stiinta convenție calculator. Lumea are nevoie de multe ori doar substituenți verbale de cuvinte. Deci, dacă vrei să vorbim despre unele șir generic, oamenii de stiinta de calculator doar tind să spun foo atunci când au nevoie de un cuvânt aleator, atunci ei spun bar dacă au nevoie de un al doilea cuvânt aleator, atunci ei spun Baz, dacă au nevoie de un al treilea cuvânt, atunci ei spun qux dacă au nevoie de un cuvânt al patrulea, și apoi există o mare dezbatere on-line religioase cu privire la ceea ce vine după qux, astfel încât să puteți Google, care să dau seama ce alt cuvânt arbitrar ar trebui să fie. Dar acestea nu au nici un fel de sens, deși foo bar, dacă Google, care, ca nu s-au înțeles, care face parte din etimologia aici. Deci, tot acest este de a face, atunci se imprimă 1 din aceste siruri de caractere pe linie. Deci, dacă am loc, deși, a vrut pentru a obține un pic crescator, Presupun că nu am vrut să imprimați fiecare sir pe linie; Am vrut să imprimați fiecare personaj din fiecare sir pe linie. Cum aș putea să fac asta în loc? Ce am nevoie pentru a schimba despre acest program, dacă vreau să imprimați nu fiecare cuvânt dar vreau să imprimați fiecare literă cuvânt printr-o scrisoare prin scrisoarea, apoi scrisoarea următorul cuvânt printr-o scrisoare prin scrisoarea? Cum putem combina aceste idei până acum? Da. [Elev]% c. >> Regulă. Deci, avem nevoie de un loc de c%. Bine, pentru că nu vreau să imprimați siruri intregi, vreau să imprimați caractere. Ce altceva? [Răspuns studentul nu pot fi auzite] >> interesante. Deci, avem nevoie de un fel de a doua dimensiune aici, acum deoarece cred că din argv ca o matrice, dar este o matrice de siruri de caractere. Dar, ca de, ca, 15 minute în urmă, ceea ce e un șir? E un tablou de caractere. Deci într-adevăr, argv este un tablou de o serie de personaje, o serie de tablouri de caractere. Deci, se dovedește că putem folosi notatiile doar mai placuta pătrați. Deci, hai sa facem asta. În partea de sus a acestui bucla pe linia 19, am de gând să itera de la I până la argc, dar apoi am de gând să fac asta: pentru - Eu nu pot folosi acum. Am nevoie de o altă variabilă pentru că vreau să itera peste cuvintele dar apoi, de asemenea, de-a lungul litere din cuvintele așa că am avea un fel de o axă verticală și o axă orizontală, un fel de punct de vedere conceptual. Deci, j int devine 0, atunci vreau să fac j, atâta timp cât j este mai mică de - și voi curăța asta într-un pic. Cum pot itera peste literele dintr-un șir? Am făcut acest lucru acum un moment. Strlen de argv [i]. Bine. Și din nou, eu fac un pic de aici, ineficiența prin a nu crea n sau orice altceva, dar ne vom reveni la asta. Deci, acum, j + +. Acum trebuie să liniuță în continuare aici. Ce-mi doresc acum să imprimați pe fiecare iterație? [Răspuns studentul nu pot fi auzite] >> Deci [i] va da-mi cuvântul. [I] [j], ca un fel de matrice. Aceia dintre voi cu matematica-y medii, suntem un fel de indexare, chiar mai adanc in aceasta matrice sau această matrice de matrice, această structură 2-dimensionale. Deci, acum să vedem ce se întâmplă aici. Lasă-mă să deschid fereastra mea borna mai mare. Lasă-mă să rulați din nou face din argv de 1. Și am dat-on bară aici, care este o lecție bună pentru că am prea uitat să fac asta. Declarând implicit "strlen" C funcția de bibliotecă cu nesemnat de tip "- Nu știu nici măcar ce înseamnă asta restul, dar am văzut acest lucru înainte, implicit de declarare. Ori de câte ori vom vedea această eroare, ceea ce înseamnă acest lucru, de obicei,? [Răspuns studentul nu pot fi auzite] >> Am uitat-o ​​bibliotecă până sus. Dar stai un minut. De obicei, am dat-on bară pentru că am uitat biblioteca CS50, dar asta e acolo. De obicei, am dat-on bară pentru că am uitat de iarnă I / O. Și sincer, nu am nevoie de nici asta. Noi nu utilizați getString astăzi. Deci, ce sunt eu lipsesc? Există o altă bibliotecă că acum avem nevoie pentru a utiliza string.h ocazional numit, și acesta este doar încă o altă bibliotecă care are mai multe funcții care nu sunt în standard I / O. Așa că hai să ne întoarcem la fereastra mea terminalul mare. Bine. Acum, la naiba, cred că m-am înșelat. Am fost folosind biblioteca CS50. Astfel încât să putem rezolva această problemă în oricare dintre cele 2 moduri. Ne putem lua de pe roțile de formare acum și face doar asta, sau un fel de hai sa ține de faptul că simplificarea doar pentru acum, inserați acest înapoi în, rezolva această problemă, și acum du-te înapoi la fereastra terminal. Deci, să fie clar, în biblioteca CS50 nu este doar funcții, este, de asemenea, șirul de cuvinte cheie, care este motivul pentru care eroarea sa întâmplat. Deci, aici vom merge. Am fixat atât a problemelor de bibliotecă. Enter. Bine. Argv de 1, foo bar, Enter. Excelent. Deci, acum avem fiecare literă a fiecărui cuvânt imprimate 1 pe linie, care nu face pentru un program foarte interesant, Notă dar acum avem capacitatea de a nu numai iterarea peste cuvinte dar, de asemenea, mai mult de scrisori individuale în cuvinte, care sună teribil de familiare chiar și cea mai simplă de aplicații cum ar fi scrisori se inghesuie intr-un sir de genul asta. Să mergem mai departe și să ia nostru de 5 minute de pauză aici. Și când ne vom întoarce, vom începe să vorbim despre eficiența cu care putem face aceste lucruri mai bine. Bine. Ne-am întors. Datorită unul din TFS noștri, care joacă o mulțime de bananagrams, avem de fapt o gramada de caractere cu noi aici, astăzi fizic incarnat cu aceste piese mici de plastic, și lasă-mă să propun ca această tabula rasa albă reprezintă aici, în memoria RAM computerul meu - laptop, desktop, indiferent de - și există arata ca o mulțime de ea pentru că, dacă vom începe tăierea up această memorie RAM in mici bucati de marimea octet, sa zicem ca ceva arbitrar că dimensiunea și că reprezintă neclare - acolo mergem, și hai să micșora un pic aici - să spunem ceva care dimensiunea reprezintă un singur octet. Deci, putem potrivi într-adevăr, o grămadă de octeți sau caractere din interiorul acestei memorii, astfel cum a sugerat de mărimea relativă aici. Deci, să presupunem acum că obiectivul este de a aloca memorie pentru un sir. Cum functioneaza acest fapt? În programele care le-am fost scris, am fost de obicei folosind getString, dar acum, în mod clar, e un alt canal prin care putem ajunge introduse de utilizator în argv prin argumente de linie de comandă. Dar ce se întâmplă cu adevărat pe sub capota? Se pare că, dacă noi numim - să derulați înapoi la getString - getString funcția de în bibliotecă CS50, utilizatorului i se solicită pentru un șir, tipurile de utilizatori, în unele cuvântul - să-l numim HELLO. Și noi am spus pentru ultimele două săptămâni că valoarea de returnare a getString este de fapt un șir, cum ar fi cuvântul HELLO. Dar ceea ce este cu adevărat getString face? Pe măsură ce utilizatorul tastează în HELLO, Enter, getString este imaginind, ok, cate caractere este asta? Aceasta este H-E-L-L-O. Așa că trebuie să aloce, acesta trebuie să solicite sistemul de operare - Linux, în acest caz - pentru cel puțin 5 octeți pentru a stoca HELLO. Și ce se continuă apoi să facă după ce se întoarce de la cele 5 octeți sistemul de operare este de a stabili în HELLO spate în spate la spate în spate. Și deci ce este într-adevăr sa întors de la getString este o bucată de date care arata ca acest lucru. Dar acest lucru este un pic inexacte, deoarece se pare că nu e la fel de simplu doar ca stocarea HELLO în memoria calculatorului deoarece presupunem că programul meu pe care am scris în C, apoi solicită getString din nou, și cuvântul următor utilizatorul este tipurile din Bye, bye. Ei bine, am nevoie de asta pentru a se potrivi BYE cuvânt undeva în memorie. Eu nu pot rescrie HELLO. De exemplu, nu vreau calculator pentru a începe doar suprascrierea ca acest Cuvântul original, pentru că s-ar putea fi utilizați în continuare cuvântul HELLO într-o variabilă în altă parte în programul meu. Deci, B-Y-E are pentru a ajunge undeva în memorie. Dar convenția de obicei, este faptul că șirul viitoare când vă aloce Probabil, dar nu întotdeauna, se va ajunge la următoarea locație de memorie disponibilă. Și dacă nu am cerut sistemul de operare pentru orice memorie deoarece ultima dată când am sunat getString, șansele sunt BYE cuvântul se va termina imediat după cuvântul HELLO în memorie. Dar, în acest moment, puteți vedea, probabil, în cazul în care apare o problemă potențială. Deoarece bucăți de memorie, pentru următoarele octeți următoarele care au fost doar liber - curățați ardezie alb - în memoria calculatorului au fost chiar lângă HELLO, se simte ca primul șir am cerut brusc s-ar putea schimba acum în esență, pentru că am schimbat-o HELLOBYE în loc de demarcing cumva începutul Q și sfârșitul HELLO. Deci, se dovedește că ceea ce se întâmplă cu adevărat sub capota, care s-ar putea fi întrezărită în referințele on-line sau secțiune sau cărți sau nu la toate încă este că nu există de fapt, o demarcare deliberată între cuvintele din memoria unui computer. Și, de fapt, în acest caz aici, mai degrabă decât a pus doar BYE chiar lângă HELLO, în schimb, calculatorul pune un caracter special, caracterul special nul, ca să spunem așa, care este reprezentată cu un marker cu backslash 0. Deci, pe scurt, se amintească faptul că personajele sunt reprezentate în ASCII. ASCII este doar o mapare între numere și litere, și cele mai multe dintre aceste scrisori începe aproximativ 65 pentru capitalul A, dar se pare că puteți reprezenta cu siguranță 0 număr ca un întreg sau în binar, și se pare că lumea a decis de mult, mult timp în urmă, "Știi ce?" "Să rezervelor de 0 număr ca nu reprezinta niciun caracter pe tastatură - "Nici litere, nici cifre, semne de punctuație nu. 0 este specială." "Va fi caracterul special nul, și noi o să-l scriu ca \ 0." Diferența fiind daca am scris doar 0, 0 este un personaj. Amintiți-vă că există coduri ASCII pentru 0, pentru 1, pentru 2, pentru 3 deoarece 0 caractere este diferită de 0 număr. Și puteți vedea că, dacă te uiți înapoi de la saptamana 1 atunci când am vorbit prima data despre ASCII, 0 și 1 și 2 și 3 tot drumul până la 9 au avut propriile coduri ASCII. Ele nu sunt, coincidență, 0 la 9. Sunt foarte diferite. Astfel încât cifra 0 înseamnă doar "Eu sunt speciale", iar \ 0 înseamnă, literal, "Eu nu sunt un caracter 0." "Sunt această valoare deosebită, caracterul nul." Așa că am nevoie de un alt fapt, una dintre acestea, deoarece eu nu pot face aceeași greșeală de două ori. Deci, după cuvântul BYE ne, de asemenea, de gând să nevoie de un alt unul dintre aceste personaje nule. Lasă-mă să iau stiloul meu de aici și lasă-mă să elaboreze rapid un alt \ 0 astfel că după ce am cerut sistemul de operare pentru 2 siruri de caractere prin getString urmat de un alt apel la getString, acest lucru este ceea ce este, de fapt în memorie. Așa că atunci când mă întorc un șir de caractere, eu sunt foarte obtinerea înapoi că, si cand ma șirul următor, eu sunt foarte obtinerea înapoi asta. Deci, această întrebare ridică, strlen, în primul rând, ceea ce ar trebui să se întoarcă? Când m-am apel strlen pe e coarde și S a fost cuvântul HELLO că utilizatorul tastat, ceea ce am spus în mod evident durata HELLO a fost acum câteva minute? Acesta a fost de 5, nu? H-E-L-L-O. Și asta e într-adevăr, cum strlen lucrări. Returnează ceea ce o ființă umană normală s-ar aștepta lungimea unui sir de a fi. Dar, în realitate, cât de mare este matrice de caractere pe care se stochează salut? Este de fapt 6. Deci, strlen nu menționează acest fapt pentru tine. Dar sub capota computerul este într-adevăr, folosind 6 bytes pentru a stoca un cuvânt 5-scrisoare, și acest lucru este adevărat, indiferent de cât de mult timp este cuvântul. Există întotdeauna o să fie un caracter nul specială care se termină la sfârșitul șirului la demarc lungimea sa totala. Deci, dacă sunteți în prezent persoana de punere în aplicare strlen 20, acum 30 de ani, cum te duci despre punerea în aplicare a strlen în sine? Ne ia acordat pentru că există, la fel cum am lua de bun faptul că există printf, dar dacă HELLO este cuvântul în discuție și ceea ce am în memorie este ceva care arata ca acest lucru, în cazul în care a trebuit să reimplement strlen pentru că li sa cerut să sau pentru că, sincer, nu știai strlen exista - a trebuit să se rostogolească aceasta pe cont propriu - cum ai putut să pună în aplicare strlen atunci când se administrează ceva care arata ca acest lucru? Acum, că știm un șir este o matrice, putem itera peste fiecare dintre caracterele individuale folosind ceva de genul - Să încercăm să facă acest lucru din mers. Lasă-mă să intru în aparat. Lasă-mă să creați un fișier nou, strlen.c. Lasă-mă să merg mai departe acum și nu includ stdio.h, astfel încât să avem acces la printf. Lasă-mă să fac int main (void). Oh. Voi face asta pe cont propriu de acum, atunci. [Chicotește] Mulțumesc. Aceasta este ceea ce fac. Bine. Deci, înainte de m-am întors pe ecran, am scris toate astea. Și acum ce am de gând să faceți este următoarea: printf ("Dă-mi un șir:") Asta e doar instrucțiunile pufoase. Acum, permiteți-mi să fac getString sirul s =. Am deja nevoie pentru a face o schimbare acum. Sunt folosind biblioteca CS50 brusc, asa ca lasa-ma sa plec mai departe și tastați în cs50.h. Și acum să facem acest lucru: printf ("Lungimea este:% d, strlen [s] - si eu nu am terminat încă. Ce altceva mai trebuie să adaug la acest program? [Elev] string.h. String.h >>. Deci, pentru moment, suntem folosind strlen, asa ca hai sa asigurați-vă că compilatorul stie unde este, deci un bun-simț puțin verifica. Primesc un șir de caractere în linia 8, iar în linia 9 am imprimarea lungimea sa cu d%. Așa că hai să mergem mai departe și să deschideți asta. Ne-am face strlen - compilează bine - strlen - permiteți-mi mări - Intră, H-E-L-L-O, Enter. Lungimea este de 5. Ok, deci strlen pare să funcționeze, dar lumea știa asta. Deci, haideți să pună în aplicare acum strlen noi înșine, după cum urmează. Lasă-mă să iau această bibliotecă departe. Nu mai avem acces la string.h pentru că nu am știut că există. Dar asta e bine pentru că eu mă pot pune în aplicare strlen și să-l ia un șir de intrare numit, și acum am nevoie să dau seama lungimea acest șir. Deci, cum pot face acest lucru? Ce se întâmplă dacă fac - să vedem cum se face acest lucru - Ce vrei să faci? [Răspuns studentul nu pot fi auzite] >> Ok. Astfel încât să putem face acest lucru într-o grămadă de feluri. Lasă-mă să încerc să iau această abordare. Permiteți-mi să dau eu o variabila int i, asa ca am începe de la 0. Și permiteți-mi să spun acest lucru: în timp ce de intrare [i] nu este egal cu ce? \ 0. Deci, se dovedește, ca și în cazul cu toate caractere atunci când le scriu pur și simplu într-un program, va trebui să utilizați ghilimele simple, ghilimele duble, nu. Așa că, dacă aș fi scris litera a, mi-ar face asta, litera b, mi-ar face asta. Acest lucru, în schimb, ar fi un șir de caractere, nu un caracter individual. Deci vreau \ 0 literalmente. Ce vreau să fac în această buclă? De fapt, am nevoie de o altă variabilă, astfel încât lungimea int devine 0. Chiar dacă nu a fost sigur de ce am început să am facut felul, Acum că suntem merge în jos acest drum, ceea ce vreau să fac pe linia 9? lungime + + și apoi în jos, aici, pe linia 10, lungime retur. Deci, cum este pusă în aplicare strlen? Este de fapt pusă în aplicare, probabil ca asta. Poate că persoana a folosit un pentru buclă, poate o face în timp ce bucla - cine știe? Ne-ar trebui într-adevăr să se uite sub capota de la codul sursă reală în unele fișier numit string.c probabil. Dar sa aici ne gândim la ceea ce fac eu. Sunt de declarare a unei variabile numita i, setarea este egal cu 0. Sunt declarând apoi un alt lungime variabilă numită, setarea este egal cu 0. Apoi am să spun în timp ce personajul-lea, în intrare nu este egal cu caracterul nul special, \ 0, incrementa lungimea. Dar, de îndată ce personajul-lea este acest caracter special, ce se întâmplă cu bucla? Acesta scurtcircuitelor. Se oprește, ceea ce înseamnă că apoi va reveni instantaneu lungime. Așa că, dacă nu am în bară, să mergem mai departe și du-te înapoi la fereastra terminalul meu. Lasă-mă să recompilați. Și eu am în bară. Redeclararea incompatibile funcției strlen bibliotecă. Așa că am fost încercarea de a obține prea deștept pentru binele meu aici. Compilatorul de fapt, știe că există o funcție numită strlen chiar daca nu am inclus biblioteca. Asta e bine. Oricare ar fi. Suntem doar de gând să coopereze atunci. Să redenumi această lungime. Lasă-mă să schimbe utilizarea acestuia la lungime aici, iar acest lucru va face mai fericit zăngănit. Ca o paranteza, deoarece unele dintre aceste funcții sunt atât de al naibii de comune - strlen, prinf - au de fapt un fel de statut special. Și așa zăngănit știe doar ceva special despre ei. Asta nu e mereu cazul cu cele mai multe funcții, astfel că de aceea ne-am țipat la. Lasă-mă să încerc din nou. Din fericire, aceasta a lucrat acel moment. Asa ca lasa-ma acum a alerga propria mea strlen programului. Dă-mi un șir: H-E-L-L-O, Enter. Și am dat-on bară. De ce? >> [Elevului răspunsul neauzit] >> Exact. Deci, am eu aici o buclă foarte drăguț infinit deoarece, chiar dacă eu sunt incrementarea lungime pe fiecare iterație, ceea ce eu nu fac în mod clar? Eu nu am de incrementare. Bine. Ușor fix. Da? Bine. Nu Acum ne-ar alerga afoul de o greșeală comună în cazul în care am nevoie de alte paranteze. Și sincer, acest cod este începe să arate urât, asa ca vom lua o lovitură de cuțit la curățarea asta într-un moment. Dar acum eu sunt incrementarea atât lungimea și i. Sincer, eu văd deja o oportunitate de imbunatatire aici, dar vom reveni la asta. Deci, acum să asigurați-vă doar că suntem cel puțin realizarea de progrese. Acest lucru sa întâmplat la câteva dintre voi, si am neglijat să menționeze acest lucru în avans. Când aveți ghinionul de un scenariu ca acesta, cum să remediați această scurt repornirea aparatului sau calculatorului sau închiderea ferestrei? Este de fapt usor. De control C se va trimite acest mic morcov simbolul C, și că se termină doar cele mai multe programe. Dacă aveți o buclă infinită foarte rău că se imprimă ori chestii infinit de multe, uneori, este posibil să aveți pentru a lovi de control C o mie de ori pentru a face o aud de fapt. Deci dau seama doar acum, pentru că nu am nimic de imprimare, care a fost destul de ușor. Și punct de vedere tehnic, o dată este suficientă, dar nu primesc nerăbdător și l-am lovit, de obicei, este faptul că de multe ori. Deci, strlen. Dă-mi un șir: HELLO. Este de gând să lucreze de data asta? Bine. O altă greșeală comună. Trebuie să recompilați. Asta a fost în mod deliberat, ca unul. Bine. Deci strlen, H-E-L-L-O, Enter. Excelent. Deci, acum avem o strlen la 5. Deci, ne-am Reimplementat literalmente că roata. Deci, acum sa curat asta, deoarece acest lucru nu face m-au impresionat cu design de codul meu. Ce putem elimina în mod clar în acest program pentru a curăța asta? [Răspuns studentul nu pot fi auzite] >> Da. Literalmente, ne trata i și lungimea identic. Deci, de ce să nu avem doar inteligent și să spună în timp ce lungimea? Mai degrabă, hai să numim doar lungime pentru a începe cu, inițializați-l la 0 deoarece în mod implicit șirul nu are lungime până când ne dăm seama ce este. Acum, facem acest lucru, iar acum acesta este un program de destul de elegant. O variabilă. L-am curatat, l înăsprit. Deci, acum să ne întoarcem la fereastra terminalul meu. Să mergem mai departe și să rulați acest lucru. Make strlen. Arata bine. Rulați din nou strlen, Enter. Dă-mi un șir: HELLO, Enter. Și se pare a fi de lucru ca 5. Acum, să fie clar, dacă n-aș fi scris, de exemplu, Buna, ziua în 1 sir și apoi într-un alt BYE, putem avea cu siguranță mai multe cuvinte. Dacă expresia fapt, am vrut sa tip nu a fost HELLO, ci, de exemplu, Bună ziua lume, observați că ceea ce noi nu ar avea această situație este aici, nu? Aceasta ar sugera că e 2 siruri de caractere. Aveți cu siguranță poate avea caractere bara de spațiu, așa că, dacă am tastat de fapt, într-o frază mai lungă ca lumea HELLO, ceea ce ne-ar fi cu adevărat în memorie arata ceva de genul asta acolo. Bine. Orice întrebări, apoi despre reprezentarea aici de siruri de caractere? Nu? Bine. Așa că am spus mai devreme ca de asteptare strlen nou și din nou în mod deliberat de genul asta probabil, nu este cea mai bună idee pentru că ai de gând să faci o mulțime de muncă din nou și din nou și din nou. Într-adevăr, ce fel de muncă este necesară pentru imaginind lungimea unui șir, aparent? Va trebui să înceapă de la început și apoi uite, uite, uite, uite, uite până când veți vedea în cele din urmă acest caracter special, moment în care, ah, acum știu lungime. Deci, mai devreme, când ne-am strlen fiind chemat din nou și din nou și din nou, motivul pentru care am propus ca a fost un fel de prostie este că, din nou, acel șir arată așa. Aceasta nu se va schimba de fiecare dată când itera prin intermediul unor bucle, asa faci de lucru inutil. În același timp, ar trebui să știi, ca o paranteza, ca compilatoare cum ar fi zăngănit în aceste zile au fost dezvoltate pe parcursul multor ani, și scriitori de compilare, programatori, sunt destul de inteligente. Și așa se dovedește că compilatoare zăngănit și alte pot da seama de fapt că, bine, da, ai scris strlen în starea ta, ceea ce punct de vedere tehnic înseamnă că ne-ar suna din nou și din nou și din nou. Dar compilatoare inteligente pot optimiza de fapt, aceste tipuri de decizii proaste de utilizare din codul pentru a redresa lucrurile. Deci, nu doar dau seama că uneori compilatorul este mai inteligent decât noi și va ascunde un fel de propriile noastre greșeli. Dar cu siguranță atunci când vine vorba de seturi de probleme și cum ar fi, nu se gândesc la aceste decizii de design fundamental eronate potențial pentru simplul motiv că am face de lucru mult mai decât avem de fapt de a face. Dar cât de mult mai mult de lucru? În cazul în Salut lume, să începem să generalizeze dimensiunea acestei probleme. Care este lungimea problema sau dimensiunea problemei atunci când utilizatorul cuvântul tastat este HELLO? E aparent 5, poate 6. Plus sau minus 1. Oricare ar fi. E atât de aproape vom numi doar 5. Deci, ce e de dimensiunea problemei aici atunci când încearcă să dau seama de lungimea Alo? E 1, 2, 3, 4, 5, 6 și poate pentru ultimul caracter, dar hai sa generalizeze că, în calitate nr. Deci n, doar n variabila, este ceea ce oamenii de stiinta de calculator ar folosi de obicei pentru a descrie dimensiunea unei probleme, iar problema la îndemână este cât timp este HELLO? Cât timp se strlen ia? Este nevoie de pe ordinea de pași n, în cazul în care fiecare pas înseamnă gasiti un caracter, uita-te la un personaj, uita-te la un caracter. Și am avut această discuție o înapoi în timp, numărul de operațiuni de ceva ia. Prima zi de clasă ne-am toata lumea sta penibil în sus, și apoi toată lumea a început asocierea off cu altul , în scopul de a conta de fapt, în mod ideal, cât de mulți oameni erau în cameră. Și am făcut, de asemenea, un alt lucru pe care, dacă am făcut-o în locul în drumul spre școală veche de a începe doar 1, 2, 3, 4, 5, 6 și așa mai departe, că prea, dimensiunea acestei probleme a fost de dimensiune n. Erau oameni n în cameră. Dar am putea accelera asta, nu? Stilul de scoala am putea începe numărarea în 2s. 2, 4, 6, 8, 10, 12. Și că se simte atât de mult mai repede, și într-adevăr este. Este literalmente de două ori la fel de rapid, dar, din nou, în cazul în care alte 400 de persoane a intrat în această cameră dintr-o dată, aceste algoritmi ar lua inca 400 sau poate 200 de trepte. Dar, prin contrast, în cazul în care vom ajunge cu adevărat inteligent și avem loc toți avem de voi înșivă conta, amintim modul în care a lucrat algoritm. Voi toți se ridică. Lasă-mă să fast-forward la acest lucru. Voi toți s-au ridicat, vă asociat off, apoi jumătate din voi așezat, jumătate dintre voi se așeză, jumatate din voi se așeză, și pe fiecare iterație a buclei din aceasta saptamana 0, am redus la jumătate problema de la mână și a mers la n / 2, atunci n / 4, atunci n / 8. Și implicarea de care este că, dacă un alt 400 de persoane meargă în camera, nu e mare lucru, va fi nevoie de noi mai mult runda 1, nu 400 mai multe runde, nu 200 mai multe runde. Și așa le-am spus povestea-o înapoi în timp ce trebuia să fac ceva cu asta. Această linie rosie aici este liniar, e drept, și este etichetat ca n deoarece, dimensiunea unei probleme crește, dacă algoritmul sau program cu care te rezolvarea este nevoie de măsuri n, putem trasa o linie dreaptă în cazul în care este nevoie de mai mult timp mai mare dimensiunea problemei. Și abordarea twosies, numărare 2, 4, 6, 8, încă o linie dreaptă, doar un pic mai bine. Este nevoie de un pic de timp mai puțin, astfel încât linia galbenă este sub punctul de linia roșie de punct. Dar a fost chiar mai bine acest Graal sfânt de ceea ce am numit timp logaritmică în cazul în care, chiar dacă din nou vom dubla numarul de persoane in camera, am dubla dimensiunea pe care cartea de telefon din prima zi de clasă, nu e mare lucru, este nevoie de o lacrimă pagina mai mult, ia o ședință mai jos , în scopul de a rezolva o problemă care este de două ori mai mare. Și astfel ajungem conversație acum pentru a începe având în se cum putem rezolva problemele de fapt eficient dacă avem în vedere mai simplă de probleme de acest gen? Să presupunem că avem 8 în spatele ușilor care sunt unele numere, și fiecare dintre aceste numere nu sunt sortate în nici un fel, sunt numere întregi doar aleatorii în spatele acestor uși, și ne punem întrebarea cum te duci despre găsirea număr - cine știe - 7 spatele acestor uși? Ce-ai, un om, nu în scopul de a găsi-mi numărul 7 în cazul în care din nou fiecare dintre acestea sunt uși și pentru a vedea o valoare trebuie să vă deschideți o ușă? Ce-ar fi, probabil, algoritm ta? [Răspuns studentul nu pot fi auzite] >> Deci, începe cu stânga și deschide o ușă, deschide o ușă, deschide o ușă. Și în cel mai rău caz, cât timp este el de gând să ne ia pentru a găsi numărul 7? Și din nou, ei nu sunt sortate, deci nu e la fel de ușor ca, ei bine, am de gând să deschidă ușa saptea. Aceasta ne-ar putea lua, la maximum, 8 trepte. În cel mai rău caz, 7 este aleator la sfârșitul liniei de uși, așa că s-ar putea să încerce toate ușile n. Deci, din nou aici, se pare că avem un algoritm liniar. De fapt, am făcut acest lucru doar o pereche de ani în urmă. Unul dintre predecesorii dvs. a fost contestată cu exact acest în cazul în care nu am avut-o versiune digitală, am avut în schimb o tablă cu unele bucăți de hârtie pe ea. Și ce m-am gândit mi-ar face este să ia o privire rapidă înapoi la modul în care acest a fost, una dintre cele mai bune oportunitati si, probabil, cel mai incomode pe scenă pentru a avea o demonstrație chiar aici, pe Sanders. Am avut 2 rânduri de numere. Suntem doar de gând să se uite la ceea ce se intampla aici cu Sean pentru foarte de sus a acestor rânduri. Cu excepția cazului în nimeni vreodată voluntari din CS50, am avut binecuvântarea lui Sean a menține acest aparat foto pe, așa că știe că sute de oameni au fost uitam asta acum de ani de zile. Dar Sean făcut o treabă minunată - sau a făcut el - la găsirea de fapt, ne-un anumit număr?. Deci, hai sa vedem cum a rezolvat acest algoritm, astfel că vom relua această conversație înainte de mult timp de modul în care vom găsi lucruri eficient. [Malan pe video] am ascuns în spatele acestor uși numărul 7, dar ascuns în unele din aceste uși, precum și alte sunt ne-negative numere, și de obiectivul dvs. este de a gândi al acestui rândul de sus de numere ca doar o matrice sau doar o secvență de bucăți de hârtie cu numere spatele lor, și obiectivul dvs. este, folosind doar matrice de sus aici, găsește-mi numărul 7. Și noi sunt apoi de gând să critice modul în care te duci despre a face aceasta. >> Regulă. [Malan] Cauta-ne numărul 7, te rog. [Râsete] [Malan] nr [râsete] 5, 19, 13, [râsete]. Nu este o întrebare capcană. 1. [Râsete] În acest moment scorul dvs. nu este foarte bun, asa ca s-ar putea la fel de bine continui. [Râsete] 3. Du-te. Sincer, eu nu pot ajuta, dar întreb la ce te gândești chiar. [Râsete] Doar rândul de sus, așa că am luat 3 stânga. Deci, mă găsești 7. [Elevi murmurând] [Malan] 17. [Elevi murmurând] [Malan] 7! [Aplauze] Deci, miercuri, vom arunca cu capul în acest lucru și algoritmi mai sofisticate pentru a găsi lucruri. De acum vom pleca cu Sean și ne vedem miercuri. [CS50.TV]