>> SPEAKER 1: În regulă.
Bine ai venit înapoi.
Acest lucru este de două săptămâni de CS50, și ne-am pana acum a fost cu funcții, dar
în mare parte luate le pentru a acordat.
Am folosit printf care are efect secundar de imprimare
lucrurile de pe ecran.
Ne-am folosit să-Int, să plutească.
>> Dar ce se întâmplă dacă de fapt, doriți să creați propriile funcții, ca o parte din
s-ar putea au început deja să face pentru Set singură problemă, deși
nu strict necesare?
Ei bine, să mergem mai departe și revizita că Problema de a cere doar utilizatorului pentru
numele și tipărirea lor ceva pe ecran, dar încercați să factor în unele
de comun pe care ne-am văzut în codul nostru de până acum.
Deci, prin care vreau să spun următoarele.
>> Am de gând să merg mai departe și de a crea un nou program, suna doar
o hello.c ca de obicei.
Am de gând să merg mai departe și să nu-mi includ io.h standard, în partea de sus.
Am de gând să dea, de asemenea, mă preventiv biblioteca CS50, astfel încât
Eu nu te strigat la de compilator.
Și acum am de gând să merg mai departe și declare Int, principala, gol.
>> Și apoi aici, acesta este locul unde vreau pentru a începe să externalizeze funcționalitate a
o alta functie pe care eu însumi am de gând să scrie, dar care nu
există în prezent.
De exemplu, să presupunem că am vrut să scrie o funcție care îmi permite să
imprima Bună ziua, virgulă, și apoi numele unui utilizator.
Mai degraba decat de a continua să facă printf Bună ziua,% s, nu ar fi frumos dacă
au fost doar o funcție numită Nu printf dar numele de imprimare?
>> Deci, cu alte cuvinte, doresc să fie în măsură să scrie un program care face un pic
ceva de genul asta.
În primul rând, am de gând să spun printf dvs. nume, determinând astfel posibilitatea de a
da-mi numele lui sau a ei, și apoi eu sunt de gând să utilizeze s șir familiare
declara un șir.
Dă-mi o variabila de tip string, numim e, și magazin în care
Rezultatul apel obține șir.
Dar acum, în ultimele săptămâni, mi-ar fi oarecum plictisitor făcut Bună ziua,% s / n.
>> Și în alte cuvinte, am văzut acest lucru exemplu o grămadă de ori, și este un
exemplu banal pentru că există doar un singur linie de cod asa ca nu e chiar o
mare pentru a păstra tastați din nou.
Dar să presupunem că această linie de cod de fapt, au devenit o povară, și
nu este o linie de cod, dar e 10 de linii de cod câteva săptămâni de acum,
si tu esti doar obosit de copiere și lipire sau
rescrie același cod.
Nu ar fi frumos loc de a face printf Bună ziua,% s și așa mai departe,
Nu ar fi frumos dacă ar exista doar o funcție numită nume imprimare
ia un argument -
cu alte cuvinte, este nevoie de intrare -
și apoi punct și virgulă.
Astfel că funcția, nu-i așa Ar fi frumos dacă a existat?
Atunci nu ar trebui să vă faceți griji cu privire la ceea ce printf este, ceea ce% s și toate
aceste complexe care sunt Nu tot ceea ce interesant.
Ele sunt utile.
>> Deci numele de imprimare, din păcate, nu a fost inventat ceva acum 40 de ani, plus.
Nimeni nu sa gândit să-l scrie.
Dar asta e frumusetea de a avea un limbaj de programare, la fel ca în
Scratch puteți defini blocuri personalizate, astfel în C, și cele mai multe orice limbă, nu-i asa
defini propria funcționalitate, pot ați defini propriile funcții.
Deci, chiar dacă ajungem principal de în mod automat pentru gratuit, putem declara
propriile funcții.
>> Așa că am de gând să facă unele cameră aici sus sus, și am de gând să declare meu
funcție proprie, care va arata o pic ciudat la început, dar vom veni
înapoi la acest lucru înainte de timp.
Am de gând să spun nule, astfel indicând această funcție nu
ceva, are un efect secundar, dar nu se întoarce ceva la mine în
același mod în care se Int sau obține șir în sine nu.
Și am de gând să dea această funcție o Numele cu majuscule, și am de gând să
precizează că acest tip va avea un șir, și am de gând pentru a apela că
Numele șir.
Am putea spune orice vreau, dar am Vreau codul meu de a fi auto-documentarea.
Cu alte cuvinte, dacă unul din voi ar fi să deschide acest fișier și a citit-o, ai putea
un fel de deduce din numele de care intrare ce rol ar trebui să joace.
>> Și acum de mai jos, care, am de gând să deschidă cret bretele și închisă cret bretele,
și așa observa l-am urmat aceeași model pe liniile patru prin intermediul a șapte ca
I-am urmărit de o săptămână bună, plus acum între, să zicem, linii nouă și
14 care compun principal.
Cu alte cuvinte, imprima numele este o altă funcție.
Acum, compilatorul nu are de gând să știu pentru a apela acest lucru în mod automat
pentru că am literalmente doar inventat, dar se va ști în continuare pentru a apela principal
automat, și apoi, desigur, în linia 13, Fac apel propria mea funcție.
Și pentru că eu am declarat că funcția pe linie de patru înainte principală,
acest lucru se întâmplă pentru a preda compilator ceea ce citez, citatul, "numele de imprimare"
înseamnă și ce ar trebui să facă.
Deci, eu sunt un fel de a da un nou personalizat bloca în contextul, spun, Scratch.
>> Deci, aici, eu pot pune ca foarte frecvente sau model recurent de cod țin
scris în clasă, printf % S salut,% s / n ", -
ceea ce vreau să pun aici?
S?
Deci, vreau să pun numele în acest context.
Deci, observa un pic de o dihotomie aici.
Pentru că am declara propria funcție și am oarecum arbitrar numit
imprima numele, și pentru că am specificat în paranteze că această
Funcția ia un argument, tipul de care este un șir - deci este un cuvânt
sau frază sau ceva de genul asta - și Am sunat ca numele argument, că
înseamnă singura variabilă care este în domeniul de aplicare, ca să spunem așa, este numele.
>> S există doar între ceea ce doi acolade, desigur?
Ei bine, într-adevăr, la fel ca și linia 10, prin 14, astfel încât la fel ca luni nu se poate folosi
S, dar ce pot face este să treacă S în numele imprimare.
Imprima numele doar așa se întâmplă să-l dea un alias, un sinonim, un pseudonim,
numindu-l nume, și acum folosind-o în această linie.
Deci, acum lasă-mă salva, zoom out.
>> Lasă-mă să merg mai departe și să salut.
Arată bine.
Nu scuipa orice erori. . / Bună Enter.
Care e numele meu?
David.
Și salut David.
Deci, nu tot ceea ce interesant, dar gândește-te acum.
Aveți acum că același ingredient așa cum am făcut la zero pentru a
face propriile funcții.
>> Dar există un pic de prins.
Să presupunem că nu m-am gândit cu adevărat acest lucru prin intermediul și eu de fapt fără
Chiar mă gândesc la asta scris că funcția de aici.
Se simte perfect rezonabil.
În Scratch nu exista notiunea de locația în script-urile dumneavoastră.
Ai putea pune unul aici, unul aici, unul aici, și-ar putea începe
să se uite un pic murdar, dacă nu pune-l frumos, dar nu
indiferent de locul unde fizic script au fost pe ecran.
Din păcate, în C - și acest lucru este, spre deosebire de limbaje cum ar fi Java și Python
și alții care s-ar putea să fie familiarizat cu - Din păcate, în C, pentru a nu
contează, pentru că Uita-te la ceea ce este o să se întâmple acum.
>> Funcția implicită care se va a executa este, desigur, principal.
Principal se va chema numele de imprimare pe linie opt, dar, din păcate,
compilatorul nu va ști chiar că numele de imprimare există până când ajunge la linia de 11,
care, din păcate, este Va fi prea târziu.
Deci, hai sa facem să salut.
Și acum, la naiba, două erori generate.
Deci, acum lasă-mă să derulați până la foarte în primul rând, așa cum ar trebui să facem mereu, și
observă că se tipa la mine, "Declarație implicită a funcției
imprima numele. "
>> Deci, am văzut acest mesaj înainte, Declarația implicită a funcției.
Când am văzut că un fel de eroare?
Când nu am includ o bibliotecă.
Dacă am uitat cs50.h și mi-ar lua tipat la pentru a obține șir sau să Int.
Dar, în acest caz, această funcție de imprimare Numele nu este într-o bibliotecă, nu?
Este literalmente în acest dosar, astfel ceea ce este cu adevarat problema?
>> Ei bine, din păcate, în C, este nevoie de tine atât de incredibil de literalmente că, dacă
Vreau o funcție numită nume de imprimare a exista, fie trebuie să pună în aplicare
care funcționează la foarte de sus a dvs. cod, astfel încât este accesibil pentru a scădea
funcții, dar sincer, care devine neglijent foarte repede.
Personal, îmi place să pun primul principal deoarece atunci este foarte clar ce aceasta
Programul are la prima vedere.
Și în plus, puteți obține în colț ciudat cazurile în care, dacă x vrea să cheme
Y dar y s-ar putea numi x, tu doar punct de vedere fizic nu se poate pune de fapt, un
deasupra celeilalte.
>> Dar se pare că în C, putem rezolva acest lucru foarte simplu.
Am de gând să pună un pic de spațiu aici, iar eu sunt doar de gând să
preventiv, deși oarecum redundant, urmează să o predea
compilator că există o funcție pus numele de imprimare, este nevoie de un șir,
și am de gând pentru a apela numele acesta virgulă.
>> Deci, acest lucru acum, în linie cu patru, pe care noi nu s-au văzut înainte, este o declarație
a unui nume de imprimare funcție, dar este doar o promisiune că această funcție va
în cele din urmă să fie definite, în cele din urmă să fie puse în aplicare.
Acest lucru acum pot lăsa în pace pentru că acum aceasta este definiția,
implementarea, un fel de ultima milă a punerii în aplicare a acestei
anumită funcție.
Deci, sincer, e stupid, e enervant, dar aceasta este calea C este, și e
pentru că ai nevoie de foarte literal și, ca un calculator sincer ar trebui,
doar nu exact ceea ce se spune la face, și astfel încât comanda este important.
>> Astfel încât să păstreze în minte și, din nou, începe să observa recurența modele.
Cote sunt vreți, dacă nu aveți deja, începe sa se confrunte cu mesaje
ca asta, care la prima vedere par a fi totul criptic, dar dacă începi
pentru a căuta aceste cuvinte cheie cum ar fi "Declarație implicit," menționează de o
Funcția în acest caz - și, sincer, tu uneori obține chiar și un pic de verde
simbol morcov care vă spune unde problema este, probabil -
puteți începe să lucreze drum prin încă mesaje de eroare nevăzute.
Orice întrebări cu privire la scris dvs. Funcția propriu în acest fel?
>> Să facem ceva care este un puțin mai convingătoare.
Mai degrabă decât face doar ceva care are un efect secundar de imprimare, dă-mi drumul
înainte și de a salva un fișier nou, și vom numesc acest positive.c, chiar dacă este
va fi un pic diferit față de ultima dată.
Și de data asta, vreau să re-pune în aplicare exemplu ultima dată de positive.C, care
este forța utilizatorul să dea mi un număr întreg pozitiv.
Dar am avut de a folosi obține Int ultima oară.
Nu ar fi fost frumos dacă ar exista o funcție numită obține Int pozitiv
că am putea externaliza doar acest bucată de funcționalitate a?
Deci, diferența aici este că voi punerea în aplicare a obține Int pozitiv, dar spre deosebire de
Numele de imprimare care a avut un efect secundar - aceasta nu sa întors ceva de la mine ca
un număr sau un șir de caractere -
se Int pozitiv este, desigur, merge la întoarcă, sperăm, un Int pozitiv.
>> Deci, hai sa facem acest lucru.
Includ cs50.h, Include standard de io.h.
Int main.
Și acum aici, am de gând să merg mai departe și să spunem Int, numim n, este egal
obține Int pozitiv.
Și, la fel ca și obține Int există deja pentru că personalul a scris-o, am de gând
să-și asume în momentul în care se există Int pozitiv, iar acum am de gând
pentru a merge mai departe și spune printf, mulțumiri pentru% i / n ", n.
>> Deci, acum, dacă am compila acest program, ceea ce se va întâmpla în terminalul meu
fereastră în partea de jos a ecranului?
Am de gând pentru a obține, probabil, că aceeași eroare ca și mai înainte.
Așa că hai să încercăm.
Face pozitiv.
Și din nou, declarația implicită funcției, se Int pozitiv.
Astfel încât să putem rezolva acest lucru în un cuplu de moduri.
Am de gând să-l păstrați simplu și doar pune declarația mea aici și de a lua
Int pozitiv.
Am nevoie așa-numitul semnătură.
Semnătura doar se referă la estetica
prima linie a programului.
Deci, ce ar trebui sa pozitiv Int schimb?
>> Deci, un int.
Vreau să spun în mod ideal, ar reveni ceva de genul Int pozitiv, dar că
nu exista.
Noi nu am văzut că între datele noastre tipuri, așa că avem de a face cu
Faptul că avem foarte puține tipurile de date pentru a lucra cu.
Dar ne putem întoarce un int și doar încredere că acesta va fi pozitiv.
Acesta va fi numit obține Int pozitiv.
>> Și acum ce despre argumentele sale?
Nu-l ia nici o intrare?
Are nevoie de nici o introducere?
Deci, nu are nevoie să știe în orice avans.
Ia string nu, se Int nu.
Printf nu - aceasta trebuie să aibă o anumită de intrare a trecut în ea - și numele de imprimare
nevoie de unele de intrare, dar se Int pozitiv nu.
Așa că am de gând să în mod explicit spune vidul compilator.
Vidul este lipsa de orice altceva.
Deci, înseamnă gol nimic nu se întâmplă în interiorul de aceste paranteze, punct și virgulă.
>> Și acum în partea de jos a fișierului mea - și din nou, Sunt doar un fel de anal
aici, punerea principal în partea de sus, care este o bună practică, deoarece în acest fel,
oricând sau altcineva deschide fișierul,
funcționalitate este chiar acolo.
Puteți arunca cu capul de la un pătrat.
Așa că acum am de gând să duplicat acest lucru, obține vid Int pozitiv, dar eu nu sunt
va lovi un punct și virgulă acum.
Am de gând să deschidă acolade, și acum am nevoie să împrumute
unele idei de luni.
>> Deci, după cum vă amintiți, am făcut ceva ca face următoarele în timp ce
ceva a fost adevărat.
Și ce-am făcut?
Am făcut ceva de genul da mi un întreg pozitiv,
pic de un prompt.
Aș putea folosi cuvinte vreau.
Și apoi am folosit ce?
Int n egal obține Int, nici argumente pentru aceasta.
>> Si observa diferenta.
Atunci când apelați o funcție, atunci când utilizați o funcție, nu pun în vid.
Tu faci doar că, atunci când declară un Funcția, de predare compilatorul ce
ea trebuie să se aștepte.
Deci, nu aveți nevoie pentru a pune anula acolo singur.
>> Și acum, ce a fost starea mea?
Ei bine, n nu este egal cu pozitiv, dar asta e doar pseudo-cod.
Deci, cum pot exprima acest lucru mai curat?
Deci mai mică sau egală cu zero.
Deci, din nou, observa poți să faci mai mică sau egală cu.
Chiar daca este de două separate, simboluri, o puteti face pe
tastatură ca atare.
>> Dar există încă un bug care Am greșit ultima dată prea.
Trebuie să declar -
exact.
Trebuie să declare n afara a buclei.
Așa că am nevoie pentru a pune n până aici, iar eu nu fac Vreau să-l re-declare aici
ca nu cumva să obțineți o nouă variabilă.
Vreau doar sa atribui o valoare de aici.
>> Și acum nu mai sunt destul de terminat aici.
Permiteți-mi merge mai departe de mine și mă prefac că sunt terminat.
Face pozitiv, iar acum există o nouă eroare.
Controlul ajunge la final de Funcția non-gol.
Deci nou mesaj de eroare, dar dacă ai un fel a tachineze pe langa fiecare dintre cuvinte,
probabil aluzie la ceea ce sa întâmplat.
>> Controla.
Mijloace de control doar la comanda de operațiuni într-un program.
Computerul este în control și ceva a mers prost.
Deci, se ajunge la sfârșitul o funcție non-gol.
Ce funcție este aparent referindu-se la?
Ce funcție este non-gol?
Asa ca Int pozitiv, și un pic confuz în bine,
E un fel de gol.
Ea are o specificație de gol pentru ei argumente, dar producția sa este de gând să
fi de tip n.
Deci, cuvântul de pe stânga este așa-numita tip întoarcere.
Cuvântul pe interior este aici de zero sau mai multe argumente
ca o funcție reușește.
>> Deci, ce trebuie să fac?
În acest moment, în codul meu, linia 21 care promptă clipește este acum, am
au un Int pozitiv în interiorul a variabilă numită n.
Cum pot să-l dau înapoi la principal?
Literalmente.
Reveni n punct și virgulă.
>> Deci, doar ca Colton a returnat o bucată de hârtie cu un răspuns la mine prin cădere
că bucata de hârtie în Little Black cutie pe masă, pentru a face acest lucru în
cod, vă literalmente doar scrie, întoarce n, și e ca și cum Colton au fost
predarea-mi ceva înapoi fizice.
În acest caz, ceea ce se întâmplă este de a obține Int pozitiv este de gând să dea înapoi
ceea ce este probabil pozitiv întreg pentru cine?
În cazul în care nu că valoarea ajung?
Care se termină în această variabilă, n, și apoi vom continua cu linie nouă.
>> Deci, cu alte cuvinte, în ordinea operațiuni, acest program pornește
executare, iar compilatorul realizează, oh, vrei biblioteca?
Lasă-mă să-mi iau ce e în asta.
Oh, vrei biblioteca standard IO?
Lasă-mă să-mi iau ce e în asta.
Ce compilator spune să se când va atinge linia de patru?
Oh, ai promis să pună în aplicare Funcția numit obține pozitiv, dar
vom reveni la asta mai târziu, ceva de-a lungul acestor linii.
>> Void main Int înseamnă doar aici e curajul de programul meu.
Linie șapte este doar o bretele buclat.
Linie opt se spune pe partea stângă, da mi 32 de biți pentru un întreg, suna-l n.
Pe partea dreapta, este spunând obține Int pozitiv.
Acum pauză Să povestea asta, deoarece acum Nu țin deplasarea cursorului mea jos.
Cursor mea acum merge aici pentru că acum obține Int pozitiv execută.
Int n este declarat.
Procedați în felul următor.
Printf îmi dă un număr întreg pozitiv.
>> Obțineți un int de la utilizator, păstrați-l în N, și poate face acest lucru din nou și din nou.
Această buclă înseamnă că acest cod ar putea executa în sus și în jos ca acest lucru din nou
și din nou, dar atunci când utilizatorul final cooperează și dă-mi o pozitiv
Int, I, a lovit linia 21, moment în care Numărul este dat înapoi, și care unul
ar trebui să evidențieze acum?
Nouă.
De control, ca să spunem așa, se întoarce la linia de nouă.
Asta e linia care e acum la conducere.
>> Deci, asta e ceea ce sa întâmplat totul acest timp sub capota, dar
când ne-am folosit funcții ca printf sau chiar a obține șir ca altcineva
a scris pentru tine, de control a fost înmânată off-line a altcuiva codul
de linie cu linie.
Este pur și simplu nu am putut să-l văd și am ar putea să nu-l descrie cu adevărat în acest
program, deoarece se află într-un alt fișier de pe hard disk
fără știrea noastră.
Deci, haideți să compileze de fapt și a alerga acest lucru acum.
>> Face pozitiv.
Compila, care este progresul.
. / Pozitiv.
Dă-mi un număr întreg pozitiv.
Să fi dificil.
Negativă 1.
Zero.
Să-i dăm 50.
Multumesc pentru 50 de ani, și astfel de control a revenit acum.
Orice întrebări, apoi, pe care?
Da?
>> [Inaudibil].
>> Spun din nou.
Oh, bună întrebare.
Deci, s-ar putea observa o paralelă aici care Sunt un fel de tăiere un colț pe.
În linia 12, vreau să spun, se Int pozitiv returnează un int, dar de aceeași
logică, acum logic că, în linia de șase, eu spun că se întoarce principale
un int, dar ceea ce avem nu avut în oricare dintre programele noastre?
Nu am avut niciodată mențiune de acest retur cuvânt cheie.
>> Deci, se dovedește că, în C, cel puțin versiune a acestuia pe care le utilizați
făcut în 1999, punct de vedere tehnic, acest lucru este întâmplă pentru tine în mod automat.
Ori de câte ori vă pună în aplicare un program și pună în aplicare o funcție numită principală,
că funcția va reveni la zero de implicit, dacă nu spun altfel,
si zero este doar o convenție.
Lumea revine la zero, prin urmare, indicând faptul că totul este bine,
lăsându-ne în mod eficient cu patru miliarde posibile lucruri care ar putea merge
greșit, astfel că, dacă ne întoarcem unul, care ar putea însemna un cod care înseamnă
ceva a mers prost.
Am putea întoarce doi, ceea ce înseamnă acest alt lucru nu a mers bine.
Am putea întoarce patru miliarde, care înseamnă alt lucru a mers prost.
>> Și dacă vă gândiți acum la propriul PC sau Mac, s-ar putea aminti că
uneori, veți obține mesaje de eroare criptic de la software-ul care esti
folosind, și, uneori, ea are un om Descrierea prietenos, dar nu e
adesea un cod sau un număr pe ecran?
Dacă acest lucru nu vine în minte, doar ține un ochi pentru ea.
Asta e ceea ce de obicei aceste Codurile se referă la.
Sunt incluse în Microsoft Word și alte programe, astfel încât, dacă depune o
raport de problemă cu compania, puteți spune-le, oh, am luat numarul de eroare 45.
Și unele înapoi programator in cadrul companiei pot uita că în lui sau a ei
cod și spune, oh, asta pentru că am făcut această problemă și de aceea utilizatorul
primit acest mesaj.
>> Dar sincer, e doar un pic distrage atenția și un pic plictisitor pentru
concluzia că, cel puțin pe noastre primele programe, așa că am
a fost o omițând.
Dar tot acest timp fiecare dintre dumneavoastră Funcțiile principale a avut acest secret
linie adăugat în mod automat pentru tine de compilator, doar prin convenție pentru
economisi ceva timp.
>> [Inaudibil].
>> Nu aveți nevoie să-l includă în principal.
Asta e bine.
Aveți nevoie să-l includă, dacă ați fost de punere în aplicare o funcție ca asta.
În caz contrar, plat funcția de nu ar funcționa.
Dar, în principal, nu este necesar.
Într-o săptămână sau două, vom începe să obtinerea în care obicei odată ce vrem să pornim
semnificând erori.
Întrebare foarte bună.
>> Pauza verbal atât de rapid pentru a menționa că vineri, nu va fi prânzul
per se, dar vom avea cina cu unii dintre studenți și personal.
Dacă doriți să vă alăturați nouă, se simt liber pentru a merge la cs50.net/rsvp.
06:00 vineri.
Spațiul este, ca întotdeauna, limitate, dar vom continue să facă aceste pe o aproape
săptămânal în cazul în spațiu se execută în această săptămână.
>> Deci Cliffhanger că ne-am oprit pe Luni a fost că siruri de caractere poate de fapt,
fie indexate în, ceea ce tocmai tu ce înseamnă se pot obține de la primul caracter,
caracter al doilea, al treilea caracter și așa mai departe, pentru că puteți
cred că în mod efectiv de un șir, cum ar fi Bună ziua, ca fiind, în acest caz, cinci
scrisori în interiorul de cutii.
Și puteți obține de la fiecare dintre cei cutii cu ceea ce sintaxa facut noi
introducerea pe luni?
Aceste paranteze pătrate de pe tastatură.
Asta a însemnat doar du-te la locație la zero.
>> Vom începe numărarea de la zero, astfel suport la zero semnifică h, suport unul
semnifică e, și așa mai departe.
Și așa tot timpul când am fost folosind siruri de caractere și să tastați în "Bună ziua"
și "lumea" și alte lucruri pe pe ecran, acesta a fost depozitat
în cutii de acest gen.
Și să ia o presupunere.
Ce fiecare cutie reprezintă punct de vedere fizic în interiorul computerului?
>> [Inaudibil].
>> Îmi pare rău?
>> Caractere.
>> Deci, un personaj, cu siguranță, în cazul de siruri de caractere, și un caracter este doar
opt biti sau un octet.
Deci, probabil, cel puțin vag familiarizat cu faptul că dumneavoastră
computerul are memorie.
Acesta are două tipuri de memorie, cel puțin.
Una este hard disk-ul în cazul în care salvați chestii permanent, și că este
de obicei, de mare astfel încât să puteți avea filme și muzică și așa mai departe.
>> Apoi, aveți un alt tip de memorie numit RAM, R-A-M, Random Access
Memorie, iar acest lucru este tipul de memorie care este utilizat atunci când computerul este
de funcționare, dar dacă vă veți pierde puterea sau dvs. moare bateria, ceva care este stocat
în RAM dispare dacă pierzi puterea totul pentru că nu este
persistente.
Ai au de obicei, în aceste zile, un gig de ea, două concerte, poate mai mult.
Și capul de RAM este faptul că este mult mult, mult mai rapid decât hard disk-uri
sau chiar Solid State Drives în aceste zile, dar este de obicei mai scumpe, astfel încât
aveți mai puțin de ea.
>> Deci, conversația de astăzi se referă într-adevăr în RAM, acel tip de memorie care
există doar în timp ce există putere fiind introduse în computer.
Deci, atunci când tastați în H-E-L-L-O, Intră pe tastatura, H se întâmplă într-un singur
octet de RAM, E se întâmplă în un alt octet de RAM, astfel cum este
restul cuvântului.
Deci amintesc ce am putut de a face ultima dată a fost aceasta.
Lasă-mă să merg mai departe și deschide fișierul pe care am numit string.c, și aminti
că părea un pic ceva de genul asta.
Permiteți-mi, de fapt rostogolească înapoi și schimba l la exact ceea ce arata ca,
Lungimea șir de s.
>> Deci, uita-te la programul de aici.
Am includ biblioteca CS50, astfel pe care le putem folosi obține șir.
Am includ standard de io.h astfel încât să putem folosi printf.
De ce am includ string.h?
Acest lucru a fost noua luni.
Așa că am vrut lungimea șirului de caractere.
Str Leng.
Oamenii au decis ani în urmă, Să fie doar succint.
În loc de a numindu-l "lungimea șirului de caractere", hai sa "str. Leng" apel și lăsați
Figura lumea asta, și astfel încât este ceea ce am avea acces la cu string.h.
>> Acest lucru este familiar.
Acest lucru este familiar.
Acesta este un mic nou.
In linia 22 - și ne vom întoarce la acest lucru, dar acum știu -
și v-ar ști numai acest din care au citiți documentația sau în cazul în care
știai deja C -
obține șir, uneori, se poate strica.
În cazul în care utilizatorul este foarte contradictorie sau necooperant și el sau ea doar
nu tastați nimic de la tastatura sau Tipuri de atât de mult de la tastatură care
l copleșește memoria calculatorului, în teorie, se string ar putea reveni
altceva decât o șir de caractere.
Aceasta ar putea reveni o valoare specială numită NULL în toate capacele, N-U-L-L, și acest lucru este
doar o așa-numita valoare santinelă.
Este o valoare deosebită, care semnifică ceva rău sa întâmplat în acest caz.
Este absența unui șir.
>> Deci null am verificare pentru pur și simplu, astfel încât, Pe scurt, Str Leng și
alte funcții care vin cu C, dacă se așteaptă la un șir, dar le trece
lipsa unui șir, dacă treci le NULL, calculatorul sau programul
se va prăbuși doar pur și simplu.
Se va închide.
Acesta va arunca unele mesaj de eroare.
Lucruri rele se va întâmpla.
Deci, chiar dacă aceasta este încă nu bine definite -
acest lucru va face mai mult sens într-o săptămână sau două - în linia 22, aceasta este doar o
exemplu de autocontrol eroare defensivă doar în cazul în care o singură dată din
un ceva milion merge bine, la Cel programul meu nu se va prăbuși.
>> Deci, daca s nu este egal cu ceva rău, Am acest lucru pentru bucla, și acest lucru a fost
unde am avut ca alte noua piesa de sintaxă.
Am o buclă pentru iterarea la zero până la lungimea de s..
Și apoi aici, am fost un imprimarea s suport eu, dar de ce am folosi% c toate
Dintr-o dată în loc de% s chiar deși s este un șir?
Este un personaj, nu?
S este un șir de caractere, dar e ceva suport, s suport i unde i este zero
sau una sau două, care este un individ caracter în șir, și așa pentru
care, trebuie printf să fie informat că este într-adevăr un personaj să se aștepte.
>> Și apoi amintesc, ceea ce a făcut acest Programul de fapt, nu?
>> Tipărit-l în coloane.
>> Da, exact.
Pur și simplu imprimat cuvântul pe care am tip în o coloană, un personaj pe linie.
Deci, haideți să vedem asta din nou.
Deci, asigurați-șir.
Compilate OK. . / Șir.
Lasă-mă să tastați în H-E-L-L-O, Enter, și într-adevăr, m-am prins, câte unul pe linie.
>> Deci, lasă-mă să fac o optimizare aici.
Dacă te gândești la asta, mai ales în cazul în care le-ați programat înainte, nu e
fără îndoială, o ineficiență în linia 24.
Cu alte cuvinte, nu este neapărat cel mai bun design.
Simplu, cel puțin o dată te amintiți-vă ceea ce este str. Leng, dar e
a face ceva prost potențial.
Ce ar putea fi?
>> [Inaudibil].
>> Exact.
Este de verificare pentru lungimea lui s de fiecare dată, chiar dacă
H-E-L-L-O este întotdeauna va să fie de cinci caractere.
De fiecare dată, prin această buclă, cinci nu se schimbă.
S-ar putea fi incrementarea eu, dar ceea ce este lungimea lui s pe fiecare
iterație de această buclă?
E cinci, e cinci, e cinci, și dar eu întreb, totuși, acest lucru
întrebare din nou și din nou și din nou.
Acum sincer, computerul este atât de al naibii de rapid, nimeni nu va observa o
Diferența în acest caz, însă aceste tipuri de deciziile de design slab poate
începe să adăugați până dacă compilator în sine nu încerca să stabilească acest lucru pentru tine, care
ea de obicei nu ar fi, la cel puțin în aparat.
>> Așa că am de gând să fac asta.
Am de gând să adăugați o virgulă după prima mea variabil, am.
Am de gând să-mi dea un alt variabilă, se cheamă n, doar prin
Convenția pentru numere, și apoi eu sunt va atribui n valoarea string
lungimea uri.
Și apoi am de gând să schimbe starea mea de a fi ce?
Am de gând să schimbe starea mea la timp i este mai mic decât n.
>> Deci, acum, de câte ori sunt eu verificarea lungimea lui s?
După ce, dar e bine să i verifica împotriva n din nou și din nou, deoarece acum cei
Valorile nu sunt de fapt în schimbare.
Acum, pentru acum, doar știi că oricând apela o funcție, există un pic de
deasupra, nu suficient pentru a te descuraja Chiar de la vreodată folosind funcții, dar
cu siguranță, atunci când există o linie de cod place că - și liniile vor primi
mult mai interesant înainte de lung - în cazul în care există o oportunitate de a gândi, dacă am
tastați acest cod, cât de multe ori va executa?
Veți începe să vedeți în timp performanța de programe poate
într-adevăr schimba.
>> De fapt, una din problemele seturi ne-am făcut în ultimii ani implică
de punere în aplicare, așa cum s-ar putea retrage de la săptămână la zero, un corector ortografic, dar o
corector ortografic, care este proiectat pentru a sprijini un dicționar de 150.000 plus
cuvintele pe care le vom da băieți.
Tu ar trebui să scrie cod care se încarcă aceste cuvinte în memoria RAM, atât în
cutii cum am vazut pe ecran un moment Acum, și apoi la fel de repede ca tine
poate, trebuie să fie în măsură să răspundă la un chestiune de forma, este acest cuvânt
scris gresit?
Este acest cuvânt scris gresit?
>> Și, în ceva de genul că ceea ce ne-am realizat în ultimii ani este transformat în,
deși pe opt-in mod opțional, un un concurs de soiuri, prin care
studenții care folosesc mai puțin RAM și mai puțin timp, mai puține cicluri CPU, ajung
barbotare până la partea de sus a unui mic bord lider sau de trafic pe care le pune la
pagina cursului ca ne-am făcut în ultimii ani.
Deci, din nou, total opțional, dar această vorbește la oportunitățile de proiectare
care sunt departe odată ce vom începe construirea deasupra unora dintre aceste
blocuri de bază.
>> Așa că lasă-mă să mă întorc la această schemă pentru doar o clipă și arată un pic
ceva mai mult.
Aceasta într-adevăr este un șir, și ne-am luat profitat de câteva biblioteci,
io.h standard, care are -
>> Printf.
>> Printf, printre alte lucruri.
cs50.h, care a obține int si sa string și așa mai departe, string.h, care
a avut Str Leng.
Dar se pare că există încă un alt.
Sincer, există o mulțime de antet fișiere care declară funcții
pentru biblioteci, dar acest lucru este ctype.h de fapt, o să fie ceva
avantajoasă pentru că am de gând să meargă mai departe și să implementeze un
alt program aici.
>> Lasă-mă să merg mai departe și să se deschidă ceva Am scris în prealabil numit
capitalize.c, și să ia o privire la modul în care aceasta funcționează.
Observați că eu sunt, folosind, în această versiune din ea, trei fișiere familiare.
Observați că în linia 18, sunt a obține o linie de text.
Comunicarea în linia 21, eu sunt susținând că următorul cod se va
valorifica s, indiferent de utilizatorul tastat în, și cum fac asta?
Ei bine, eu iau -
lecție învățată de la ultima dată -
Eu am și n declararea și iterarea peste caracterele din șir.
Și atunci ce este acest bloc de Codul în linia 24, prin 27
face în termeni de nespecialist?
>> Litere mici scrisoare înapoi.
>> Exact.
Dacă s suport eu - așa că, dacă i-lea Caracterul de s, care este un anumit
char în șir, este mai mare decât sau egală cu litere mici și o -
Amintim că dubla ampersand semnifica și -
și același caracter, s suport i, este mai mică sau egală cu litere mici z,
Asta înseamnă că este un o sau un B sau C sau o dot, dot, dot, sau un z, ceea ce înseamnă
e mici.
Ceea ce vreau să fac în acest caz?
Ei bine, eu pot face acest lucru oarecum criptic, dar
să tachineze acest afară.
>> Am de gând pentru a apela printf, imprimă% C pentru că vreau să imprimați din nou acest
caracter de pe ecran.
Am apoi de gând să ia s suport I, Caracterul i-lea în e, și atunci de ce
fac acest mic truc aici, minuscule de un capital de minus?
Ce este că merge să dea mine, în general vorbind?
>> [Inaudibil].
>> Exact.
Nu-mi amintesc cu adevărat -
a fost de 65 de capitala A. Eu nu prea amintiți-vă ceea ce minuscule un este,
dar nu contează.
Calculator știe.
Deci prin a spune, minuscule un minus capitalul O, e ciudat să fie
scăderea unul char la altul, dar ce sunt caractere sub capota?
Sunt doar numere.
Deci, indiferent de aceste numere sunt, lăsați computerul amintesc
mai degrabă decât mine uman.
>> Deci minuscule un capital minus A este O să-mi dea o diferență.
Se întâmplă să fie 32, și care ar fi în cazul de mici b și de capital B
și așa mai departe.
Acesta rămâne consecvent, din fericire.
Deci, eu sunt în esență spun, ia minuscule scrisoare, scade pe care
diferență etalon, și că Am suport modificări eficient s de la
minuscule la, desigur, cu majuscule, fără să-mi într-adevăr să se gândească
despre sau să vă amintiți, ce au fost cele Numerele Am vorbit despre atunci când opt
voluntari a venit pe scenă?
Acum Între timp, în mai, în cazul în care nu este o scrisoare mici determinată
prin linia 24, doar imprima.
Vreau doar să atingeți personaje care au fost
de fapt minuscule inițial.
>> Deci, haideți să vedem asta.
Face valorifica.
Compilat, OK.
. / Valorifica.
Și lasă-mă să tastați în H-E-L-L-O în litere mici, Enter.
Și observați că acesta este convertit în majuscule.
Lasa-ma sa fac acest lucru din nou cu un alt cuvânt.
Cum despre D-A-V-I-D cu primul D capitalizate ca un nume de obicei este?
Enter.
Observați că e mai corect.
Pur și simplu scoase că prima neschimbate D prin care else.
>> Deci, tineti minte, atunci, o câteva lucruri aici.
Unul, dacă vrei vreodată să verificați două Condițiile de la o dată, aveți posibilitatea să și le
împreună așa cum am prezis.
Puteți compara caractere în acest fel și trata eficient personaje ca
numere, dar sincer, acest lucru este atât de al naibii de criptic N-am de gând să-și amintească
cum de a veni cu aceasta la zero fără raționament prin ea pentru destul de
un pic de timp.
>> Nu ar fi fost frumos dacă cineva acolo a scris o funcție numită este
mai mici, care ar putea răspunde pentru mine adevărate sau fals, acest personaj este mici?
Ei bine, din fericire, oricine a scris ctype.h a făcut exact acest lucru.
Lasă-mă să merg pe aici și adăugați ctype pentru c tipuri, și acum lasă-mă să merg pe aici și
rescrie această linie, după cum urmează.
>> Deci, dacă se numește este mai mică, eu susțin, s suport eu, apoi am de gând pentru a șterge
aceste două linii cu totul.
Deci, acum altcineva, sper, a scris o funcție numită este mai mic, iar aceasta
Se pare că au făcut și au declarat în interiorul de ctype.h.
Și acum am de gând să părăsească linia 27 singur, am de gând să părăsească linia 31
singur, dar observați cât de mult am înăsprit codul meu.
Acum e curat.
Este mai dificil să se uite prin deoarece acum funcția, în plus, este
atât de minunat a numit-o doar face ceea ce spune.
>> Așa că acum am de gând să salveze această.
Am de gând pentru a micșora.
Și, la fel ca și în Scratch ai putea avea Booleans, valori booleene adevărat sau
fals, că este exact ceea ce este reducerea cu eficacitate a returnărilor.
Lasă-mă să recompilați.
Lasă-mă să re-run.
Și acum să încercăm din nou, H-E-L-L-O, Enter.
Asta e destul de bine.
Și încercați să-l din nou, asigurați-vă că am Nu am greșit ceva.
Care este valorificat de asemenea.
>> Dar acest lucru nu este suficient de bun, deoarece Un alt lucru pe care eu nu o să
amintesc dacă am lucra prin ea într-adevăr cu grijă, să zicem, hârtie este
această linie naibii.
Nu ar fi frumos dacă ar exista o funcție numită de sus?
Ei bine, se pare că există este în ctype.h, de asemenea.
Am de gând să merg mai departe și de tip -
permiteți-mi să aduc acea linie înapoi.
În loc de asta aici, lasă-mă să merg mai departe și spune, substitui% C
Rezultatul a sunat această funcție pentru a superioară pe caracterul i-lea de e.
Și acum observați se face un pic mai echilibrat.
Trebuie să țină evidența numărului de paranteze Am deschis și închis.
>> Deci, acum este chiar mai curat.
Acum, acest program este tot mai bine și mai bine proiectat, fără îndoială, pentru că e
mult, mult mai ușor de citit, dar nu e de sa corecta.
Face valorifica.
. / Valorifica.
H-E-L-L-O. Să-l executați din nou, D-O-V-I-D. OK, deci suntem încă în
forma destul de buna.
>> Dar acum, la partea superioară.
Eu propun ca nu e una mai mult rafinament am putea face ar fi
foarte frumos, care ar putea strânge într-adevăr la acest cod și într-adevăr să ne dea cinci
din cinci pentru proiectare, de exemplu.
Ce-ar fi frumos să scape de?
Ei bine, uite cât de al naibii de mult acest bloc de cod este doar pentru a face ceva simplu.
>> Acum, ca o paranteza, cum s-ar putea avea văzut în secțiunea super-acest trecut
week-end, nu aveți nevoie de strict acolade, atunci când au doar un singur
linie de cod, chiar dacă ne-am propus menținându-le astfel încât acesta face mult
mai clar, ca în formă de U Scratch lui blocuri, ceea ce este în interiorul sucursalei.
Dar nu ar fi frumos dacă la partea superioară, atunci când este administrat intrare sale, sa transformat într-
majuscule dacă nu este, și ceea ce ar fi fi minunat, în caz contrar, dacă
e deja scris cu majuscule?
Doar trece-l prin și-l lase în pace.
>> Așa că poate face asta.
Am putea încerca și sperăm că nu, dar lasa-ma
introduce un alt lucru.
În loc de a folosi acest built-in terminalul Fereastra aici, amintim că
această pictogramă negru pătrat vă oferă o fereastră de terminal mai mare pe care am container plin
ecran dacă vreau?
Deci, se dovedește că sunt un fel de ciudat nume, dar există aceste lucruri numite
paginile de manual, paginile de manual, om de scurt, și eu pot accesa aceste către
om tastarea -
ceea ce vreau cu tipul?
Omul de sus.
>> Și acum observa dacă există o funcționa în interiorul calculatorului, în
acest caz aparat, care este doar sistemul de operare Linux, se va
să-mi dea un set oarecum criptic de de ieșire, dar veți găsi în timp ce
întotdeauna este formatat destul de mult același astfel încât începi să te obișnuiești cu el.
Observa în partea de sus la partea superioară, iar se pare că este aceeași documentație
pentru a reduce.
Cine a scris-o a fost tăiat unele colțuri și pune totul pe o singură pagină.
Scopul acestor lucruri "în viata este de a converti un
scrisoare de superior sau minuscule.
>> Observați că în Sinopsis, pagina de manual mă învață ce dosar am
pentru a include pentru a utiliza acest lucru.
Este mi-a dat de semnături pentru aceste funcții, ambele dintre ele, chiar
deși ne chiar acum numai pasă de unul.
Aici este acum o descriere.
Pentru superior convertește litera C la majuscule, dacă este posibil.
>> Încă nu că instructiv, dar permiteți-mi să uite acum sub valoarea returnata, lucru
care a dat-o înapoi.
Deci, valoarea returnată este cea a litera convertite sau C, în cazul în care
conversie nu a fost posibil.
Ce este C?
>> Caracterul original.
>> Caracterul original și știm că de, din nou, merge până la
Sinopsis, și cine a scris acest Funcția doar a decis că de intrare
pentru a superioară și inferioară a este doar arbitrar va fi numit C.
Ele ar putea fi numit cel mai nimic ei vor, dar au păstrat
simplu ca C.
Așa că m-am consultat pagina de om.
Această frază mă liniștește că, dacă nu este o literă mică, este
O să-mi dai înapoi C, care este perfectă, ceea ce înseamnă că pot scăpa de
starea mea altcineva.
>> Așa că lasă-mă să mă întorc la gedit, și Acum lasă-mă să fac asta.
Am de gând să copiați declarația printf.
Am de gând să merg mai departe și chiar în interiorul pentru imprimare bucla asta, si sa
scăpa de acum acest întreg dacă construcție.
Nu a fost o idee rea, și a fost foarte mult mai corect și în concordanță cu
tot ceea ce am predicat, dar pur și simplu nu este necesar.
De îndată ce vă dați seama că unele bibliotecă Funcția că există altcineva
scris, sau poate ai scris în altă parte în fișierul, îl puteți folosi și într-adevăr
începe să se intensifice cod.
>> Și când spun lucruri de genul stil bun, faptul că această persoană numită
funcționează în sus, sau anterior este mai mic este minunat util, deoarece
sunt foarte descriptiv.
Tu nu ar dori pentru a apela funcțiile x și y și z, care au
mult, mult mai puțin înțeles.
Orice întrebări cu privire la această serie de îmbunătățiri?
>> Deci, este suficient să spunem unul dintre takeaways este chiar problema ta
Set - Poate problema set de unul, dar cu siguranță, P set de două și mai departe, chiar
atunci când sunt corect nu neapărat înseamnă că sunt perfecte doar
dar și deosebit de bine concepute.
Asta e cealaltă axă a începi să te gândești.
Deci asta a fost un șir interiorul dvs. memoria computerului, dar dacă aveți o
grămadă de personaje cum ar fi H-E-L-L-O interior de RAM, și să presupunem
că în programul de apel se string de mai multe ori astfel încât vă
apel obține șir dată, atunci suna a obține din nou șir.
Ei bine, ce se întâmplă la întâmplă în timp?
>> Cu alte cuvinte, dacă aveți o linie de cod, deși afară din context, cum ar fi
string s devine -
hai sa facem acest lucru.
Numele șir este egal obține șir.
Deci, să presupunem că linie de cod este menit pentru a cere utilizatorului pentru numele lui sau a ei.
Această următoarea linie de cod este menit să ceară utilizator pentru lui sau ei școală, și
această linie viitoare, și așa mai departe.
Să presupunem că ne tot întreabă utilizator pentru altul și
un alt și un alt șir.
Ei au de gând să rămână în memoria în același timp.
Unul nu este de gând să rescrie celălalt.
Școală nu se suprascrie celălalt.
Dar, în cazul în care toate fac ei ajung în memorie?
>> Ei bine, dacă vom începe să desena pe ecran, pe care le putem folosi acest lucru
aici, ca o tablă, în cazul în care acest lucru negru dreptunghi reprezintă computerul meu
memorie, am de gând să înceapă arbitrar împărțind-o în sus, în pătrate mici,
fiecare reprezentând un octet de memorie.
Sincer, dacă aveți un gigabyte de memorie RAM aceste zile, aveți un miliard de bytes
de memorie în computer, astfel încât un miliard de aceste pătrate.
Deci, este suficient să spunem, această nu este cu adevărat de scară.
>> Dar am putea ține desen toate acestea în mod clar nu este la scară pătrate, iar această
reprezintă colectiv memoria computerului meu.
Acum, vom face doar punct, punct, punct.
Deci, cu alte cuvinte, atunci când am prompte acum utilizatorului cu șir Ia să-mi dea un
șir, ce se întâmplă?
Dacă tipuri de utilizator în "Bună ziua", care se termină în H-E-L-L-O. Dar să presupunem
apoi utilizatorului tipurile din -
De fapt, eu nu ar fi făcut salut pentru că cerem
le pentru numele lor.
Așa că haideți să ne întoarcem dacă eu pot face asta.
>> Deci, dacă am tip în D-A-V-I-D pentru numele meu, dar amintesc ca a doua linie de
Codul a fost a obține din nou string pentru a obține școala lor.
Unde este acel cuvânt pe care utilizatorul Tipuri de gând să mergem?
Ei bine, poate că va intra în H-O-R-V-A-R-D. Deci, chiar dacă am
trase ca două rânduri, aceasta este doar o grămadă de bytes in dvs.
RAM computerului.
Există o problemă de acum, pentru că acum, dacă eu sunt utilizarea RAM în acest foarte rezonabil
dar un fel de mod naiv, ce poti sa Nu pare distinge?
În cazul în care una începe și unde se termină, nu?
Sunt un fel de interferență împreună.
>> Deci, se dovedește calculator nu face acest lucru.
Permiteți-mi, de fapt derula înapoi în timp o câteva personaje, și în loc de Harvard
merge imediat după numele utilizatorului, utilizatorul devine de fapt, în spatele
scenei, un caracter special introdus prin
calculator pentru el sau ea.
/ 0, altfel cunoscut sub numele de caracter NUL supărător numit N-U-L, nu
N-U-L-L, dar scrie-l ca / ​​0.
E doar toate biți de zero este un marker în între primul cuvânt care utilizatorului
introdus și al doilea.
>> Deci, Harvard de fapt acum se termină ca această secvență de caractere
și o mai / 0.
Deci, cu alte cuvinte, către având aceste Valorile santinelă, opt la zero învecinate
biți, puteți începe acum să se facă distincția un caracter la altul.
Deci, tot acest timp ceea ce a fost "Bună ziua" este de fapt, "hello", cu o / 0, și
În același timp, ar putea foarte bine fi destul de un pic mai mult RAM
interiorul calculatorului.
>> Lasă-mă să fac un lucru acum.
Se pare că toate aceste pătrate am fost de desen, ele sunt, da,
siruri de caractere, dar mai în general, aceste lucruri sunt tablouri.
O matrice este doar o bucată de memorie care este spate în spate la spate în spate,
și de obicei folosesc o matrice de cale din această notație paranteza.
Deci, vom vedea aceste destul de un pic în timp, dar lasă-mă să merg mai departe și
deschide, să-l numim vârstele.
Si observa ceea ce putem face cu aceste trucuri același, un pic
bit mai mult sintaxa aici.
>> Deci, în linia 17 din acest program - De fapt, permiteți-mi să executați programul de primul
astfel încât să putem vedea ce face chestia asta.
Permiteți-mi să fac apel la vârstele compila acest program.
Vârstele. /.
Câți oameni sunt în camera?
Spune-i trei.
Vârsta de prima persoană?
18, 19, și 20.
Și acum oarecum ridicol, eu doar au făcut un program care vârstele cele
trei persoane.
>> Deci, există în mod clar o oportunitate pentru unele aritmetică distracție aici.
Din fericire, matematica este corect.
18 sa dus la 19, 19 a fost la 20 și așa mai departe.
Dar ceea ce este într-adevăr menit să fie ilustrativ aici este cum vom stocarea
vârstele cele trei oameni.
Permiteți-mi mări la ceea ce este întâmplă pe aici.
>> Deci, în primul rând, aceste primele câteva rânduri ar trebui fi obtinerea destul de familiar.
Sunt doar a solicita confirmarea utilizatorului pentru Numărul de persoane în cameră.
Apoi Sunt folosind lua int și de a face în timp ce la face acest lucru din nou și din nou și din nou.
Am văzut că modelul înainte, dar linia 27 este nou și, de fapt destul de
util, și vor deveni ce în ce mai util.
Observați că ceea ce e diferit în linia 27 este că eu par a fi declararea unei
int numit vârstele, dar așteptați.
Nu e doar vârstele int.
Există aceste paranteze pătrate, în interiorul căreia este n.
>> Deci suportul n în acest context, nu în interiorul unei printf aici, dar
în această linie unic 27, această linie este spunând, da-mi n int, fiecare dintre care
este de tip int.
Deci, aceasta este o galeata, ca să spunem așa, de, în acest caz, trei numere întregi înapoi la
spate în spate, astfel că în mod eficient au trei variabile.
Alternativă, să fie clar, ar fi aceasta.
>> Dacă am vrut primul student varsta, am putea face acest lucru.
Dacă am vrut de-al doilea student Varsta am putea face acest lucru.
Dacă aș fi vrut al treilea elev varsta, am putea face acest lucru.
Și Doamne ferește avem nevoie de toată lumea vârstă în această cameră -
Vreau să spun, acest lucru este un heck de o mulțime de copii, pastă din nou și din nou și din nou.
Și în plus odată ce am compila acest program, În cazul în care un alt student iese în afară peste
de ușa, acum numărul meu de variabile este incorectă.
>> Deci, ce este frumos despre un tablou este la fel de Imediat ce începeți să vă simțiți singur
copierea și lipirea, șansele sunt că e nu cea mai bună abordare.
O matrice este dinamic potențial.
Nu știu în avans cât de mulți oameni vor fi în cameră,
dar eu nu știu am nevoie de n de ele, și voi dau seama n atunci când vine momentul.
Această linie de cod înseamnă acum, da-mi un segment de memorie care arata ca aceasta
în cazul în care numărul de cutii de pe ecran este în întregime dependent de n, care
utilizatorul tastat inch
>> Deci, acum restul acestui program este de fapt, destul de similar cu ceea ce
tocmai am făcut cu caractere.
Observați Am o pentru buclă începând cu linia 30.
Deci, chiar după ce am obține matrice, am repeta de la Y este egal cu zero până la n.
Am doar acest printf instructiv mesajul să spun, da-mi vârstă
de persoană pe care am #%, astfel încât numărul unu, Numărul doi, numarul trei.
Și de ce am făcut asta?
Sincer, oamenii preferă să numere de la unu în sus în timp ce oamenii de știință de calculator,
la zero în sus.
Oamenii de stiinta de calculator nu sunt de gând să folosesc acest tip de program, astfel încât suntem
va începe doar numărarea la unul ca oamenii normali.
>> Și acum, în linia 33, observa ușor diferite bucată de sintaxă.
Vârstă i-lea în care variabila de tip matrice este de gând pentru a obține un int.
Și acum în cele din urmă, aceasta este doar aritmetică aici.
Am decis într-o buclă separată a solicita trece ceva timp, și acum în acest
buclă separată, aceste linii executa.
>> Un an de acum, persoana pe care o va fi i de ani, dar observa acest lucru nu este
variabila i.
Acest lucru este de acum% I pentru Int.
Și notificare, primul substituent, I conectați la I plus 1, asa ca am conta ca un
persoană normală.
Și apoi pentru valoarea de vârsta lor, pentru i ani, am lua o vesnicie suportul
I - și de ce fac, plus o aici?
Ei doar varsta.
Este alegerea mea stupid de programe.
Ei doar in varsta de un an.
Aș putea să tastați în orice număr care De fapt, eu vreau acolo.
>> Deci, ce este de fapt tot relevanța aici?
Ei bine, lasă-mă de fapt derula înapoi aici și vopsea o imagine
de ceea ce se află înainte.
Ce vom face cu următoarea noastră Set problema Doi se abuza de
lumea de criptografie.
Deci, acesta este un șir de caractere, asa ca o Secvența de mai multe caractere, și ce
spune acest lucru?
Nu e în versiunea on-line de diapozitive.
>> Deci, eu susțin că acest lucru este egal cu aceasta, o publicitate prost de la mulți ani
Acum că s-ar putea aminti de fapt, una dintre originile sale.
Deci, acesta este un exemplu de criptare sau criptografie.
Se pare că, dacă doriți să trimite de fapt, informații sau cota
Informații cu cineva siguranță, ca un mesaj ca aceasta, puteți
încăierare litere.
Dar de obicei, cuvintele sunt Nu amestecate la întâmplare.
Sunt permutate într-un fel sau modificate într-un fel, astfel încât - Oops.
Asta e un spoiler distractiv pentru data viitoare.
>> Astfel încât să puteți mapa ceea ce este aparent O să B. Observați că liniile de sus
Capitalizarea-înțelept.
Aparent R devine e.
Aparent F-H-E-R devine S-U-R-E. Așa Se pare că există o cartografiere, și în
acest caz, există o destul de prost cartografiere dacă cineva a dat seama?
Acest lucru este ceva numit Rot 13, Rotire 13.
Este stupid de criptare mecanisme pentru că literalmente doar
se adaugă 13 la fiecare dintre litere, prost, în sensul că, dacă doar
au un pic de timp liber pe mâinile tale și un creion, sau doar cred că
prin in capul tau, ai putea încerca toate adăugate posibile - una, două,
trei, punct, punct, punct, 25 la doar rotiți întregul alfabet, și
în cele din urmă, veți da seama ceea ce acest mesaj este.
Deci, dacă ai făcut ceva în scoala nota de trecere mesaje pentru dvs.
cel mai bun prieten, în cazul în care școala dumneavoastră clasa profesor pur și simplu citit prin
mesaj și brută forțat soluție, este posibil să fi ajuns
un răspuns de ce.
>> Acum, desigur, în lumea reală, criptografie este mult mai sofisticat.
Acesta este un fragment de text dintr-un sistem de computer care are nume de utilizator și
parole, ca aproape toate ale noastre, și aceasta este ceea ce parola ar putea
arata daca stocate pe hard dvs. drive, dar în formă criptată.
Aceasta nu este doar o rotație de scrisori, A este B și B este C. Aceasta este
mult mai sofisticat, dar folosește ceea ce este, în general, cunoscut sub numele de cheie secretă
criptografie.
Această imagine spune următoarele Povestea cu câteva icoane.
>> Pe stânga, avem ceea ce vom numi text simplu.
În lumea de criptografie, simplu Textul este doar mesajul original
scris în limba engleză sau franceză sau orice fel de limbaj.
Dacă vrei să-l criptați, vom trece ea pictural prin intermediul unui lacăt, astfel încât
un fel de a algoritmului, o funcție sau program care cineva a scris
care amestecă literele sperăm, mai mult complicatedly mult decât adăugarea de 13
pentru fiecare dintre ele.
>> Ce te scot din acest proces în Orientul Mijlociu nu este numit cyphertext.
Deci, un fel de cuvânt sexy.
Aceasta înseamnă doar că este criptat versiune a textului simplu.
Și numai dacă aveți aceeași secret, 13 sau minus 13, sunteți în măsură să
decripta un mesaj de genul asta.
>> Deci, în problema seta două, printre lucrurile vei face dacă în Hacker
Edition, va trebui să scrie cod pentru a sparge aceste parole, imaginind
ceea ce au fost și modul în care acestea au fost criptat, deși noi nu vă dau un pic
de orientare de-a lungul drum.
În versiunea standard, vom introduce o pereche de cifruri, criptare
mecanisme, unul numit Cezar, unul numit Vigenere, care sunt încă
cifruri de rotație care devine un ceva, B devine ceva, dar
trebuie să-l faci programare pentru că va fi într-adevăr un secret
cheie implicate, care este de obicei un număr sau un cuvânt cheie care numai
expeditorul și destinatarul acestor Mesajele trebuie să înțeleagă.
>> Acum, acest lucru are de fapt încarnări în lumea reală.
Aceasta, de exemplu, este mic orfan Inel decodor secretul lui Annie, si tu
poate implementa de fapt, aceste cifruri de rotație -
Un devine ceva, B devine ceva - cu o pereche de roți,
unul pe exterior, cel din interior astfel că, dacă rotiți roata sau
inelul, puteți alinia de fapt, scrisori cu litere diferite,
a obține un cod secret.
Și astfel ca Cliffhanger pentru ziua de azi, ceea ce am crezut că mi-ar face este un pic de
intoarcere că dacă te întorci la TV pe 24 decembrie, puteți viziona
ad nauseum film pentru 24 de ore într-un rând.
Dar pentru ziua de azi, voi deschide aici și să ne dea doar două minute de o
pedagogic relevant poveste de Crăciun cu un pic de tip pe nume Ralphie.
>> [Redare video]
>> -Fie cunoscut de toți fără excepție că Ralph Parker este numit un
membru al Micul orfane Annie secrete cerc și are dreptul la toate
onorurile și beneficiile apar la acesta.
>> -Semnat, Micul orfane Annie.
Contrasemnat, Pierre Andre în cerneală.
Onoruri și beneficii deja la vârsta de nouă ani.
>> [Striga la Radio]
>> Haide, hai să mergem mai departe cu ea.
Nu am nevoie de tot ce jazz despre contrabandiști și pirați.
>> -Ascultă mâine seară pentru aventură încheierea de negru
corabie de pirați.
Acum, e timpul pentru Annie Secret Mesaj pentru tine membri
cercului secrete.
Amintiți-vă, copii.
Numai membrii Cercului Secret al lui Annie poate decoda mesaj secret al lui Annie.
Amintiți-vă, Annie este în funcție de tine.
Setat pini de la B2.
Aici este mesajul.
12, 11, 2 -
>> -Sunt la prima mea întâlnire secretă.
>> -25, 14, 11, 18, 16 -
>> -Pierre a fost in seara asta mare voce.
Aș putea spune că mesajul din seara asta a fost foarte important.
>> -3, 25.
Asta e un mesaj de la Annie ea.
Amintiți-vă, nu mai spune la nimeni.
>> -90 Secunde mai târziu, eu sunt în Cazare în casa în care un băiat de nouă
ar putea sta în intimitate și decodare.
Aha, B. m-am dus la alta.
E. Primul cuvânt este "să fie." S. Acesta venea mai ușor acum.
U. 25.
Asta-i R.
>> -Hai, Ralphie.
Trebuie să plec.
>> -Voi fi dreapta jos, Ma.
Oau.
>> -T. O. Asigurați-vă că.
Asigurați-vă că pentru ce?
Ce a fost Micul orfane Annie încearcă să spună?
Asigurați-vă că pentru ce?
>> -Ralphie, Randy a ajuns să meargă.
Te rog ieși?
>> -Bine, mamă.
Voi fi afară.
>> -Am fost obtinerea mai aproape de acum.
Tensiunea a fost teribilă.
Ce a fost asta?
Soarta planetei poate atarna in balanta.
>> -Ralphie, du-te trebuie să Randy.
>> -Voi veni imediat pentru plâns cu voce tare.
>> -Aproape acolo.
Degetele mele zburat.
Mintea mea a fost o capcană de oțel.
Fiecare por vibra.
Era aproape limpede.
Da, da, da, da, da.
>> -Asigurați-vă că pentru a bea Ovaltine dumneavoastră.
Ovaltine?
O crummy comercial?
Fiu de cățea.
>> [END redare video]
>> DIFUZOR 1: Acesta este CS50, și că vor fi stabilite problemă cu două.
Ne vedem săptămâna viitoare.
>> DIFUZOR 2: La următoarea CS50, acest lucru se întâmplă.
>> SPEAKER 1: Deci, un subiect care nu avea sa uitat la până acum este
că de indicii funcții.
Acum, un indicator de funcție este doar adresa unui public
funcție, dar, la fel ca -
Fiul unui -