[MUSIC JOC] David J. MALAN: Bine. Acest lucru este CS50, iar această este sfârșitul săptămânii 2. Așa că astăzi, vom pentru a continua uite noastre la modul în care ne reprezentăm lucrurile sub hood-- se îndepărtează de numere, cum ar fi numere întregi și plutitoare Valorile în puncte și concentrându-se pe siruri de caractere și programe în cele din urmă mult mai interesante. Dar ne vom lua, de asemenea, o privire la un cateva specifice domeniului problems-- dintre care prima va fi fi implicat criptografie, arta de codare informații, în care te vezi mai sus aici este o imagine de Radio orfane Annie inel secrete de decodare de odinioară. Aceasta este de fapt formă foarte primitivă și forma în interesul copilului de cryptopgraphy prin acest inel are două disks-- unul interior și unul exterior. Și prin rotirea unul dintre cei, puteți în esență, linia de sus litere, cum ar fi A prin Z cu alte litere cum ar fi B prin A. Cu alte cuvinte, puteți roti literalmente alfabetul, venind astfel cu o cartografiere de la scrisori scrisori, astfel încât, dacă a vrut să trimită un mesaj secret pentru cineva ca Annie, ai putea scrie jos mesajul dvs. și apoi rotiți scrisorile, prin care, dacă te referi de a spune "A", vei spune în schimb "B", vrei să spui "B" vă spune în schimb "C" - sau ceva un pic mai inteligent decât asta-- și apoi, în cele din urmă, atât timp cât Annie are acest decodor inel, ea poate decoda mesajul. Acum, s-ar putea aminti, de fapt, că această a fost folosit într-un film foarte bine cunoscut, joacă ad nauseum în timpul sezonul de Crăciun. Să aruncăm o privire aici. Ralphie PARKER: "Fie ca este vorba cunoscut de toți în rezumat că Ralph Parker este numit un membru de mic orfan Annie Secret Cercul și are dreptul la toate onoruri și beneficii care apar acestea. " Ralphie PARKER (povestind): Semnat mic orfan Annie. Contrasemnat, Pierre Andre! In cerneală. Onoruri și beneficii, deja la vârsta de nouă ani. [MUSIC JOC] [RADIO Chatter] Ralphie PARKER: Haide. Să mergem mai departe cu ea. Nu am nevoie de tot ce jazz despre contrabandiști și pirați. RADIO Crainic: Asculta mâine noapte pentru aventura de încheiere de The Black Pirate Ship. Acum, e timpul pentru Annie Mesajul secret pentru voi, membrii a Cercului Secret. Amintiți-vă copii, numai membrii de Secret Circle lui Annie poate decoda mesaj secret al lui Annie. Amintiți-vă, Annie este în funcție de tine. Set ace pentru a-B 2. Aici este mesajul-- 12, 11, 2-- Ralphie PARKER (povestind): I Sunt în prima mea întâlnire secretă. RADIO Crainic: --25, 14, 11, 18, 16-- Ralphie PARKER (povestind): Oh, Pierre a fost în mare în seara asta voce. Aș putea spune că din această seară Mesajul a fost foarte important. RADIO Crainic: --3, 25. Acesta este un mesaj de la Annie. Amintiți-vă, să nu spui nimănui. [Gâfâind] Ralphie PARKER (povestind): Nouăzeci de secunde mai târziu, eu sunt în singura cameră în Casa în care un băiat de nouă ar putea sta în intimitate și decoda. Ah. "B" [Chicotește] Ralphie PARKER (povestind): M-am dus la alta. "E." Primul cuvânt este "să fie." Da! Acesta venea mai ușor acum. "U." [Chicotește] RANDY PARKER: Haide, Ralphie. Trebuie sa plec! Ralphie PARKER: Voi fi jos, Ma. Oau. "T." "O." "Asigurați-vă că la. "" Asigurați-vă că pentru a "ce? Care a fost mic orfan Annie încerci să spui? "Asigurați-vă că" ce? MAMA: Ralphie, Randy trebuie să plece. Vrei să ieși? Ralphie PARKER: Bine, mamă! Voi fi afară dreptate! Ralphie PARKER (povestind): Am fost obtinerea mai aproape acum. Tensiunea a fost groaznic. Ce a fost? Soarta planetei poate atarna in balanta. MAMA: Ralphie, Randy trebuie să plec! Ralphie PARKER: Voi fi chiar afară, pentru numele lui Dumnezeu! Ralphie PARKER (Povestind): Aproape am ajuns! Degetele mele zburat! Mintea mea a fost o capcană de oțel. Fiecare por vibrat. A fost aproape clar! Da! Da! Da! Da! Ralphie PARKER: "Asigurați-vă că să bea Ovaltine ta. " Ovaltine? Un comercial crummy? [MUSIC JOC] Ralphie PARKER: Fiu de catea. [Razand] David J. MALAN: Așa că, atunci este o privire la ceea ce criptografie poate fi pentru un asta-- bea de odinioară. Deci, un anunț rapid. Dacă sunteți liber acest Vineri la 13:15 și ar fi dori să ni se alăture pentru CS50 prânz, cap la acest URL aici. Primul venit, primul servit, ca de obicei. Dar, în timp, ne vom asigura că cele mai multe oricine care ar dori să participe poate programa-înțelept. Deci, siruri de caractere. Avem Zamyla-- care l-ai cunoscut acum, cel mai probabil în Problema Set 1-- a cărui nume este scris astfel. Și să presupunem că ați tastat numele ei într-un program de calculator care este folosind ceva de genul getString. În scopul de a prelua aceste intrarile de la tastatura, cum vom merge despre reprezentând o șir, un cuvânt, un paragraf, sau mai multe litere ca acestea aici? Am vorbit ultima dată despre numere întregi și probleme care apar cu preaplin întreg și plutitoare Valorile în puncte și probleme care apar în precizie. Cu siruri de caractere, noi cel puțin au un pic mai multa flexibilitate deoarece strings-- doar în lume- reală poate fi o lungime destul de arbitrară. Destul de scurt, destul de lung. Dar chiar și atunci, vom găsi că computerele pot, uneori, a alerga afară de memorie și nu chiar stoca un șir destul de mare. Dar pentru acum, să începem să vizualizeze un șir de ceva în aceste cutii aici. Deci, șase astfel de cutii, fiecare dintre care reprezintă un caracter sau "char". Deci, amintesc că "char" - c-h-a-r-- este unul dintre tipurile de date built-in în C. Și ceea ce este frumos este că puteți folosi ca un fel de ca un bloc, o piesă de puzzle, dacă vreți, pentru a forma o tip mai mare de date pe care vom continua pentru a apela un "șir." Acum, ceea ce este util despre gândire despre lucruri cum ar fi siruri de caractere, în acest fel? Ei bine, se pare că putem pârghie de fapt această structură pentru a accesa de fapt caractere individuale într-un mod destul de simplu. Am de gând să mergeți mai departe și de a crea un fișier numit "stringzero.c," dar se poate numi orice doriți. Și pe site-ul cursului este deja acest exemplu în avans, astfel încât să nu trebuie să tip totul. Și am de gând să merg mai departe și primul face void main int. Și în câteva zile, vom începe să tachineze pe langa ce gol este aici, de ce e int lângă principală, și așa mai departe. Dar pentru acum, să continuăm la copy paste asta. Am de gând să declare un șir numit uri. Și am de gând să se întoarcă de la GetString indiferent de utilizator tipuri de. Acest lucru va fi un simplu Programul, instrucțiuni, Mă duc să orbește se așteaptă ca utilizatorul știe ce să fac să-l păstrați simplu. Și acum am de gând să aibă o pentru buclă. Și în interiorul pentru bucla mea am Va trebui int i se zero. Și i este, din nou, doar o convenție, o variabilă index de numărare a voturilor, dar am putea numi acest tot ce vreau. Am de gând să fac eu este mai puțin than-- bine Numele Zamyla lui este de șase litere. Așa că am de gând să greu cod care există pentru moment. Și apoi i ++. Și acum în interiorul acestora buclat bretele am de gând să fac printf, și vreau să imprimați o caracter la un moment dat. Așa că am de gând să utilizeze% c pentru poate pentru prima dată. Și apoi vreau să imprimați fiecare caracter pe o linie proprie. Așa că am de gând să pun o puțin backslash n acolo. Închide citat. Și acum vreau să fac ceva aici. Vreau să imprime scrisoare specific în șir, s, așa cum am iterarea de la zero, pe de până la șase. Cu alte cuvinte, vreau să imprima caracterul i'th de s. Acum, cum pot face acest lucru? Ei bine, la fel ca cutiile din această reprezentare aici, un fel de, evoca noțiunea de box scrisori, puteți face în mod similar ca sintactic în C de către pur și simplu specificarea, Vreau să imprime S i'th caracter. Folosind parantezele pătrate pe tastatura computerului care pe o tastatură SUA sunt în general de mai sus cheia de returnare. Deci, acest lucru nu este destul de corect totuși, cum poate ați observat. Dar am de gând să fel de orbește merge înainte aici. Și am de gând să fac face șir 0. Dar înainte de a face acest lucru, să vedem dacă ne-am nu se poate anticipa unele greseli comune. Se întâmplă acest lucru pentru a compila? Nu, îmi lipsește o grămadă de lucruri. Biblioteci am auzit. Deci, ceea ce header fișiere s-ar putea să doriți să adăugați aici? Da. Audiența: Ai nevoie de I / O standard [inaudibil] David J. MALAN: Excelent. Așa că am nevoie de standard de I / O. Pentru ce Scopul nu vreau eu standard de I / O? Pentru printf. Deci includ stdio.h. Și tu propune, de asemenea, că eu sunt biblioteca CS50 pentru ce motiv? Pentru a avea siruri de caractere. Deci, vom vedea ce Biblioteca CS50 este de a face pentru a crea această noțiune a unui șir. Dar pentru acum, vă puteți gândi doar de ea ca un tip real a datelor. Deci, care pare a fi un pic de curățat. Și acum am de gând să merg mai departe și într-adevăr nu face șir 0. Compilat. Deci, asta e bine. Așa că lasă-mă să ./string0 mări astfel încât să putem vedea mai îndeaproape ce se întâmplă. Enter. Z-A-M-Y-L-A intra. Și ne-am tipărit la nume Zamyla lui. Așa că e destul de bine. Deci, acum, să mergem mai departe și rulați din nou acest program, și tip pe nume complet Daven lui. Surpriza, surpriza. Enter. Hmm. Nu am imprimat lui Daven complet prenumele corect. Acum, acest lucru ar trebui să fie evident în retrospectivă cauza a ceea ce, un fel de, decizie de design prost? Da, eu greu codificate șase în interiorul meu pentru buclă. Acum, am făcut asta doar pentru că Știam nume Zamyla lui a fost de gând să fie șase litere. Dar cu siguranta acest lucru nu este o soluție generală. Deci, se dovedește putem dinamic dau seama de lungimea unui șir prin apel la o funcție numită strlen. Din nou, în mod deliberat succint numit doar pentru a face mai convenabil să tastați. Dar asta e sinonim cu obtinerea lungimea unui șir. Am de gând să mă întorc în terminalul meu fereastră și re-rula compilator. Dar e tipa la mine. Declararea implicit funcția de bibliotecă strlen cu tip nesemnate int const-- M-am pierdut. Complet. Deci, mai ales ca dvs. Ochii încep să glazura peste cu mesaje de eroare, cum ar fi acest lucru, focus sincer pe primele cuvinte. Știm că problema este în linia 8, așa cum este indicat aici. Și e în șir-0.c. Implicit declararea Funcția strlen bibliotecă. Deci, care este, în general, va fie un model de mesaje de eroare. Declarând implicit ceva. Deci, pe scurt, ce-am părea să s-au făcut cu privire la linia 8, aici. Care ar putea fi soluția să fie chiar dacă nu ați folosit strlen tine? Audiența: Parte dintr-o bibliotecă diferit? David J. MALAN: Partea unei biblioteci diferite. Deci, este declarat, ca să spunem așa. Acesta este menționat în unele fișier altele decât stdio.h și CS50.h. Acum, în cazul în care este ea definită? Pentru a fi sincer, fie trebuie să doar știu acest lucru pe partea de sus a capului, sau tu pe Google și de a afla acest lucru. Sau știu acest lucru, l-am deschis în CS50 echipamentului cu programul de terminale, care este doar, versiunea cu ecran mare plin de ceea ce este în partea de jos a ferestrei gedit lui. Și se pare că există o comandă similar succint, numit om de manual, în cazul în care, dacă tastați numele unei funcții și apăsați Enter, vei primi înapoi destul de documentație arcane. Este doar un text care, în general, arata ceva de genul asta. Este un pic copleșitoare la prima vedere. Dar sincer am de gând să lasa ochii mei glazura peste și să se concentreze doar pe partea Îmi pasă pentru moment. Care este aceasta. Care arata structural ca ceva eu ​​sunt familiar cu. Într-adevăr, pagina de manual, astfel de a vorbi, vă va spune în ceea ce header depune o funcție ca strlen este definit. Așa că am de gând să mă întorc acum la gedit. Și am de gând să merg mai departe și adauga aici # include și salvați fișierul. Mă duc pentru a goli ecranul cu Controlul L Dacă ați fost întrebați. Și am de gând să re-rula make string.0, compilează acest moment. ./string.0 Zamyla. Care părea să funcționeze Lasă-mă să merg înainte și-l rulați din nou cu Davenport. Enter. Și că, de asemenea, părea să funcționeze. Deci, putem face un pic mai bine decât aceasta, deși, putem începe la lucruri curate sus doar un pic. Și am de gând să de fapt introduce un alt lucru acum. Am de gând să merg mai departe și salva această într-un fișier diferit. Și am de gând pentru a apela acest string1.c fișier doar să fie în concordanță cu codul vei fi capabil să găsească on-line. Și să se concentreze asupra exact același cod. Se pare că am a fost un fel de a lua de la sine faptul că laptop-ul meu, și, la rândul său, aparatul CS50 are o mulțime de memorie, o mulțime de RAM, o mulțime de bytes de spațiu în care pot stoca siruri de caractere. Dar realitatea dacă am scris mult suficiente, și destul de intrarile de la tastatura, Am putea în teorie de tip în mai multe caractere decât computerul meu are fizic memorie pentru. Și acest lucru este problematic. La fel ca un întreg poate doar conta atât de mare, în teorie, puteți ghiftui doar atât de multe caractere în memoria RAM a computerului sau aleatorie Memory Access. Așa că am anticipa mai bine această problemă, chiar deși ar putea fi o rară caz colț, ca să spunem așa. Nu se întâmplă că de multe ori, se poate întâmpla. Și dacă se întâmplă și eu nu fac anticipa și programul pentru ea, programul meu ar putea face cine știe ce. Freeze, atârnă, repornirea sistemului, indiferent de. Ceva anticipat s-ar putea întâmpla. Deci, ce am de gând să fac acum, de acum înainte într-adevăr, este înainte de vreodată orbește utiliza o variabilă ca s care a fost atribuit valoarea de returnare a o altă funcție ca getstring, Am de gând să vă asigurați că valoarea sa este validă. Deci, eu știu doar de la faptul că a citit Documentație CS50 pentru getstring, care în cele din urmă ne vom punct la, că getstring returnează un simbol special numit NULL, N-U-L-L în toate capace, în cazul în care ceva nu merge bine. Deci, în mod normal, se returnează un șir. Dar altfel, dacă se întoarce N-U-L-eu-- vom vedea în cele din urmă ce că într-adevăr pret-- că doar mijloace sa întâmplat ceva rău. Acum, acest lucru înseamnă, la fel ca în Scratch, Pot verifica o condiție aici în C, în cazul în care s nu egal NULL. Deci, dacă nu ați văzut acest lucru înainte, acest lucru înseamnă doar nu egal. Deci, este opusul egali egale, care, amintesc, este diferit de un singur este egal, care este misiune. Deci, dacă s nu este egal cu NULL, numai atunci nu Vreau să execute aceste linii de cod. Cu alte cuvinte, înainte de a se arunca cu capul în orbește și începe iterarea peste s, și tratarea ca și cum acesta este o secvență de caractere, am de gând să verificați mai întâi, așteptați un minut, nu este cu siguranta egală cu această valoare deosebită, NULL? Pentru că dacă e, lucruri rele se pot întâmpla. Și acum, să presupunem că lucrurile rele întâmplă înseamnă accidente de program, și nu se poate recupera în mod necesar. Deci, sincer, se pare urât. e un fel de confuz acum să aruncați o privire la. Dar acest lucru va deveni mai familiar înainte de mult timp. Dar am de gând să propună acum o altă îmbunătățire. Aceasta este o îmbunătățire a corectitudine. Programul meu este acum mult mai corect, deoarece în cazul în care nu rare suficientă memorie există, o voi ocupa, și voi face nimic. Eu, cel puțin, nu se va prăbuși. Dar hai sa facem o versiune finală aici. Și un fișier numit string2.c. Am de gând să lipiți că același cod pentru o clipă, și am de gând să subliniez acest lucru linie, 11, aici, pentru un moment. Acum, realitatea este că compilatoare inteligente ca răsune ar putea rezolva această problemă pentru noi în spatele scenei fără să știe vreodată nostru. Dar să ne gândim la asta fundamental ca un design problematică. Această linie de cod este, desigur, spunând, inițializa unele variabile i la 0. Asta e destul de simplu. Și ceea ce este din nou acest afirmație, aici, i ++, faci? Am văzut-o înainte, dar ne-am Nu am vorbit despre asta. Audiența: Incrementarea i. David J. MALAN: Incrementarea i. Deci, pe fiecare iterație prin această buclă, fiecare ciclu, te-am incrementarea de unul. Deci, devine mai mare, și mai mare, și mai mare, până când bucla se termină. Cum se termina? Ei bine, nu e de mijloc condiție pe care le-am folosit înainte. Ai văzut și în walkthroughs în setul P. Dar ce este acest proverb? Faceți următoarea buclă, astfel timp cât i este mai mică decât ceea ce? Audiența: lungimea șirului. David J. MALAN: Lungimea șirului. Deci, se traduce destul de curat la limba engleză în acest sens. Acum, problema este că de fiecare dată când repeta prin această buclă în teorie, Eu pun această întrebare. Este i mai mică decât lungimea șir de s? Este i mai mică decât lungimea șir de s? Acum este i schimba pe fiecare iteratie? Este. Din cauza ++. Deci, fiecare iterație i devine mai mare. Dar este s ce mai mari, sau mai mici, sau schimbarea la toate? Nu Deci, în termeni de design, una dintre axele de-a lungul care vom încerca să evalueze cod în clasa, acest lucru se simte un fel de stupid. Ca tine sunt literalmente, pe fiecare iterație din această buclă a cere al naibii de aceeași întrebare din nou, și din nou, și din nou, și la propriu niciodată nu se va schimba. Cel puțin dacă nu mă ating e și încercarea de a schimba conținutul uri. Deci, eu pot face un pic mai bine decât aceasta. Și ceea ce am de gând să fac nu este declara doar unul i variabil, dar un al doilea variabilă Voi arbitrar, dar convențional, se numesc n. Atribuirea n egal cu lungime șir de s. Și apoi aici, am de gând să face o optimizare inteligent puțin, așa să vorbească, că la sfârșitul zilei nu mai corectă sau nu mai puțin corectă este decât înainte. Dar e un design mai bun. În faptul că eu sunt, folosind mai puțin timp, mai puține cicluri CPU, așa de a vorbi, pentru a răspunde la fel întrebare, dar doar o singură dată. Orice întrebări cu privire la acest generală principiul îmbunătățirii, spune, eficiența unui program? Da? Audiența: De ce crezi folosi [neauzit]? David J. MALAN: Bună întrebare. Deci, de ce nu ne-am pus ++ la capătul de i în loc de la începutul i? In acest caz, are nici un impact funcțional. Și, în general, am tendința de a utilizați operatorul postfix astfel că este un pic mai clar ca la momentul în care operațiunea se întâmplă. Pentru cei nefamiliarizati, există un alt declarații prin care ai putea face ++ i. Acestea sunt funcțional echivalent în acest caz pentru că nu e nimic altceva în jurul care incrementare. Dar poti veni cu de cazuri și de linii de cod în care care face o diferență. Deci, în general, noi nu facem chiar vorbesc despre asta. Pentru că sincer, ea face dumneavoastră cod sexy, și un fel de impermeabil, și mai puține caractere. Dar realitatea este că e mult mai greu, Cred că, chiar și pentru mine să-și încheie mintea mea în jurul ei, uneori, ordinea operațiilor. Deci, ca o paranteza, daca într-adevăr nu-mi place asta, chiar dacă aceasta este un fel de sexy cauta, puteți face, de asemenea, i + = 1, care este versiunea mai urât al aceeași idee pentru postfix incrementare. Spun acest lucru și voi ar trebui să facă mișto de ea, dar va veni pentru a vedea codul ca ceva frumos înainte de mult timp. [Râsete] David J. MALAN: Corect? Da. Întrebare la mijloc. Audiența: Ai nevoie să spui int n? David J. MALAN: Tu faci Nu trebuie să spun int n. Așa că am spus deja int, nu este nevoie să o spun din nou. Captura este că n trebuie să să fie de același tip de date ca i. Deci, asta e doar o comoditate aici. Da. Audiența: Poti sa te duci de-a lungul Suport de imprimare de caractere s i din nou? David J. MALAN: Absolut. Deci% c, amintesc de trecut timp, este doar un înlocuitor. Aceasta înseamnă pune un char aici. backslash n, desigur, doar mijloace pune un sfârșit de linie aici. Așa că doar pleacă, acum, această bucată de noi sintaxă. Și acest lucru este pur și simplu spune, apuca sirul numit s și du-te sa caracter i'th, ca să spunem așa. Și eu tot spun caracter i'th pentru că pe fiecare iterație de această buclă E ca și cum ne-am imprimați , în primul rând s suport 0, ca un programator ar putea spune. Apoi, s suport 1, apoi s suport 2, apoi 3, apoi 4. Dar, desigur, este o variabilă, așa că am exprima cu i. Key, deși, este de a realiza, mai ales daca nu ai fost adaptați la această lume de programare, în cazul în care noi toți par a conta la zero, trebuie să începe numărarea de la zero acum. Pentru ca siruri de caractere, primul caracter, z în Zamyla este pentru mai bine sau mai rău pentru O să trăiască la locație numărul zero. Bine, asa ca lasa-mi aducă ne aici la Zamyla și să vedem ce se întâmplă cu adevărat pe sub capota. Deci există această noțiune de tip de turnare. S-ar putea avea de fapt a jucat cu această deja, Poate pentru hacker Ediția din P stabilit o. Dar tip de turnare doar se referă la capacitatea C și în alte limbaje pentru a converti un tip de date la altul. Acum, cum am putea vedea acest lucru destul de straightforwardly? Deci aceasta, amintesc, este începutul din alfabetul englez. Și context, amintim, de la ca în urmă cu o săptămână este ASCII. Codul American Standard pentru schimbul de informații. Care este doar un mod foarte lung de a spune o cartografiere de la scrisori a numerelor, și de la numere la litere. Deci, de la A la M aici, dot dot dot, linii cu, rechemare, numărul zecimal 65 în sus. Și nu am vorbit despre aceasta în mod explicit, dar cu siguranță nu e asemănător Numerele de litere mici. Și într-adevăr, există. Lumea a decis cu câțiva ani în urmă că puțin o, litere mici o, va fi de 97. Și puțin b se întâmplă să fie 98, și așa mai departe. Și pentru orice altă tastă pe tastatura, nu e Va fi un model similar de biți. Sau echivalent, un număr zecimal. Deci, întrebarea la mână, apoi, este cum putem a se vedea de fapt, acest sub capota? Așa că am de gând să merg pe la gedit din nou. Și, mai degrabă decât de tip aceasta o de la zero, Am de gând să merg mai departe și doar deschide ceva din Codul de astăzi numit ASCII zero. Și ASCII zero, arata ca acest lucru. Deci, haideți să mintea noastră acest lucru. Deci, prima, am comentat codul, ceea ce este frumos. Pentru că este pur și simplu mi-a spus ce să se aștepte, afișa o cartografiere pentru majuscule. Acum, eu nu prea stiu ce am spui cu asta, așa că hai să deducem. În limba engleză, poate oarecum tehnician engleză, ceea ce face linia 18 par a face pentru noi? Doar linia 18. Ce se inducerea? Ce se va lovi cu piciorul off aici? Audiența: O buclă. David J. MALAN: O buclă. Și de câte ori este care va repeta? Audiența: [interpunerea VOCI] de șase ori. David J. MALAN: Nu șase ori. Audiența: de 26 de ori. David J. MALAN: de 26 de ori. Da, îmi pare rău. De 26 de ori. De ce? Ei bine, e un pic ciudat, dar Am început de numărare de la 65 de ani. Ceea ce e ciudat, dar nu rău. Nu-i rău pe cuvânt de spus. Și eu fac asta doar deoarece, în acest exemplu, Sunt un fel de anticipare care capitalul A a fost de 65. Acum, acest lucru nu este cel mai elegant mod de a face acest lucru, la fel de cod greu Valorile ezoterice că nimeni nu este de așteptat vreodată să-și amintească. Dar pentru acum, observa că eu sunt face acest lucru până pe 65 plus 26. Pentru că se pare că nici nu vreau pentru a face aritmetica în capul meu. Deci, voi lasa compilatorul o face. Dar, apoi, pe fiecare buclă, fiecare iterație din bucla, am incrementare i. Deci, acum acest lucru pare un pic criptic. Dar ar trebui să avem clădirea de bază blocuri cu care să înțeleagă acest lucru. % C este doar un substituent pentru un char. % I este un substituent pentru un int. Și se pare că, prin utilizarea acestui nou sintaxă, această paranteză, așa de a vorbi, deci un tip de date în interiorul unei paranteze, Eu pot forța compilator pentru a trata i nu este un număr întreg, ci ca un char. Mi-a arătat astfel caracterul echivalent de acest număr. Acum aici, acest cod este destul de mult identic. Am vrut doar să facă Super explicit faptul care încep de la 97, care este minuscule o. Pe de până prin 26 de mai multe litere. Și eu doing-- din nou, turnare i, ca să spunem așa. Sau tip de turnare i, ca să spunem așa. De la un int la un char. Deci, rezultatul final va fi, sincer, informațiile pe care le cunosc deja. Am de gând să facă -ascii 0 nu dot-- dot c. Observați, probabil ai făcut asta greșeală ca tocmai am făcut accidental. Asigurați-ascii 0. Acum am de gând să fac ./ascii-0. Voi mări, și, din păcate, se va derula în afara ecranului. Dar noi vedem un întreg tabel în care o hărți la 97, hărți B la 98, și dacă vom derula în sus mai departe O, desigur, hărți pentru 65 de ani. Deci, aceasta este doar să spun că ceea ce am fost predica, există această echivalență, se în fapt, în cazul în realitate. Deci, o modificare rapidă a acestei. Lasă-mă să deschid ascii-1.c. Și observa acest lucru inteligent, un fel de, clarificare în acest sens. Acest lucru este ascii-1.c, și observa acest lucru nebunesc. Și acest lucru devine foarte la inima de ce computerele fac. Chiar dacă noi, oamenii, ar fi nu conta din punct de vedere letters-- Nu incepe sa te gandesti, bine o atunci b, și de a folosi cele pentru conta obiecte fizice. Se poate spune cu siguranță că vreau să inițializarea unor variabile numite C- dar am fi putut numit acest orice-- astfel c este inițializat la capital A. Pentru că la sfârșitul zilei, computerul nu-i pasă ce stocarea, ea ii pasa doar cum vrei de a prezenta aceste informații. Cum vrei computer pentru a interpreta că modelul de biți? Deci, acest lucru nu este ceva ce în general, s-ar recomanda acest. Este într-adevăr doar un exemplu de transmite că puteți absolut inițializa un număr întreg de un char. Deoarece sub capota de un char, desigur, este doar un număr de la 0 la 255. Astfel încât să puteți cu siguranță pune-l în interiorul unui int. Și ce aceasta, de asemenea, demonstreaza este că noi poate converti de la un tip la altul, aici, în cele din urmă de imprimare același lucru. Și, de fapt, aceasta voi repara online-- a fost menit să spun acest lucru, din nou, aici. Lasă-mă să curețe asta on-line, și vom a se vedea într-un walkthrough online, după cum este necesar, ceea ce a fost destinat acolo. OK. Deci, ultimul exemplu care implică acum a și b și apoi vom ia lucrurile la un alt nivel. Deci, cu un și b și c lui în valorificarea și echivalența acestora, să aruncăm o privire la acest exemplu, aici. Un alt exemplu de cod. Vom deschide unul care este deja făcut, așa că ne-am Nu trebuie să-l introduceți toate de la zero. Și observa in anticiparea suntem folosind antet multiple fișiere, printre care se noul nostru prieten, string.h. Acum acest lucru pare, la prima vedere, un pic criptic. Dar să vedem dacă nu putem raționa prin ceea ce se întâmplă aici. În primul rând am obține un șir de utilizator, și am pus șir într-o variabilă numite s. Copy Paste de la înainte. În linia 22, sunt aparent face exact ceea ce Am facut-o acum o clipă, am iterarea peste caracterele din s. Și noi trucuri de aici sunt utilizați lungime șir, optimizarea minor de stocare și lungimea șirului în n, mai degrabă decât de asteptare strlen din nou, și din nou, și din nou. Și tocmai de verificare care i este mai mică decât n. Acum, aici, lucrurile devin puțin interesant. Dar este doar o aplicație din aceeași idee nouă. Ce face în limba engleză s suport i reprezinte? Audiența: Numărarea fiecare caracter [neauzit]. David J. MALAN: Numărarea fiecare personaj. Și chiar mai succint, s suport i reprezintă ce? Vrei sa spui. Nu pentru a vă pune la fața locului aici. Audiența: Deci-- David J. MALAN: Deci, în cazul în care cuvântul e-- dacă șirul este Zamyla, care starts-- Audiența: --you a face cu caracterele separately-- David J. MALAN: Bine. Exact. Notația paranteză, vă permite pentru a accesa fiecare caracter individual, astfel s suport 0 va fi primul caracter din șir. s suport 1 va fi al doilea, și așa mai departe. Deci, întrebarea ce cer, aici, în această stare este ceea ce? Este caracterul i'th de s mare mare sau egal cu litere mici o? Și ce înseamnă acest lucru, aici, cu dublu ampersand? AUDIENTA (împreună): Și. David J. MALAN: Si. E doar echivalent cu aceasta. Și nu este un cuvânt cheie în C, trebuie să utilizare, enervant, ampersand ampersand. Și aceasta, în schimb, se cere este S i'th caracter mai mici sau egale în litere mici Z? Și din nou, aici e în cazul în care înțelegerea activului suport punerea în aplicare a unui calculator are sens. Observați că, chiar dacă am punct punct punct de acolo, arata ca la A la Z cu litere mici sunt toate valorile adiacente până la 97 pe sus. Și aceeași pentru majuscule incepand de la 65 de ani. Deci Takeaway, apoi, este că în limba engleză, cum ai descrie ce linia 24 este de a face? Da? Audiența: La data de 24 este de verificare pentru a vedea dacă fiecare personaj este o literă mică. David J. MALAN: Se verifică dacă fiecare personaj este o literă mică. Deci, chiar mai succint, este caracter i'th de s litere mici? Asta e tot ce suntem exprimarea aici logic, un pic criptic, dar în cele din urmă destul de straightforwardly. Este S i'th minusculă? Dacă este așa, și aici e unde lucrurile a obține o minte puțin îndoire pentru o clipă, dacă da, du-te înainte și imprima un caracter. Deci, aceasta este doar un substituent, dar ce personaj? De ce fac s suport i minus această expresie aici? Ei bine observa modelul aici. Numerele reale nu conteaza atat de mult. Dar observați că 97 este cât de departe de la 65? Audiența: 32. David J. MALAN: 32. Cât de departe este de 98 la 66? Audiența: 32. David J. MALAN: Micul c de la mare C? 32. Deci, există 32 de hamei din o scrisoare la alta. Deci sincer, ar putea simplifica aceasta pentru că. Dar apoi sunt cam greu de codificare această înțelegere nivel scăzut că nu cititor este tot O să înțeleagă. Așa că am de gând să-l generalizeze ca, eu cunosc literele mici sunt mai mari. Știu că scrisorile de capital sunt valori mai mici, ironic. Dar acest lucru este efectiv echivalent cu spunând scade 32 de s suport i. Deci, în contextul acestor scrisori, în cazul în care scrisoarea se întâmplă să fie un, litere mici o, și eu scad 32, ce efect are asta, matematic, pe litere mici o? Audiența: Capitalizes-- David J. MALAN: valorifică. Și într-adevăr, acesta este motivul nostru Programul se numeste valorifica zero. Acest program, fie valorifică o scrisoare, după verificarea dacă este într-adevăr, o literă mică. În caz contrar, în linia 30, ce trebuie să fac în cazul în care nu este o literă mică, care sunt uita la la o anumită iterație la curent. Doar imprimare-l. Deci nu se schimba lucrurile că nu e nici măcar cu litere mici. Limitați-vă la puțin o prin pic z. Acum, acest lucru este destul de arcane. Dar, la sfârșitul zilei, această este modul în care, o dată la un moment dat, a trebuit să pună în aplicare lucrurile. Dacă am în schimb deschid valorifica o, oh mulțumesc lui Dumnezeu. Există o funcție chemați să superior care pot face tot ceea ce tocmai am făcut la un nivel destul de scăzut. Acum, la partea superioară este interesant deoarece este declarată într-un fișier, și ar trebui să știi doar acest prin verificarea documentației, sau se spune, să zicem, în clasă, în cazul în care există, într-un ctype.h fișier numit. Deci, acesta este un alt nou prieten de-al nostru. Și pentru a face exact superior ceea ce sugerează și numele. Puteți trece în, ca un argument, între aceste paranteze, unele caractere. Am de gând să treacă în caracterul i'th de s folosind notația noastră fantezie nou care implică paranteze pătrate. Și să ia o presupunere, care este randamentul valoare de la superior aparent merge să fie? O scrisoare de capital. O scrisoare de capital. Deci, dacă am trece cu litere mici a, sperăm, prin definiție de la partea superioară, o să se întoarcă o majuscule A. În caz contrar, dacă nu este o literă mică în primul rând, eu doar l imprimați. Și într-adevăr, observa al doilea prieten aici. Nu doar la partea superioară există, dar este mai mic, care răspunde de fapt la această întrebare pentru mine. Acum, cine a scris aceste lucruri, 10s de ani în urmă, știi ce? Implementat de sus și este mai mici, folosind codul de genul asta. Dar, din nou, în concordanță cu această idee de abstractizare departe, un fel de, nivel inferior detalii de implementare. Și în picioare pe umerii oamenilor care a venit în fața noastră, cu ajutorul funcțiilor ca să superioară și este mai mică, care destul de minunat sunt frumos numit de a spune ceea ce fac ei, este o paradigmă minunat de a adopta. Acum, se pare că, dacă am citit pagina de manual pentru, să zicem, la partea superioară, Am invata ceva. Deci, omul toupper. Este un pic copleșitoare. Dar notificare, aici e că mențiune de fișierul antet pe care ar trebui să folosesc. Ca o paranteza, deoarece aceasta este înșelătoare, funcția foloseste int in loc de caractere din motive de verificarea erorilor. Dar vom veni, probabil, înapoi la faptul că, în viitor. Dar observați, aici, la convertiți superioare litera c în majuscule, dacă este posibil. Deci, asta e destul de simplu. Si acum sa fi un pic mai specific. Să ne uităm la o parte din Pagina de om în valoare de retur. Valoarea returnată este că scrisorii convertit. Sau c, în cazul în care conversia nu a fost posibil, unde c este cu cel inițial. Ceea ce stiu de aici, de la argumentul de la superior. Deci, ce este Takeaway de asta? Valoarea returnată este că scrisorii convertit, sau c, scrisoarea originală, dacă conversia nu a fost posibil. Ce îmbunătățiri pot eu, prin urmare, face la designul codul meu? Da? Audiența: Puteți scoate altcineva. David J. MALAN: pot elimina declarația altceva, și nu doar declarația altceva. Audiența: Aveți posibilitatea să eliminați [neauzit]. David J. MALAN: pot scoateți tot furca în drum, în cazul în care mai totul. Așa că, într-adevăr, să-mi deschid versiunea finală a acestui fapt, valorifica-2 și observa doar cum, în cazul în care va, sexy, codul este acum obtinerea, în care le-am redus de la unele șapte sau atât de linii la doar patru, funcționalitatea pe care am intenționat pur și simplu apel la partea superioară, trece în s suport i, și de imprimare afară, cu substituent% C, care caracter special. Acum, fără îndoială, este un bug, sau cel puțin riscul de un bug, în acest program. Deci, doar pentru a reveni la un Takeaway mai devreme, ceea ce ar trebui să fac, probabil, de asemenea, în acest program pentru a face mai robust, astfel încât nu există nici un fel se poate accident, chiar și în cazuri rare? Audiența: Asigurați-vă că nu este NULL. David J. MALAN: Asigurați-vă că nu este NULL. Deci într-adevăr, pentru a face acest super- buna, eu ar trebui să facă ceva de genul, dacă s nu este NULL, atunci mergeți mai departe și să execute aceste linii de cod, care Pot apoi liniuță de genul asta, și apoi pus în acoladă mea aproape. Deci, bun de legare împreună a celor două idei. Da? Audiența: Ai putea folosi o face în timp ce buclă, în schimb? David J. MALAN: Ar putea Am face o face în timp ce buclă? Audiența: --you doriți să vă asigurați că tu de fapt [neauzit]. David J. MALAN: Ar putea utilizați o face în timp? Răspuns scurt, nu. Pentru că ești pe cale de a introduce un alt caz colț. Dacă șirul este de lungime zero. Dacă, de exemplu, am lovit doar Introduceți, fără să tastarea Zamyla. Am de gând să te dai înapoi un real șir, așa cum vom vedea în cele din urmă, care are zero caractere. Este încă un șir de caractere, e doar foarte scurt. Dar, dacă folosiți o face în timp ce, ai de gând să orbește încercați să faceți ceva cu respect pentru că șir, și nimic nu va fi acolo. Audiența: Ei bine, dacă ai făcut-o face [inaudibil] în timp ce S-- David J. MALAN: Oh, am vedea, ține obtinerea unui șir de utilizator. Răspuns atât de scurt, tu ar putea, și să păstreze bat la cap le pentru a vă oferi un șir care este suficient de scurt pentru a se potrivi în memorie. Absolut. Am ales să nu. Dacă nu-mi dai șir I vrea, eu dau demisia, eu renunț. Dar absolut, în acest scop, ai putea face absolut asta. Deci, fișiere antet bibliotecii care acum suntem familiarizați cu sunt acestea, aici. Standard I / O, CS50.h, string.h, ctype.h, și există, într-adevăr, altele. Unii dintre voi au descoperit biblioteca matematică în math.h. Dar permiteți-mi să vă prezint, acum, la această resursă care personalul CS50, Davin, și Rob, și Gabe special au pus impreuna. Care va lega curând pe site-ul cursului. Se numește referință CS50. Care doar pentru a vă oferi o rapid gust de ea, funcționează după cum urmează. Lasă-mă să merg la reference.cs50.net. Veți vedea pe mâna stângă alta o listă copleșitoare de funcții care vin cu c. Dar dacă îmi pasă, pentru moment, despre ceva de genul strlen, Pot să-l introduceți acolo. Se filtrează jos lista la doar ceea ce îmi pasă. Am de gând să faceți clic pe el. Și acum pe partea stângă, veți vedea ce sperăm este o mult mai simplă, umană explicație prietenos de cum Această funcție. Returnează lungimea unui șir. Iată un rezumat, iată cum te să-l utilizați în ceea ce privește fișierul header, și în ceea ce privește ceea ce a funcției arata ca in ceea ce priveste argumentele sale. Și apoi aici, se întoarce lungimea unui șir. Dar, pentru cei dintre voi mai confortabil, aveți posibilitatea să faceți clic de fapt mai confortabil, și conținutul acestui pagina, acum, se va schimba să fie valorile implicite de ce veți obține prin utilizarea pagina de manual. Cu alte cuvinte, CS50 referință este o simplificare de pagini de manual de către personalul, pentru studenți. În special, cele mai putin confortabil și în între, astfel încât să nu trebuie să încerce să-și încheie mintea ta în jurul, sincer, unele sintaxa destul de criptic și documentare cândva. Deci, ține minte în zilele următoare. Deci, aici, din nou, este un Zamyla. Să acum pun o întrebare care este mai mult uman accesibil. Datorită Chang, care a fost imprimarea mai multor elefanți non-stop pentru ultimele zile. Avem o oportunitate de a da cel puțin unul dintre ei departe. Dacă am putea obține doar un voluntar pentru a veni în sus pentru a trage pe ecran. Ce zici de aici? Hai sus. Care este numele tau? ALEX: Alex. David J. MALAN: Alex. În regulă. Alex, haide sus. Suntem pe cale de a vedea dvs. scrierii de mână pe ecran aici. Bine, mă bucur să te cunosc. ALEX: Nice tu te cunosc. David J. MALAN: Bine. Deci, exercițiu foarte simplu. Bar nu este mare pentru a obține un elefant astăzi. Joci rolul de getstring. Și am de gând să vă spun doar șirul pe care le-ați primit. Și să presupunem că, getstring, au fost chemați. Și omul, ca mine, are scris cu Zamyla, Z-A-M-Y-L-A. Doar mergeți mai departe și scrie Zamyla cu privire la ecran ca si cum ați ajuns și depozitate undeva în memorie. Lăsând loc pentru ceea ce va fi de mai multe alte words-- e OK, continua. [Râsete] Deci Zamyla, Excelent. Deci, acum, să presupunem că, getstring, sunt sunat din nou. Și, prin urmare, eu voi oferi, la tastatura, cu un alt nume, Belinda. În regulă. Și acum getString data viitoare este numita, tip I în ceva de genul Gabe, G-A-B-E. Ești într-adevăr a lua la inimă memorie cu acces aleator. Care atrage tot complet aleator. OK. [Râsete] ALEX: Îmi pare rău scrisul meu este rău. David J. MALAN: Nu, e în regulă. Și cum despre Rob, R-O-B. OK. Bun. Deci, eu nu te-am anticipat-ar fel de pune lucrurile în acest fel. Dar putem face acest lucru. Deci, cum te-ai dus de stabilire a aceste caractere în memorie? Cu alte cuvinte, dacă ne gândim la acest ecran negru dreptunghiular ca reprezentând o RAM, sau memoria calculatorului. Și amintesc că RAM este doar o grămadă de bytes, și bytes sunt o grămadă de biți. Și biți sunt într-un fel puse în aplicare, în general, cu o formă de de energie electrică în hardware. Deci, asta e un fel de Stratificarea am vorbit despre și poate lua acum de la sine. Cum te-ai dus de decide unde să scrie Rob versus Gabe față Belinda versus Zamyla? ALEX: Tocmai am făcut-o în ordona ca mi-ai spus. David J. MALAN: Și asta este adevărat. Dar ceea ce guvernat în cazul în care ați pus Numele Belinda și numele lui Gabe? ALEX: Nimic? David J. MALAN: [râde] Așa că funcționează, că e bine. Deci, computerele sunt puțin mai ordonat decât atât. Așa că atunci când ne-am implement-- sta acolo pentru doar un moment-- când suntem de fapt să pună în aplicare ceva de genul getString într-un calculator, Zamyla s-ar putea să fie dispuse destul de mult cum ai făcut pe ecran, acolo. Și ceea ce este esențial pentru a observa aici, ceea ce a făcut Alex, este că există un fel de delimitare printre fiecare dintre aceste cuvinte, nu? Nu ai scris Z-A-M-Y-L-A-B-E-L-I-N-D-A-G-A-B-- Cu alte cuvinte, există un fel de demarcație care pare a fi, un fel de, spațiere aleator între aceste diferite cuvinte. Dar asta e bine, pentru că noi, oamenii, poate acum vizualiza că acestea sunt patru siruri de caractere diferite. Nu este doar o secvență de o mulțime de personaje. Deci, un calculator, apoi, între timp, s-ar putea lua un șir ca Zamyla, pune fiecare dintre aceste scrisori în interiorul unui octet de memorie. Dar acest număr este mult mai mare, desigur, decât șase caractere. Există o grămadă de RAM. Și așa de acum înainte, această grilă de cutii se întâmplă să reprezinte ceea ce tocmai Alex făcut aici pe ecran. Și acum, Alex, va putem oferi o albastru sau un elefant portocaliu de la Chang. ALEX: Voi lua o elefant albastru. David J. MALAN: Un elefant albastru. Deci, o rundă mare de aplauze, dacă am putea, de Alex aici. [Aplauze] ALEX: Mulțumesc. David J. MALAN: Mulțumesc. Deci Takeaway este că, chiar dacă model tip de schimbat in timp, aici pe placa, nu a existat această delimitare între diferitele siruri de caractere că Alex are pentru noi. Acum calculatoare, sincer, ar putea face același lucru. Ele ar putea fel de plop siruri de caractere oriunde în RAM. Până aici, pe aici, aici, aici. Ei pot face exact asta. Dar, desigur, asta e probabil nu cel mai bun de planificare. Corect? Dacă am tot întrebat pe Alex la obține nume, probabil el ar fi pune ceva mai jos aici, poate în sus aici, aici, aici, în cele din urmă pe aici. Dar cu o planificare pic mai mult, cu siguranță, am putea pune lucrurile mai curat. Și într-adevăr, asta e ceea ce face un calculator. Dar captura este că în cazul în care următorul șir primesc după Zamyla este ceva ca Belinda, propune în cazul în care s-ar putea scrieþi lit.b cu privire la această grilă? Unde te-ai duce? În partea dreaptă a A, de mai jos z, de mai jos A? Care ar fi primele tale instincte? Audiența: Sub z. David J. MALAN: Deci, mai jos de z. Și asta e destul de simplu, nu? Este un fel de curat, e ceea ce facem pe o tastatură, atunci când ne-am lovit Enter, sau un e-mail atunci când se face o listă cu marcatori de lucruri. Dar realitatea este că calculatoare să încerce să fie mai eficient, și ghiftui cu siguranță la fel de mult date în RAM în care este posibil, astfel încât să nu pierdeți nici bytes. Astfel încât să nu pierdeți orice bunuri imobiliare ecran. Și problema, însă, este faptul că dacă am pus literalmente litera b după o, cum vom știu unde nume Zamyla se încheie și numele Belinda incepe? Deci, voi, oamenii, doar a propus, de asemenea, apăsați tasta Enter, în esență. Pune-l jos de mai jos. Sau cum a făcut Alex, începe doar scris urmatorul nume sub cel anterior, și de mai jos, care, și apoi sub acela. Acesta este un indiciu vizual. Calculatoare avea un alt reper vizual, dar e un pic mai succint. Este acest personaj funky. Backslash 0, care este, probabil amintind de backslash n, și așa mai departe, acum. Secvențele speciale de evacuare. Backslash 0 este modul de reprezentând opt la zero biți într-un rând. 0000 0000. Felul în care exprima că nu a este lovit numărul zero, de pe tastatură, deoarece, de fapt, că este un char ASCII. Se pare ca un număr, dar este de fapt un număr zecimal care reprezintă circulara simbol, tipul caracterelor circular. Între timp, backslash zero, înseamnă, literal a pus opt la zero bytes aici pentru mine. Deci, aceasta este oarecum arbitrară. Am fi putut folosi orice model de biți, dar lumea a decis cu câțiva ani urmă, care să reprezinte sfârșitul unui șir în memorie, doar a pus o grămadă de zerouri. Pentru ca putem detecta acest lucru. Acum, ceea ce înseamnă că nici o scrisoare de alfabet poate fi reprezentat cu zerouri. Dar asta e bine, am văzut deja pe care le utilizați 65 până la 97 pe sus. Noi nu am primit nicăieri Aproape de toate zerouri. Deci, Belinda în memoria unui computer este, de fapt de gând să merg aici. L-am tras în galben doar pentru a atrage atenția la el. Și preaviz, de asemenea, acest este complet arbitrară. L-am tras ca o grilă. Cum ar fi, memoria RAM este doar un obiect fizic. Ea nu trebuie neapărat rânduri și coloane, în sine. Este tocmai am primit o grămadă de bytes implementat în hardware-ul într-un fel. Dar, dacă după Belinda I tastat numele lui Gabe, el va ajunge aici în memorie, și dacă am scris numele Daven lui, de exemplu, el se va ajunge aici. Și eu pot continua să scrie chiar mai multe nume. Din păcate, dacă am încerca să Trimite un nume foarte lung, S-ar putea alerga în cele din urmă afară de memorie. În acest caz, este getstring O să se întoarcă NULL, așa cum am spus. Dar, din fericire, cel puțin în acest vizuală aici, nu am primit chiar atât de departe. Acum, ceea ce este frumos este că această idee generală de a trata lucrurile ca fiind în cutii este reprezentant a unei caracteristici de C și o mulțime de limbi, cunoscut ca un tablou. O matrice este un alt tip de date. Este o structură de date, dacă vreți. Structura în sensul de ea într-adevăr, un fel de, ca o cutie, cel puțin în ochii minții. O matrice este o contiguă secvență de tipuri de date identice, spate în spate la spate în spate. Deci un șir, în alte cuvinte, este o matrice de caractere. O serie de caractere. Dar se pare că poți avea tablouri de buchete de lucruri. De fapt, putem pune chiar numere într-o matrice. Deci, forma în care vom începe declararea acestor date Structura cunoscut ca o matrice este, de asemenea, va folosi paranteze pătrate. Dar aceste paranteze drepte sunt de gând să au sens diferit în acest context. Și să-l văd, după cum urmează. Să presupunem că am deschis un nou fișier aici. Și am salva acest lucru ca ages.c. Și voi salva acest lucru în dosarul meu aici. Și acum am de gând să merg mai departe și începeți să tastați ceva ca includ CS50.h, includ stdio.h, int void main. Și apoi în interiorul de aici, vreau pentru a avea mai întâi o int numita vârstă. Și am de gând să utilizeze că pentru a obține o int de utilizator pentru vârsta lui sau a ei. Dar acest program este menit să fie folosit de mai multe persoane, indiferent de context. Am o linie de oameni. Toate acestea trebuie să tastați lor vârstă pentru unii, poate, nu știu, concurență, sau eveniment care au ajuns pentru. Deci, următoarea persoană, am au nevoie de o altă variabilă. Pentru că dacă am face vârstă se getint, asta e O să atace, sau pentru a suprascrie vârsta persoanei precedent. Așa că nu e bine. Deci, primul meu instinct ar putea fi, oh, bine, dacă doriți să obțineți mai multe persoane de ages-- să numim această age1, int age2 se int, int age3 se getint. Și acum am de gând să utilizeze un cod pseudocod aici. Fă ceva cu acele numere. Vom pleca pentru o altă zi ce facem acolo, pentru că noi doar de îngrijire pentru moment despre age1, age2, age3. Din păcate, o dată ce am compila acest program și-l pune in fata utilizatorilor reale, ce-i de design fundamental slab decizie pare să fi făcut? Da? Audiența: [inaudibil] David J. MALAN: Da, Nici n-am încercat să ne dăm seama cât de multe ere mi-ar păsa de fapt, despre? Dacă am mai mult de trei persoane aici, și, prin urmare, mai puțin de trei vârste, Sunt încă orbește așteaptă trei. Doamne ferește patru oameni arată în sus. Programul meu pur si simplu nu le va mai suporta. Și astfel aceasta, poveste lunga scurt, nu este un obicei bun. Corect? Am fost, în esență, copierea și lipirea de cod și doar tweaking nume de variabile. Și, Doamne, dacă ai avea, nu trei vârstele, dar 10, sau 100, sau chiar 6500 studenti, de exemplu. Acest lucru nu va fi deosebit de Codul elegant, sau durabilă. Ai de gând să aibă de a rescrie programul de fiecare dată numărul dvs. de persoane modificări. Deci, din fericire, în actuala noastră fișier ages.c pentru azi, avem o soluție mai inteligent. În primul rând, am de gând să împrumute construi am folosit de câteva ori, acest face în timp ce bucla, în scopul de a obține numărul de persoane în cameră. Mă duc să hartuiti utilizator, din nou și din nou, până când el sau ea mi-a dat o valoare de n care este un număr întreg pozitiv. Am fi putut folosi, ultima timp ne int pozitiv. Dar noi nu avem asta pe bune, asa ca am mers mai departe și re pus în aplicare această idee. Acum aici, acesta este noul truc. In linia 27, ca observațiile în linia 26 sugerează, declara o matrice în care pentru a stoca vârstă tuturor. Deci, dacă doriți să obțineți, nu un int, nu două int, dar o grămadă de int. Mai exact n numere întregi, s-au n-ar putea fi trei, s-ar putea fi de 100, ar putea fi 1000. Sintaxa, pur și simplu, este de a să zicem, ce tip de date vrei? Ce vrei să apelați că bucata de memorie? Ce vrei să sun la rețeaua de care arata ca acest pictural? Și în paranteze aici, voi spune cât de mare doriți matrice să fie. Și așa mai devreme, atunci când i-am spus Sintaxa este un pic diferit aici, suntem încă utilizați paranteze pătrate, dar când am declarare a unui tablou, numărul interiorul paranteze pătrate mijloace cat de mare vrei matrice să fie. Prin contrast, atunci când am fost cu ajutorul lui suport i acum o clipă, s, un șir de caractere, este într-adevăr o serie de caractere, dar atunci când nu se declară o variabilă, ca cu acest cuvânt cheie aici, Ești pur și simplu obținerea un indice specific, un anumit elementul de care matrice. Odată ce știm că, restul în acest sens este simplă. Dacă noi am primul gând a imprima Care este vârsta de numărul de persoane i. În cazul în care eu spun doar numărul persoană unul, persoană numărul doi, persoană număr de trei. Și eu fac doar aritmetică, astfel încât oamenii normali, cum ar fi, am număra de la unu pentru această Program, și nu de la zero. Apoi eu numesc getint, dar eu stoca răspunsul în vârstă bracketing i. Care este varsta i'th în matrice. Deci, în timp ce ultima dată când am fost tratarea aceste cutii ar fi caractere pentru nume Zamyla lui, și altele. Acum, aceste cutii reprezintă 32 de biți, sau patru bytes în care putem stoca un int, int, int. Toate acestea, din nou, sunt de același tip de date. Acum, eu fac ceva stupid, ca trece timpul, doar pentru a justifica scris acest program. Și apoi aici, am repeta din nou peste matrice spune un an de acum, Numărul de persoane o voință fi ceva de ani vechime. Și să ne dăm seama că math-- Vreau să spun, acest nu este foarte complicat arithmetic-- Am adăuga unul la vârsta lor. Doar pentru a demonstra, din nou, acest lucru. Așa cum am putea index într-un șir, s, Pot sa indice într-o serie de vârste, așa acolo. Deci, în cazul în care se întâmplă acest lucru pentru a lua noi? Deci, vom vedea, în cele din urmă, o câteva lucruri în zilele care vin. Unul, în tot acest timp, când scris propriile programe, cum ar fi Mario, lacom, credit. Ai fost să tastați numele de programul și apăsarea Enter. Și apoi obtinerea de intrare a utilizatorului. Cu getString, getint, getLongLong, sau altele asemenea. Dar se pare ca C suporturi ceva numit linie de comandă argumente, care este de gând să ne lase ajunge de fapt la cuvintele pe care le tastați, la prompt clipește, după numele programului dumneavoastră. Deci, în zilele următoare, voi s-ar putea introduce ceva de genul Caesar, sau ./caesar numărul 13, după aceea. Vom vedea cum merge. Pentru că, într-adevăr, în problema stabilit două, suntem O să vi-l prezint la ceva amintind de-al lui Ralphie provocare mai devreme de cartografie. Arta de codare informații. Acest lucru, de fapt, este foarte amintind de ceea ce a făcut Ralphie. Acesta este un exemplu de criptare algoritm numit rot13, R-O-T 13. Ceea ce înseamnă pur și simplu rotiți litere din alfabetul de 13 de locuri. Și dacă faci asta, veți vedea acum ceea ce este, probabil, o expresie familiar. Dar modul în care vom utiliza aceasta, în cele din urmă, este mai general. În P stabilit două, în ediția standard, va pune în aplicare o serie de cifre, unul numit Cezar, unul numit Vigenere. Ambele sunt rotație cifruri, în care într-un fel te transforma o literă într-o scrisoare diferit. Și Cezar este super simplu. Adăugați unul, adăugați 13, sau un numar de pana la 26. Vigenere face că pe o scrisoare pe bază. Deci Vigenere, după cum veți vedea în spec, este mai sigur. Dar, la sfârșitul zilei ce veți fi punerea în aplicare și P stabilit două, este cheia care va folosi atât pentru criptare și decriptare. Referindu-se la procesul de transformare text simplu, unele mesajului original, în text Cypher, care este ceva criptat. Și apoi decriptarea din nou. În ediția hacker, între timp, vei însărcinat cu ceva similar în spirit, unde vă vom oferi un fișier, de la un Linux tipic, sau Mac, Unix sau calculator numit Etsy parolă, care conține un întreg grămadă de nume de utilizator și parole. Și aceste parole au toate fost criptate, sau distribuit, ca să spunem așa, mai corect după cum veți vedea în spec. Și ediția hacker va contesta tu cu a lua o intrare ca aceasta, și cracare parola. Asta este, imaginind ce parola uman a fost de fapt. Pentru că, într-adevăr, parolele sunt în general nu este stocat în clar, și, în general, parole ar trebui să fie greu de ghicit. Asta nu e adesea cazul. Și ceea ce am crezut ca vom face este încheie cu câteva minute privire la o deosebit de alegere proastă de parole de la un film pe care s-ar putea aminti cu drag. Și dacă nu, ar trebui să chirie. [VIDEO PLAYBACK] -Helmet, Tu demon, ce se întâmplă? Ce faci cu fiica mea? -Permit-Mi să introducă chirurg genial plastic tineri, Doctorul Phillip Schlotkin. Cel mai mare nas Omul de locuri de muncă în întregul univers și Beverly Hills. Alteța tău. De locuri de muncă -Nose? Nu înțeleg. A avut deja un loc de muncă nas. A fost o dulce 16 prezent. Nu, nu e ceea ce crezi. Este mult, mult mai rau. Dacă nu-mi dai combinație a scutului de aer, Medicul Schlotkin va da dvs. fiica înapoi vechea ei nas. - [Gasps] Nooooooooooooo. De unde ai luat asta? În regulã. Voi spune, voi spune. Nu, tati, nu. Nu trebuie. Ai dreptate draga mea. Voi lipsi noul nas. Dar eu nu-i va spune combinație, indiferent de ce. Foarte bine. Doctor Schlotkin, face cel mai rău dumneavoastră. Cu placere. Nu! Stai, stai. Voi spune. Voi spune. -Am Stiut ca va functiona. Bine, dă-mi. -Contravaloarea Combinație este una. Unu. Unu. Doi. Doi. Doi. Trei. Trei. Trei. Patru. Patru. Patru. Cinci. Cinci. Cinci. Deci este: unu, doi, trei, patru, cinci. Asta e cel mai stupid combinația Am auzit-o în viața mea. Asta e genul de lucru o idiot ar avea asupra bagajele sale. -Multumesc, Înălțimea voastră. [REMOTE clicks] Ce ai făcut? -Am Oprit pe perete. Nu, n-ai făcut, tu oprit tot filmul. Probabil -Am apăsat pe butonul greșit. Ei bine, pune-l inapoi! Pune filmul înapoi pe! Da, domnule! Da, d-le. Să mergem, Arnold. Vino, Gretchen. Desigur, știi că voi Trebuie să te factura pentru acest lucru. Ei bine? A funcționat? Unde e regele? -E Lucrat, domnule, ne-am au combinația. Minunat. Acum putem lua fiecare ultima suflare de aer proaspăt de pe planeta Druidia. Care e combinația? Unu, doi, trei, patru, cinci. Unu, doi, trei, patru, cinci? Da. Asta e uimitor. Am la fel combinație pe bagajele mele. Pregătiți Spaceball 1 pentru plecare imediat. Da, d-le. -și Schimba combinație pe bagajele mele. [Usa de inchidere SOUND] [Clinchet de usi lovind HELMET] -Ahh. [END VIDEO PLAYBACK] David J. MALAN: Asta e pentru CS50, ne vedem săptămâna viitoare. Narator: Și acum, Deep Gânduri, de Daven Farnham. Daven FARNHAM: codificare în C este atât de mult mai greu decât zero. printf, Scratch a fost o minciună. [Râsete soundbite]