>> SPEAKER 1: Bună tuturor.
Vom începe.
Cred că oamenii sunt încă în desfășurare pentru a fi filtrarea în.
Dar, în interesul de timp, astfel încât să putem te voi de aici la timp,
vom începe.
Deci, bun venit pentru a CS50 Quiz 0 revizuire.
Pentru cei dintre voi care nu s-au realizat totuși, aveți o întrebare pe miercuri.
Woo-hoo.
>> Dacă nu ați început să studieze încă sau nu s-au dat seama că aceasta există încă,
teste trecute și toate informațiile cu privire la Quiz-ul sunt pe cs50.net/quizzes.
Sunt niște chestii destul de bine pe acolo, teste trecute de la ultimul 10
ani, precum și informații despre acest test și subiecte
care vor fi acoperite.
Deci, să începem.
>> Deci, voi s-ar putea aminti, primul zi de clasa David a avut aceste lămpi pe.
Deci, în esență, tot ce se pe sub capota de un calculator este
făcut în binar.
Binary înseamnă ceea ce se pare cum ar fi, 0 și 1 a lui.
Ea are două valori care poate fi reprezentat.
>> Deci, la fel ca în prima zi de secțiune când David pornit o lumină
bec pentru a reprezenta pe, sau 1, computerul nostru înțelege binar ca 0 și
1, a pornit sau oprit.
Bazele binare.
Fiecare loc este reprezentată în baza doi.
Deci, se adaugă 2 la 0 la 1 la 2 până sus.
>> Pentru a calcula ce binar ta este de a zecimal, doar să urmați această ecuație
Tipul de lucru.
Dacă aveți un 1 în oricare dintre aceste locuri, l-ai multiplica prin orice
baza este în, adăugați-l în sus, și te zecimal.
Deci, acesta este modul în care te numeri la 5 în binar.
La fel ca ceea ce facem cu privire la Ultima imagine, acesta este modul în care ar fi
reprezintă de la 1 la 5.
>> În mod similar, la fel ca puteți adăuga și scade în zecimal sau baza 10, sau
într-adevăr orice bază, pe poate adăuga și scade în binar.
Exact ceea ce v-ați aștepta, atunci când adăugați două sus, dacă este egal cu o mai mare
decât 1, purtați un 1, fac din el un 0, și de a face adăugarea în acest fel, doar
ca v-ați aștepta cu regularitate zecimal sau orice altă bază.
Se răcește.
>> Așa cum am spus înainte, tot ceea ce merge pe sub capota a computerului nostru
se face în 0 și 1 a lui, sau binar.
Deci, cum putem exprima, de exemplu, litere sau numere, sau caractere?
Si raspunsul la care este ASCII.
>> ASCII este o mapare între caractere care ne-ar vedea în mod normal în
Limba engleză ca a lui A, B lui, C, a sublinia, linii, și
ceva de genul asta.
Și se mapează că la o valoare ASCII.
O valoare ASCII este doar un număr care poate fi înțeleasă de către computer.
Și la fel ca tine se poate face plus și scădere cu numere, puteți face
le cu valori ASCII.
>> Deci, în acest exemplu, care va imprima acest lucru?
Da, deci doar un spațiu spațiu B spațiu C D. Unde sa dus mouse-ul meu?
Observați puteți defini un int la 65.
Și când imprimați că folosind la sută C, se va interpreta ca pe un
caracter și va imprima A.
>> În mod similar, puteți declara ea ca un char.
Și atunci când îl imprimați folosind la sută C, se va interpreta ca,
la sută D. Si la fel ca tine se poate adăuga un număr, puteți adăuga caractere sunt
Valori ASCII, în acest caz.
>> Deci, un pic pointer pentru toată lumea.
5, ca un șir de caractere, nu de fapt, egal cu 5.
Deci, cum am putea converti șir 5 la numărul întreg 5?
Orice idei?
Da.
>> Deci, dacă avem 5 ca un șir de caractere, putem scădea 0.
Și asta ne va da 5.
Și în mod similar, dacă avem 5 ca un întreg, se adaugă faptul că în șirul 0.
Și asta ne dă șirul 5.
Se răcește.
>> Acum, amintesc înapoi pentru a preda o în cazul în care am vorbit despre algoritmi.
Deci, cum ne-o dorim de fapt un calculator de a face lucruri interesante?
Știi, doar adunare și scădere numere și imprimare lucruri nu este
asta interesant.
De obicei, vrem calculatorul nostru de efectua un fel de algoritm.
Ceva un pic mai complex decât doar aritmetică simplă.
>> Un algoritm este doar un pas de set pas de instrucțiuni pentru modul de efectuare a
o anumită task--
la fel ca o rețetă.
S-ar putea aminti în prima zi a Clasa în care David a ne conta o cameră
de oameni și cât de mulți oameni fost în cameră.
S-ar putea fi folosite pentru numărare unul câte unul.
1, 2, 3, 4.
În acest caz, un algoritm de timp liniar.
>> Dar David a introdus un algoritm pentru să numeri oamenii din sala
în cazul în care toată lumea se ridică în picioare, vă spun dumneavoastră număr de o altă persoană, adăuga că
număr în sus, și o persoană stă jos.
Și tu repeta.
Acesta este un tip de algoritm.
Putem analiza o cât de eficient Algoritmul se bazează pe a rulat timp.
Dar vom vorbi un pic mai multe despre asta mai târziu.
>> Deci, toți algoritmii pot, de asemenea, să fie scris în pseudocod.
Pseudocod este doar o limba engleză ca sintaxă folosită pentru a reprezenta
un limbaj de programare.
De exemplu, dacă am vrut să întreb un utilizator pentru a ghici numărul meu preferat, am
ar putea avea pseudocod ca atare.
>> Ia-o de utilizatori ghici.
În cazul în care ghici este corect, spune-le sunt corecte, altfel le spun
ei nu sunt corecte.
Și pseudocod este un mod de ușor reprezentând o idee sau un algoritm.
Deci, acum ne-am putea dori să scrie de fapt aceasta în limba pe care computerul
s-ar putea înțelege.
Deci, am putea scrie pseudocod noastră și interpreta că în codul sursă.
>> Până în prezent, codul sursă trebuie să adere într-o anumită sintaxă a
un limbaj de programare.
Și până acum, în CS50, ne-am folosit mai ales c.
Deci, acest lucru ar putea fi codul sursă pentru c.
Mai târziu, în cursul, ai venit noapte în contact cu alte programe
limbi, cum ar fi PHP.
Sau, dacă luați chiar alte clase, vă s-ar putea face Java, Python, sau chiar OCML.
Dar, în limbaj de programare C noastră, aceasta este cum am putea scrie codul sursă pentru
algoritmul pseudocod care Tocmai am descris mai devreme.
>> Deci, cum face computerul de fapt Intelegi?
Cum am spus mai înainte, doar într-adevăr înțelege zero si unu.
Deci, cum nu-l lua de la sursa cod pentru ceva ce poate fi
înțeles?
Ei bine, avem ceva numit un compilator.
>> Dacă vă amintiți înapoi în cele mai multe dintre dumneavoastră psets, ai avut un fel de program de
scris într-un fișier punct c.
Și atunci va trebui sa tastezi face.
Deci, ceea ce se face aici?
>> Aveți posibilitatea să tastați face pentru a compila dvs. Programul deoarece someone--
cine a scris setul p; probabil pe David
a creat un fișier face.
Și asta spune face să știți pentru a rula dvs. compilator, numit zăngănit, că voința
apoi compila codul sursă de a se opune cod, care este zero si unu
care computerul înțelege.
Dar un pic mai târziu, vom merge mai în profunzime despre compilatoare.
>> Deci amintesc PSET 0, Unde-- da, Ai o intrebare?
>> Audiența: [inaudibil]?
>> SPEAKER 1: Da.
Eu cred că ei de fapt ar trebui să fie on-line.
Da.
>> Audiența: Este ca [inaudibil]?
>> SPEAKER 1: Nu este.
Sunt pe cs50.net/quizzes.
>> Audiența: teste Slash, slash 2013, slash 0, și doar să faceți clic prin intermediul
teste 2013 și quiz 0, revizui diapozitive secțiune.
>> SPEAKER 1: Da, așa că dacă vreți să trageți-o în sus și uită-te la el pe dumneavoastră
calculator propriu, care e prea bine.
Spune că din nou.
>> Audiența: [inaudibil].
>> SPEAKER 1: Da, [neauzit] este variabila dummy.
Oh, da?
>> Audiența: [inaudibil]?
>> SPEAKER 1: Nu, greve nu sunt la examen.
Ne pare rău, întrebarea ei a fost, a fost greve la examen.
Și nu este.
Deci PSET 0, voi ar trebui să aibă toate implementat ceva folosind zero.
Și am învățat ceva de programare de bază blocuri folosind zero.
>> Deci, haideți să aruncăm o privire la unele din aceste blocuri
care alcătuiesc un program de.
În primul rând este expresie booleană.
Expresii booleene sunt cele și 0 sau ceva care are
două valori posibile.
În acest caz, adevărat sau fals, pornit sau oprit, și da sau nu.
Un exemplu de simplu, foarte simplu, program care utilizează un Boolean
expresie aici.
>> Deci, în scopul de expresii booleene la fi util, avem operatori booleeni.
Acestea sunt operatorii care pot fi utilizate pentru a compara anumite valori.
Deci avem și sau nu este egal cu, mai puțin mare sau egal cu, sau mai mare decât
egal cu, și mai puțin de sau mai mare.
Dar acești operatori nu sunt foarte utile dacă nu le putem combina în
condiții.
>> Deci, voi s-ar putea aminti de la zero și de la p dumneavoastră stabilește că ne-am
avut condiții.
Ele sunt, în esență, ca și furci în logica a programului, care
execută funcție de faptul dacă o condiție este îndeplinită.
Deci, una dintre condițiile pe care le-am avut folosit de multe ori în acest curs este
în cazul în care, în altă, în cazul în care, și condițiile de altceva.
>> Iată un exemplu de cât de s-ar putea folosi.
Stie cineva diferenta dintre folosind doar dacă declarațiile tuturor
drumul în jos versetele dacă, altceva, dacă, și mai combinat?
Da?
>> Audiența: [inaudibil].
>> SPEAKER 1: Exact.
Deci, dacă am avut, dacă tot drumul în jos această Astfel, chiar dacă această condiție se întoarce
adevărat, acesta va continua testarea următoarele două.
Întrucât, cu un altfel-în cazul în care, o parte declarație, în cazul în care cel returneaza true,
ceilalți nu sunt testate.
Orice întrebări despre asta?
Se răcește.
>> Deci, să utilizați un if-else de o parte declarație dacă știți că se poate doar
fie unul din aceste cazuri.
Deci știm dacă x este mai mic de 0, este cu siguranta nu va fi
mai mare decât 0.
>> Apoi, un alt bloc că am învățat sunt bucle.
Avem trei tipuri de bucle.
Pentru bucle, în timp ce buclele, și de a face în timp ce buclele.
Și, în general, atunci când stai jos pentru a scrie ceva, va trebui să decidă
Care dintre cele trei pe care doriți să o utilizați.
Deci, cum putem decide care unul?
>> Noi folosim, în general, o buclă, dacă știm de câte ori ne-o dorim pentru a repeta
prin ceva sau de câte ori ne-o dorim pentru a efectua o sarcină.
Noi folosim în timp ce buclele dacă avem nevoie de ceva condiție pentru a fi adevărat pentru a păstra funcționare.
Și noi folosim face în timp ce foarte asemănătoare cu în timp ce, dar vrem codul nostru pentru a rula la
puțin o dată.
>> Deci în timp ce, tot ce este în a face voia se execută întotdeauna cel puțin o dată.
Întrucât, cu acest timp, ea nu poate rula la toate, dacă
condiție nu este îndeplinită.
Orice întrebări cu asta?
>> Deci structura unei bucle de.
Voi ați văzut toate astea.
Ai inițializa.
Ai un fel de stare.
Deci, de exemplu, s-ar putea inițializa ca de i este egal cu 0.
i este mai mic de 10.
Și i ++.
Unul foarte simplu, pe care le-am făcut.
>> Pentru o buclă în timp ce, în mod similar, aveți pentru a avea un fel de initializare,
un fel de stare, și un fel de actualizare.
Astfel încât să putem pune în aplicare nostru de buclă, de asemenea, ca o buclă în timp ce utilizați acest lucru.
Și în mod similar cu un do în timp ce buclă, am putea avea ceva de initializare,
executa ceva, o actualizează, și apoi verificați starea.
>> Deci, acum funcții.
Am pus totul împreună.
S-ar putea dori să scrie unele tip de funcție.
Funcția comun, care s-ar putea s-au văzut deja este principal.
Principal este o funcție.
Ea are un tip de întoarcere, int.
Ea are un nume de funcție, principal.
Și are argumente, argc și argv.
Deci principal este doar o funcție.
>> Alte funcții ce le-ar putea fi utilizate, printf printf-- este un function--
Getint, toupper.
Dar acestea se întâmplă să fi fost implementat pentru noi de
un fel de bibliotecă.
Dacă voi aminti inclusiv această bibliotecă CS50.h sau
I standardul / bibliotecă O.
Da, întrebarea?
>> Audiența: Este principal doar inerent în c?
Are doar un fel de [inaudibil]?
>> SPEAKER 1: Întrebarea este dacă principal este inerentă în c.
Și da, toate funcțiile au o funcție principală.
E un fel de necesare pentru calculator să știe de unde să înceapă
rularea codului.
>> Audiența: Deci nu ar fi [inaudibil]?
>> SPEAKER 1: Nu
Orice alte întrebări?
Se răcește.
Deci, la fel ca tine se poate utiliza o funcție care este scris pentru tine, puteți, de asemenea
scrie propria funcție.
Aceasta este o funcție care cineva s-ar putea s-au scris pentru a calcula volumul
unui q, de exemplu.
Există un tip de revenire aici, în acest caz, Int, numele nostru funcție q și noastre
listă de parametri.
>> Și rețineți că trebuie să scrie datele tip de parametrul pe care doriți să
utilizați sau altfel funcția nu știu ce fel de
parametru ar trebui să fie de acceptare.
Deci, în acest caz, ne-o dorim un număr întreg ca intrare noastră.
Deci, de ce s-ar putea ne-am dori să utilizați funcții?
>> Mai întâi de toate, o mare pentru organizație.
Ele ajuta rupe codul în mai organizat bucăți și face
mai ușor de citit.
Simplificare.
Acest lucru este bun pentru proiectare.
Când citești o bucată de cod și funcția principală este într-adevăr,
foarte lung, ar putea fi mai greu de motiv cu privire la ceea ce se întâmplă.
Deci, dacă se descompun în funcții, ar putea fi mai ușor de citit.
Și de reutilizare, capacitatea.
Dacă aveți o bucată de cod care fiind numit sau a alerga de mai multe ori,
în loc de a rescrie codul de 10 ori în funcția principală, s-ar putea
doriți să-l refolosi.
Și atunci de fiecare dată când aveți nevoie pentru a utiliza ca bucată de cod, apelați funcția.
>> Deci, acum, dacă ne amintim din nou la zero, am vorbit, de asemenea, despre câteva concepte,
dintre care unul este filetat.
Subiect este conceptul de multiple secvente de cod
executare, în același timp.
Deci, cred că înapoi la o zi în care David a avut voi conta pe numărul de
persoane in camera.
>> În esență, ceea ce se întâmplă pe este tot de voi au fost
rularea fire separate.
Și aceste fire au venit împreună pentru a obține un fel de răspuns.
În mod similar, în Scratch, atunci când aveți mai multe sprite, s-ar putea
au o pisică și un câine.
Și ei ar fi în același timp rularea script-uri proprii.
Acesta este un exemplu de filetare.
>> Și un alt concept care a fost introdus în zero a fost evenimente.
Iar evenimente sunt atunci când mai multe părți ale codul comunice unul cu celălalt.
În Scratch, aceasta a fost atunci când ați folosit controlul de difuzare și când am
Primiți blocuri.
>> Și, de asemenea, în Problema Set 4, am văzut un pic de evenimente, de asemenea.
Voi ar putea fi folosit biblioteca Gevent.
Și acolo a fost o funcție waitForClick în care ați fost de așteptare
pentru ca utilizatorul să faceți clic.
Și faceți clic, în acest caz, ar fi eveniment și așteptați pentru click este dumneavoastră
tratare a evenimentului.
>> Și, de asemenea, pe tot parcursul rulează psets dvs. și de lucru pe psets tale,
ar fi putut intra în contact cu unele dintre aceste comenzi.
Aceasta este ceea ce ați tastat în ta fereastră de terminal sau orice fereastră
care apare pe g de editare pentru a, în esență, naviga pe computer.
>> Deci, de exemplu, LS listează conținutul unui director.
Fa directorul creează un nou director.
CD, directorul schimbare.
RM, elimina, șterge un fișier sau unele director.
Și apoi scoateți director elimină un director.
>> Audiența: [inaudibil]?
>> SPEAKER 1: Da, sigur.
Ne pare rău, întrebarea a fost dacă ar sugera punerea aceasta
pe foaia de ieftin.
S-ar putea ajuta.
Dacă aveți cameră, îl puteți pune pe.
Este, de asemenea, doar în general destul de bun să ne amintim că atunci când îl folosiți
ați putea dori să doar l-au memorat.
Asta va face viata mult mai usoara.
V-am răspuns la întrebare?
>> Deci, acum, am vorbit un pic pe scurt despre biblioteci.
Dar cele două cele mai importante pe care le-am avut folosind până în prezent în curs sunt
I / O standard și CS50.
Ce fel de lucruri sunt incluse în standard / biblioteca I O?
>> Da, până acum am folosit printf.
În CS50, am folosit getint și getString.
Iar șirul de tip de date se întâmplă, de asemenea, să fie declarat în această bibliotecă CS50.
Vom vorbi un pic mai mult în profunzime despre cum bibliotecile de lucru și modul în care acestea
interacționează cu restul codului.
Dar acestea sunt cele două cele mai importante pe care le au venit în contact cu atât de mult în
curs.
>> Tipuri.
Acestea sunt bine să ne amintim cât de mult fiecare tip este reprezentat de sau cum
de multe bytes fiecare tip de requires--
int, 4 octeti; char, 1 octet.
Float este de 4 bytes.
Ce este un dublu?
>> Audiența: [inaudibil].
>> SPEAKER 1: Da, deci un flotor dar dubla dimensiunea.
Ce zici de un lung?
>> Audiența: [inaudibil].
>> SPEAKER 1: OK.
Ce este un lung?
>> Audiența: [inaudibil].
>> SPEAKER 1: Da, dubla un int.
Da.
>> Audiența: [inaudibil].
>> SPEAKER 1: lung [inaudibil].
Și apoi o lungă lung este dublu.
>> Audiența: Nu, nu.
Un lung este doar un int.
Depinde de arhitectura înainte de [neauzit]
și int au aceeași dimensiune.
[Neauzit].
>> SPEAKER 1: Deci, un lung și un întreg sunt aceleași.
Și apoi un lung lung este dublu int.
Se răcește.
Și atunci, care este ultimul tip?
>> Audiența: Pointer.
>> SPEAKER 1: Da, așa că am învățat un pic despre indicii.
Și indiferent de ceea ce un pointer este arătând sa-- ar putea fi o stea char
sau un int star--
este întotdeauna 4 octeți pentru un pointer.
Întrebări despre asta?
Da?
>> Audiența: [inaudibil]?
>> SPEAKER 1: Deci, un lung și un int sunt la fel și în acest aparat CS50.
>> Audiența: Aparatul este complet interschimbabile.
>> SPEAKER 1: Da.
Deci, atunci un lung lung este dublu o Int.
>> Audiența: Aceasta este pe 32 de biți?
>> SPEAKER 1: 32 bit, da.
>> Audiența: Deci [inaudibil]?
>> SPEAKER 1: Da, dacă nu spune în mod explicit, te
ar trebui să-și asume un pic 32.
>> Audiența: S-ar spune ceva ca presupunând o
Arhitectura ca aparatul.
Pentru 64 de biți, singurele lucruri pe care schimbare sunt lungi și indicii.
Amândoi [neauzit].
>> SPEAKER 1: Da?
>> Audiența: Întrebare.
Deci, pe una din chestionare practică, se întreabă despre un unsigned int.
Deci, cum s-ar fi stabilit că de la un int [inaudibil]?
>> SPEAKER 1: O nesemnat este, de asemenea, în 4 octeți.
Dar ceea ce este diferit despre un semnat int și un unsigned int?
>> Audiența: [inaudibil].
>> SPEAKER 1: Corect.
Se poate reprezenta valori negative.
Dar cum se face asta?
>> Audiența: [inaudibil].
>> SPEAKER 1: Da, se economisește 1 biți pentru a reprezenta semnul.
Semnat are un pic că reprezintă semnul.
Și nesemnat doar este tot pozitive.
>> Audiența: OK.
Deci spui că o dublă este două ori mai mare de un flotor?
>> SPEAKER 1: dublu este de două ori de mărimea unui flotor, da.
>> Audiența: Cum poate un pointer pentru o lungă lung [inaudibil]?
>> SPEAKER 1: Deci, întrebarea este cum se indicatorul la o long-- lung
cum este faptul că doar patru bytes atunci când un timp lung sale de 8 bytes.
Deci, amintiți-vă ce este un pointer, în esență, la valoarea de bază foarte.
>> Audiența: [inaudibil].
>> SPEAKER 1: Da, deci un pointer este doar o locație de memorie.
Deci, nu contează cât de mult spațiu că indicatorul este îndreptat la.
Este nevoie doar de 4 bytes pentru a ține evidența de ce locație de memorie.
Orice alte întrebări?
Se răcește.
>> Deci, ultimul lucru pe care am este de ieșire standard.
Ar trebui să le folosească în mod frecvent suficient că vă puteți aminti.
Dar acest lucru este atunci când vom folosi printf, de exemplu.
Și avem aceste substituenți care au fost numite coduri de format.
>> Deci la sută c char, procente i pentru int, și putem folosi, de asemenea, procente d.
E același lucru.
Dar, în general, în CS50 noi încercați să utilizați la sută i.
Procent f pentru float.
Ld la suta pentru mult timp lung și la sută s pentru șir.
>> În mod similar, am fost folosind câteva dintre aceste secvențe escape.
De exemplu, backslash n pentru noua linie.
Acest lucru este doar pentru atunci când sunteți de formatare codul pentru imprimare f.
Da?
>> Audienta: Care este suta d pentru?
>> SPEAKER 1: Deci, întrebarea este ceea ce este suta d pentru?
Procentul d este pentru int.
Procentul d și i la sută sunt la fel.
>> Audienta: Care este diferența dintre backslash n și backslash r?
>> SPEAKER 1: Deci, întrebarea este ce este diferență între reacție și n
r reacție?
Cred că backslash r este--
>> Audiența: Deci backslash r implică doar se întoarce la începutul liniei
fără de fapt de gând să o linie nouă.
Deci, dacă imprimați o bară oblică inversă r și tu du-te înapoi la începutul liniei
atunci când imprimați mai multe lucruri, voi suprascrie lucrurile care-i deja pe
[Neauzit].
Întrucât, n fapt duce la o nouă linie și se duce la [neauzit].
>> SPEAKER 1: Ei bine, orice alte întrebări?
În regulă.
Am de gând să-l mana off la Dan, care va continua.
>> [Aplauze]
>> DAN: În regulă.
Așa că voi vorbi despre un alt mare Gama de idei de la clasa, care sunt
aproximativ reprezentant de doua saptamani, si începutul săptămânii trei demarare
cu turnare, care este doar un mod de tratarea unei valori a unui anumit tip ca
o valoare de un tip diferit.
Deci, putem face acest lucru cu caractere de int, float la int, și
tânjește după lungi să se dubleze.
>> Toate aceste lucruri pot fi utilizate ca modalități de a trata o anumită valoare numerică
minus char ca un alt valoare numerică.
Deci, există unele probleme cu acest lucru, de Desigur, care vine atunci când aruncat
lucruri cum ar fi float la int.
Deci, acest lucru este un pic ciudat.
Avem un flotor care este 1,31.
Am multiplica de 10.000.
Și apoi ne-am imprima ca un întreg.
Ce face această ieșire?
10.000 de ori 1,31.
Deci 13.000, este că ghici?
>> Audiența: Cred că e de 10.000.
>> DAN: Deci, eu sunt o multiplicare de 10.000 înainte eu o turnare.
>> Audiența: Oh.
Nu ar fi existat un 9 și niște numere 0?
>> DAN: S-ar putea avea unele cifre ciudate.
Deci, chiar, este de 1,3 ori mai 10000.
Deci, asta e 13000.
Și acest weird-- suplimentar
>> Audiența: 13.100.
>> DAN: 13.100.
Mulțumesc, Rob.
Și acest weirdness-- suplimentar
acest 9,9--
este pur și simplu pentru că acest casting sfârșit de rotunjire în jos în cazul în care
aceasta nu ar trebui să aibă.
Da.
>> Audiența: turnare se întâmplă după altceva?
>> DAN: Deci, pentru ca am aceasta în print, ea face această multiplicare înainte
face acest lucru de turnare.
>> Audiența: [inaudibil].
>> DAN: Cred că ar arunca în primul rând, da, care ar fi de 10.000.
Altceva?
Se răcește.
Deci, aceasta este 13099.
De ce se întâmplă acest lucru?
Imprecizie.
>> Pluteste nu sunt perfecte.
Ele pot reprezenta doar numere la un anumit număr de cifre semnificative.
Deci, dacă ne-am imprima 8 smochine sig pe acest float, avem un fel de
Numărul de urât caută.
Și asta pentru că nu se poate cu exactitate 1.31 fi reprezentat prin simpla
puteri de două în mașină.
Deci, se termină prin a lua cel mai apropiat ghici, care se încheie până
fiind un pic mai jos.
A face sens?
OK.
>> Acum, trecut sunt un mod diferit de face declarații condiționale în cazul în care toate
ne pasă este o singură variabilă.
Deci, în acest exemplu particular, suntem obtinerea un număr întreg de la utilizator.
Și apoi ne uitam la ceea ce este că întreg.
Probabil, acesta este numărul între unu și patru.
Asta e ceea ce ne cere.
>> Deci, ce faci un comutator de numele variabilei.
Apoi înființat de cazuri de posibile valorile pe care le-ar putea fi.
Deci un caz, spun că este scăzut.
Și apoi pauza pentru a iesi a stării comutatorului, astfel
tu nu mergi.
>> În case-- următor
așa caz două și caz three--
dacă este cazul doi doar scade la prima linie de cod se vede ca cu
un caz trei până se vede o pauză.
Deci, motivul pentru care te cazul în care una la doar de imprimare redus se datorează faptului că am
au această pauză aici.
Dacă eu, să zicem, a ignorat acest break-- dacă am aruncat acest breakaway--
ar imprima scăzută, iar apoi aceasta ar imprima mijloc, și apoi s-ar rupe.
>> Deci, pauzele sunt o parte importantă a schimba condițiile și
acestea ar trebui să fie acolo.
Orice cazuri care nu sunt declarate în mod explicit sunt gestionate de către implicit
caz în comutatorul și ar trebui să fie exprimate.
>> Audiența: Deci 1, 2, 3, și 4 ar fi n?
>> DAN: Valorile pe care n poate fi.
Da.
Da?
>> Audiența: Deci, atunci când aveți că [inaudibil]?
>> DAN: Ai imprimați scăzut, și apoi s-ar imprima de mijloc, și
atunci s-ar rupe.
>> Audiența: De ce s-ar imprima de mijloc dacă [inaudibil]?
>> DAN: Deci, totul sub un caz înainte de o pauză cade sub.
Deci caz unul de imprimare este cazul sub una ca asta urma imprimare.
Da?
>> Audiența: [inaudibil]?
>> DAN: Deci, acest număr este doar un anumit Valoarea că această variabilă
pot lua, nu?
Are vreun sens?
Da.
>> Audiența: [inaudibil]?
>> DAN: Da, caz doi s-ar imprima de mijloc și apoi rupe.
>> Audiența: [inaudibil]?
>> DAN: Cred ca orice?
Ce alte tipuri de date poti trece peste?
>> Audiența: se poate trece peste orice tipuri de date.
Dar aceasta înseamnă doar ceva peste caractere și int si chestii de genul asta, pentru că
Dacă treceți peste un pointer că nu prea are sens,
trecerea peste sarcini, în cazul în care chiar să să faci asta, pentru că de virgulă mobilă
în precizie, nu ar fi într-adevăr vrei sa faci asta oricum.
Deci, destul de mult, doar int și caractere și chestii de genul asta.
>> DAN: Da, e atunci cand ai explicită Valorile pe care le cunosc, cred, pot fi
că un comutator este, de fapt util.
Bine?
OK.
>> Domeniul de aplicare este intervalul pe care o declară variabila se extinde.
Deci, în acest mic bucata de cod am, ar fi plin de erori.
Iar motivul este am declarat acest lucru int i în domeniul de aplicare a prezentei pentru buclă.
Și apoi am încercat de referință care i în afara de faptul că pentru domeniul de aplicare buclă.
>> Deci, practic, vă puteți gândi despre domeniul de aplicare ca ceva ce declara
cu interiorul unui set de acolade numai există în aceste acolade.
Și dacă încercați și de a folosi ca variabilă in afara de aceste acolade, veți
obține o eroare de compilator.
Da?
>> Audiența: Deci asta nu merge?
>> DAN: Acest lucru nu funcționează, da.
Strings.
String un char *.
Sunt exact la fel.
Acestea sunt doar indicii pentru a caracterelor.
Și toate siruri de caractere pe care le au trebuie să se termine cu backslash la zero, care este doar
o convenție c.
>> Este numit terminator nul.
Și NULL--
de capital N, capitalul U, de capital L, capitalul eu--
nu este la fel ca Terminator NULL.
Acesta este un pointer.
Acesta este un personaj.
Ei sunt foarte distincte.
Amintiți-vă că.
Acesta va fi pe testul, probabil.
Nu am văzut testul.
Da?
>> Audiența: Deci NULL este, să zicem, indicatorul?
>> DAN: Da.
>> Audiența: Ce [inaudibil]?
>> DAN: În cazul în care, spune, malloc se numește atunci când nu are suficientă memorie pentru a obține
indiferent de mărimea ceri, malloc va întoarce NULL.
Este, de fapt, de fiecare dată când o funcție este Trebuia să se întoarcă un pointer, tu
trebuie să verificați împotriva NULL deoarece NULL este un good-- destul de
e, un fel de, valoarea gunoi.
E un zero în ceea ce privește indicii merge.
>> Ori de câte ori te sun o funcție, care returnează un pointer.
Ai de gând să doriți să verificați pentru a fi vă că indicatorul nu este NULL
deoarece NULL este foarte comun.
Este un fel de întoarcere gunoi.
Deci, dacă ceva nu merge bine, doar întoarce NULL în loc.
>> Audiența: [inaudibil]?
>> DAN: Da, și asta e.
>> Audiența: [inaudibil]?
>> DAN: Spell-l ca aceasta.
Este terminatorul NULL.
Este minuscule N-U-L-L, dacă tu scrii cum.
>> Audiența: Și m-am dus înapoi și testat.
Și dacă încerci să pui o virgulă mobilă valoare într-un comutator, va țipa la tine
spunând, declarația necesită expresie de tip întreg.
>> DAN: Nu te duci.
Dar da, care a fost din nou întrebarea?
>> Audiența: [inaudibil]?
>> DAN: Deci de capital N, capitalul U, de capital L, capitalul L este un lucru real c.
Acesta este indicatorul NULL și va fi tratate ca atare.
Nu vei încerca vreodată și vraja Caracter NULL și vedea orice
alt mod decât aceasta.
Da?
>> Audiența: Deci, revenind la char max sau ceva în note, ar fi o
întruchipează aceeași funcție ca [inaudibil]?
>> Audiența: Deci, vă referiți la revenind char max de getchar, sau
oricare ar fi ea?
>> Audiența: Da.
>> Audiența: Da, așa generalul pe termen lung pentru toate aceste lucruri
sunt valori santinelă.
Deci, cum ar fi revenirea int max de getint și char max de getchar, este
ar trebui să fie ca, bine, dacă aceste lucruri se întorc la noi,
ceva a mers prost.
>> Pentru indicii, doar se întâmplă să avem această valoare santinelă care toată lumea
este de acord.
Și acesta este un lucru vă întoarceți atunci când lucrurile nu merg bine.
Deci, char max este ceea ce suntem cu ajutorul pentru a reprezenta ceva
cum ar fi NULL sau getchar.
>> Audiența: Deci, dacă sunteți de testare getchar, doar ai putea pune NULL?
Ar face o diferență?
>> DAN: Nu puteai doar verifica NULL.
Ar trebui să verificați char max deoarece valoarea returnata de functia este
un personaj nu un pointer.
Da?
>> Audiența: Această întrebare cere pentru lungimea șir.
Asta include caracterul NULL?
>> DAN: Nu
Și asta e de fapt modul în care lungimea șirului știe să se oprească pentru că trece prin
matrice dvs. de caractere până se vede un caracter NULL.
Și atunci e ca si cum, tot Bine, am terminat.
>> Audiența: [inaudibil] cinci?
>> DAN: Buna ziua ar fi cinci.
Da.
Deci, matrice sunt continue blocuri de memorie.
Ei au acces instant prin a spune numele de matrice și apoi, în creț
bretele, indiferent de index vrei să mergi a, acestea sunt indexate de la zero, prin
lungimea matrice minus 1.
>> Și acestea sunt declarate de tipul de lucru pe care tu stocarea în
matrice, numele de matrice, și apoi indiferent de dimensiunea este de care matrice.
Deci, aceasta este o matrice char de lungime șase care are aceste valori.
Da?
>> Audiența: [inaudibil]?
>> DAN: Da.
>> Audiența: [inaudibil]?
>> DAN: Dacă aveți ceea ce se întâmplă în tabloul deja făcut.
Deci, ai putea specifica acest lucru în schimb ca, să zicem, char, oricare ar fi numele tău
matrice este, paranteze goale este egal cu buclat bretele H virgulă E virgulă L virgulă L virgulă
O virgulă caracter NULL și acoladă.
Asta ar lucra, de asemenea, ca o declarație.
>> Audiența: [inaudibil]?
>> DAN: Apoi, trebuie să aveți dimensiunea deja făcut.
>> Audiența: [inaudibil]?
>> DAN: Da.
În regulă.
Argumente în linia de comandă sunt o modalitate de obtinerea de intrare de la utilizator ca
argumente principale.
Principal are două argumente.
Numărul de argumente care este în curs de a trecut de-a lungul liniei de comandă și un
vector șir sau un tablou șir de toate argumentele.
>> Deci, dacă eu, să zicem, denumit o funcție, cum ar fi un punct în spațiu 1, 2 spațiu, trei,
argc ar fi 4.
Și argv 0 ar fi un punct afară.
Argv1 ar fi 1.
argv2 ar fi 2 argv3 ar fi 3, în care caz particular.
Da?
>> Audiența: [inaudibil]?
>> DAN: Ultimul element în matrice deoarece matricea este de lungime argc plus
unul dintre ARGB, ultimul element este indicatorul NULL.
Este argc plus 1.
Deci, în cazul în care tocmai am spus, ar fi argv 0 este un punct afară.
argv 1 este 1 argv2 este 2 argv 3 este 3.
argv 4, care este unul mai mare decât argc ar fi NULL.
>> Și asta e pointer nul.
Da.
Si asta pentru ca șir este o stea char este un pointer.
Deci trebuie să fie de același tip.
Da?
>> Audiența: Două întrebări.
Deci unul, care-i diferența dintre aceasta și alte mult de un tip getString
în motorul de utilizator?
Și doi, este stocată în memoria recenta?
Deci cum ar fi, getString ar fi [inaudibil]?
>> DAN: În cazul în care este stocată?
Nu știu unde este stocat.
>> Audiența: Deci, de fapt, tu știi cât de orice funcționeze te sun e argumente
sunt stocate în stivă?
Deci, argc și argv sunt argumente pentru principal și ele sunt în stivă, sau chiar
chiar mai sus ce crezi ca începutul stivei.
Ce a fost pe de altă parte se pune problema?
>> Audiența: Deci, care este [neauzit]?
>> DAN: Da, e doar un mod diferit de a obține de intrare de la utilizator.
Puțin mai eficient și asta e este mai util pentru scripturi pentru că
poate trece doar argumente pentru dvs. principal funcție mai degrabă decât a fi nevoie să aștepte
pentru utilizatorii dacă nu aveți nici utilizatori.
>> Audiența: Și da, te siruri de caractere ar fi [neauzit].
S-ar stoca lucrurile care aveți nevoie.
>> DAN: Da?
>> Audiența: [inaudibil]?
>> DAN: Da, argv 0 include întotdeauna punct slash de apelul funcției.
Da?
>> Audiența: [inaudibil]?
>> DAN: Da, fiecare dintre argumentele sunt încheiat în caracter NULL, deoarece acestea
sunt siruri de caractere.
>> Audiența: [inaudibil]?
>> DAN: Da, argv argc este un pointer NULL.
>> Audiența: [inaudibil]?
>> DAN: Oh, da.
Da, îmi pare rău.
>> Audiența: Deci [inaudibil]?
>> DAN: Deci, întrebarea este dacă ați avut linie de comandă punct slash un punct din 1, 2,
ar fi numărul de linie de comandă argumente fi două sau ar fi trei?
>> Audiența: Cred că nu într-adevăr contează.
Am tendința de a spune, oh, nu a trecut orice argumente în linia de comandă atunci când,
evident, ai sunat funcția.
Așa că am tendința de a exclude vocal funcție de linia de comandă
argumente, chiar dacă este incluse în argv.
>> DAN: Dar dacă ar fi fost pe test--
Da-- și, de asemenea, dacă vă spune ceva ca argc este egal cu 3,
tu ești în picioare în siguranță.
Da?
>> Audiența: [inaudibil]?
>> DAN: Cred că dacă în loc de asteptare acest în argc și argv șir paranteze
dar a păstrat aceleași tipuri și tocmai a sunat le ceva diferit ca o
și b, ar mai merge?
Și ar funcționa în continuare, v-ar doar--
în loc de a folosi argc-- v-ar folosi o și b.
Da?
>> Audiența: [inaudibil]?
>> DAN: Deci, întrebarea este getString este va stoca memorie în memoria heap
pentru că getString este char *.
Se stochează memorie în heap, deoarece invită acum malloc în real
punerea în aplicare a getString.
OK, se deplasează pe.
>> Securitate.
Deci, pentru a fi cu adevărat sigur, te bazezi pe nici o una și voi permite nici un acces la orice
a informațiilor, care este motivul pentru care toată lumea construiește propriile mașini,
propriile sisteme de operare, toate lor Programele de la zero, și, evident,
Nu conectați la alte masini prin intermediul internetului.
Deci, calculatoarele sunt nesigure.
Ele sunt într-adevăr.
Trebuie să avem încredere altor persoane.
>> Iar ideea de securitate este că ești încercarea de a limita cantitatea de
încredere de care aveți nevoie.
Și unul dintre mijloacele să faci asta este prin criptografie.
Criptografia este, în esență, avem secrete.
>> Uneori trebuie să treacă secretele noastre de-a lungul prin, să zicem, pe internet sau
alte lucruri.
Și nu vrem oameni să cunoască aceste secrete.
Așa că ne-am cripta secretele noastre într-un mod care sperăm că nimeni nu poate da seama.
>> Așa că am used--
prin cursul acestei class--
lucruri cum ar fi Cezar cifru și [Inaudibil], care sunt amândoi foarte, foarte
metode nesigure de criptare lucruri.
Sunt ușor să dau seama ce se sunt și secretele tale.
Lumea reală utilizează mult mai mult scheme de criptare complicate.
Și nu vom intra în mult mai mult decât atât.
>> Depanare.
GDB este cel mai bun.
Am de gând să sublinieze acest lucru din nou.
Utilizați GDB tot timpul fiecare timp aveți o problemă.
Comenzile care sunt utile în GDB sunt rupe, ceea ce treci, fie o linie
număr, un nume de funcție, în esență, în cazul în care în codul pe care doriți să se oprească,
și să fie capabil să preia controlul.
>> Print ia o variabilă și tipărește indiferent de faptul că variabila este la faptul că
punct în execuție ta.
Înainte mișcă execuție ta de-a lungul cu un pas.
Și pas pași în interiorul unei funcții în execuție ta.
>> Alte lucruri sunt rulate, care este modul în care executați de fapt codul.
Continuați ia toate măsurile necesare pentru a ajunge la următorul punct de spargere.
Și acolo sunt multe, multe altele.
Uite-le.
Sunt mare.
Da?
>> Audiența: [inaudibil]?
>> DAN: Da, care este un program de depanare.
Deci, un debugger este un program care vă permite să depanare programul tău.
Nu este un program care găsește bug-uri pentru te, deși asta ar fi grozav.
>> Și nu în ultimul pentru mine este de căutare.
Deci, tipurile de căutare care am vorbit despre în această clasă sunt căutare liniară,
care este doar că te uiți prin fiecare element al spațiului de căutare, una
element de la un moment dat, până când găsiți ceea ce sunteți în căutarea pentru sau până când ajunge
la sfârșitul anului spațiu de căutare la care punctul spui că nu ai putut găsi
elementul pe care îl căutați.
Și acest lucru este nevoie de timp, la cel mai bun constantă, care este 0 din 1 și cel mai rău caz liniar
timp, care este de n 0.
>> Binar de căutare, care are nevoie de elemente sordide.
Te duci la mijlocul elemente tale, vedea dacă elementul sunteți în căutarea pentru
este mai mare sau mai mic decât elementul că tu ești la mijloc.
Este e mai mare, vă spun că în partea de jos de căutare spațiul este ta
locația curentă, la mijloc, și repornirea procesului.
Dacă este mai mic, te uiti spune că Cel-- da, care-i treaba?
>> Audiența: [inaudibil]?
>> DAN: Da.
Orice fel de fel care a fost predat în clasa este un joc cinstit pentru testul.
>> [Râsete]
>> DAN: Și faptul că nu au avut să facă acest lucru pentru un set de probleme, este corect
joc pentru testul.
>> Audiența: Putem trece peste asta cum sa--
>> DAN: Acesta va fi trecut peste.
>> SPEAKER 2: codul actual de [Inaudibil] este pe study.cs50.net.
Deci, dacă te uiți la problema practică în pagina de îmbinare fel de
study.cs50.net, există codul pentru punerea în aplicare a fuziona fel.
Deci, nu trebuie să pună în aplicare el singur în seara asta.
Dar asigurați-vă că înțelegeți destul de decât doar memorarea.
>> Audiența: [inaudibil]?
>> SPEAKER 2: Pagina de îmbinare fel pe study.cs50.net, există o practică
problema că, dacă faceți clic prin intermediul problemă, chiar la sfârșitul există o
soluție, care este reprezentată de fuziunea implementarea fel.
Dar asigurați-vă că înțelegeți mai degrabă decât doar o memorare
sau copierea jos.
>> Audiența: Și o perfect valabil problemă pentru examenul ar fi
ceva de genul aici o listă.
Ce această listă arăta după un pas de selecții fel sau
un fel de introducere sau orice altceva.
O iterație completă a listei.
Deci, chiar dacă nu ajung a fi nevoie să cod pentru el, trebuie să-l înțeleagă
suficient pentru a ști cum se întâmplă pentru a se modifica această matrice.
>> DAN: Asta e pentru mine.
>> [Aplauze]
>> LUCAS: Salut tuturor.
Numele meu este Lucas.
Am de gând să vorbesc despre recursivitate, toate soiurile pe care le-am învățat, și un
pic de toate indicii.
OK?
Deci, în primul rând, recursivitate.
Ce înseamnă să spun că o funcție este recursivă?
>> Audiența: se solicită.
>> LUCAS: OK, se cheamă, da.
Deci mult de această imagine, de exemplu.
E ca si cum imaginea interior de o imagine și așa mai departe.
Deci, de exemplu, puteți avem-- ca Dan că a fost vorba despre binar de căutare.
O modalitate în care binar de căutare este recursiv este faptul că tu ești
încercarea de a găsi un număr.
Deci, te duci la mijloc.
Și apoi verificați dacă numerele de acolo în stânga și în dreapta.
>> Și apoi, dacă afli numărul este va fi pe stânga, e la fel
lucru ca a face căutarea din nou, dar doar pe partea stângă a listei.
Deci așa sună ca e recursiv.
De aceea voi avea recursiv soluție pentru îmbinare fel.
>> OK, deci aici este un exemplu.
Să zicem că vreau să aleagă toate numerele de la 1 la n.
Pot să dau seama că suma de n număr este n plus n minus 1 pana la 1.
Dar, apoi, dacă mă uit la n minus 1 plus n minus 2 plus 1, care e la fel
lucru ca numere însumând până la n minus 1.
Deci, eu pot spune suma de o sumă egală cu este egal cu n plus suma n minus 1.
Are vreun sens?
>> Și eu, de asemenea, ar fi altceva denumit cazul de bază, și anume că
suma numerelor până la zero ar fi zero.
Deci, de îndată ce ajung la numărul la zero, am opri numărare.
Are vreun sens?
>> Deci, aici e un exemplu de cum Pot pune în aplicare acest lucru.
Așa că am această funcție în unele.
Aceasta are un număr întreg n.
Deci, aici am verificați mai întâi dacă n este mai puțin sau egal cu zero.
Deci, dacă este mai mică sau egală cu zero, am a reveni la zero, ceea ce este cazul nostru de bază.
În caz contrar, mă pot întoarce doar n plus suma numerelor din
una la n minus unu.
A face sens?
OK.
>> Deci, aici e ceea ce pare.
Ai sumă de 2 egali 2 plus suma de 1.
Iar unii din 1 este 1 plus sumă de 0, care este 0.
A face sens?
Deci, dacă ne uităm la stiva de dvs. Programul, aceasta este ceea ce pare.
>> În primul rând, avem funcția principală.
Și apoi funcția principală numit sumă 2.
Și apoi suma 2 se va spune, oh, suma 2 este egal cu 2, plus suma una.
Așa că am adăuga suma de 1 la stiva.
Și suma de 1 se va numi suma de 0, care este, de asemenea, va fi adăugată
în stivă.
Și apoi fiecare dintre acestia, care sunt peste alta trebuie să se întoarcă
înainte de celelalte pot continua.
>> Deci, de exemplu, aici, suma de 0, În primul rând, este de gând să se întoarcă la 0.
Și apoi alege suma de 1.
Apoi, suma de 1 se va a reveni de la 1 la sumei de 2.
Și, în cele din urmă, suma de 2 se va pentru a reveni la 3 principal.
Are vreun sens?
>> Este foarte important să se înțeleagă modul în care stiva este de lucru și să încerce să
a se vedea dacă are sens.
OK, deci de sortare.
Deci, de ce este importantă sortarea, în primul rând?
De ce ar trebui să ne pese?
Oricine?
Dă-mi un exemplu?
Da?
>> Audiența: [inaudibil].
>> LUCAS: Da, OK.
Astfel, puteți căuta mai eficient.
Asta e un mod bun.
Deci, de exemplu, avem o mulțime de lucruri, de fapt, în viața noastră, care
sunt clasificate în funcție.
De exemplu, dicționare.
>> Este foarte important să ai toate cuvinte în vreun fel de ordine pe care le
pot accesa cu ușurință.
Deci, asta e ceea ce spunea.
Puteți căuta mai eficient.
Gândiți-vă cât de greu ar fi să avem o dicționar în care cuvintele sunt în
ordine aleatorie.
Va trebui să se uite la, destul de mult, fiecare cuvânt până când găsiți
cuvânt că sunteți în căutarea pentru.
>> Dacă sunteți folosind Facebook, de asemenea, atunci când te uiți la prietenii tăi, tu ești
O să vezi că Facebook a pus tău prieten apropiat este pe partea de sus a celor
că tu nu vorbești cu atât de mult.
Dacă merge tot drumul la partea de jos a lista ta de prieteni, veti vedea
oameni care, probabil, nici nu amintiți-vă că sunteți prieteni cu.
Și asta pentru că felul Facebook prietenii bazate pe modul în care
de aproape ești de ele.
>> Deci, organizarea datelor.
De asemenea, Pokemon.
Deci, vedeți că toate pokemoni au numere.
Și asta e ca un simplu mod de accesare a datelor.
>> Audiența: Accesarea Pokemon.
>> LUCAS: Da.
>> Audiența: [inaudibil].
>> LUCAS: Da.
OK, deci un fel de selecție.
Un fel de selecție se va selecta cea mai mică valoare a unei liste nesortate fiecare
timp în fiecare iterație.
E un fel de genul pe care le faci în capul tău atunci când sunteți încercarea de a
sorta o listă pe mână.
>> Practic, tot ce faci este arăți pentru cel mai mic număr.
Ai pus-o în lista sortată.
Și apoi te uiți pentru următor cel mai mic număr.
Și atunci când continui să faci care și așa mai departe.
>> Deci selecție fel este, în principiu tu selectați de fiecare dată cel mai mic
valoare nesortate.
Pune la sfârșitul sortate parte din lista.
Și continui să faci asta.
Deci, haideți să vedem rapid ce acest lucru arata ca.
Deci, aici e sortate și lista nesortate.
>> Deci, pentru extrase din lista, este inițial gol.
Și apoi am de gând pentru a selecta mai mic număr aici, care este de 2.
Așa că am obține numărul 2 și am pus în partea din față a listei.
Și apoi mă uit pentru următoarea cea mai mică Element, care este 3.
Așa că am pus-o la sfârșitul anului din lista sortată.
Și apoi am continua să faci asta.
Mi se pare 4 și a pus-o la sfârșitul anului.
Găsiți 5 și a pus-o la sfârșitul anului.
>> Si uita-te la modul în care toate aceste ori Spun pus-o la sfârșitul anului este,
în esență, schimbarea două valori.
OK?
Și apoi ultima, tu doar au mai un element.
Deci, este deja sortate.
>> OK, deci un fel de introducere.
Fel de inserție ai de gând să aibă, de asemenea, chestia aia de a fi un sortate și
o listă nesortate.
Singurul lucru este că de fiecare dată că adăugați un element la sortate
Lista, tu alege doar elementul care este în fața listei nesortate.
Și atunci vei găsi ceea ce poziție ar trebui să fie în Sortate
parte din lista.
>> Să vedem ce este acest lucru acest lucru face mai mult sens.
Deci, inițial, de exemplu, am încercat pentru a introduce numărul trei în
parte sortat din lista.
Deci, lista nu are nimic.
Deci, eu pot pune doar numărul 3.
>> Acum, vreau să adăugați numărul 5 a partea extrase din listă.
Așa că mă uit la numărul 5.
Am observat că este mai mare decât 3.
Deci, eu știu că trebuie să fie după 3.
Așa că am pus 3 și 5.
>> Apoi m-am dori pentru a introduce numărul 2.
Am observat că numărul 2 este de fapt dura apoi atât de 3 și 5.
Deci, am de fapt, a pus totul mod în începutul listei.
Așa că trebuie să, un fel de, Shift toate elemente în lista sortată, așa că am putea
face loc pentru numărul 2.
>> Apoi am vedea numărul 6.
Văd că ar trebui să fie după 5.
Așa că am pus-o acolo.
Și, în sfârșit, mă uit la numărul 4.
Și am observat cum ar trebui fie între 3 și 5.
Și apoi l-am pus acolo și schimbare toate celelalte elemente.
A face sens?
>> Bubble Sort.
Deci, cu bule fel este de fapt ceea ce esti O să facut-- o numim cu bule
fel pentru că te duci prin list-- este de fapt mai bine dacă am arăta
iti place asta--
și vei compara numere alăturate.
Și ai de gând să schimbe lor poziții dacă nu sunt
în ordinea corectă.
>> Deci, practic, ceea ce se întâmplă la întâmpla este aici, de exemplu,
aveți 8 și 6.
Știi că ordinul de sortat va fi de fapt 6 și 5, nu?
Deci, ai de gând să schimbe ordinele.
Apoi m-am vedea 8 și 4 aici.
Și eu fac același lucru.
Am schimba din nou.
Și, în sfârșit, 2 și 8.
Am, de asemenea, le schimba.
>> Se numește Bubble Sort pentru că, după fiecare dintre aceste iterații, de fapt,
cel mai mare număr din lista devine tot drumul spre sfârșitul listei.
Are vreun sens?
Pentru că păstrează schimbarea aceasta și se deplasează spre dreapta.
>> OK, deci aceasta este a doua iterație.
Ar fi același lucru.
Voi face un schimb și apoi ultima.
Am că nu există swap-uri iar lista este sortată.
Deci, în Bubble Sort, păstrăm practic trece prin listă și schimbarea
lucruri, până când am observat că nu am făcut orice swap-uri care fac ca repetare, ceea ce
înseamnă că lista este deja sortat.
A face sens?
>> Hai sa vorbim un pic despre timpul de funcționare.
Deci, nu voi aminti Big O, Omega, și Theta?
Da?
OK, ceea ce este Big O, în primul rând?
>> Audiența: [inaudibil].
>> LUCAS: Da, se numește o cel mai rău caz rulare, ceea ce înseamnă doar că este
cât de mult vă așteptați programul pentru a lua pentru a rula.
Cum ar fi, din punct de vedere de--
în acest case-- n.
Numărul de elemente din Lista în cel mai rău caz.
Cum ar fi, în cel mai rău caz posibil.
>> Deci, pentru Bubble Sort, de exemplu, Avem O mare de n pătrat.
De ce avem asta?
De ce este Bubble Sort Big O n pătrat?
>> Audiența: [inaudibil].
>> LUCAS: Da, deci cel mai rau caz va fi că va trebui să fac n iterații.
Deci, fiecare dintre iterații se va aduce cel mai mare element de capăt
listei.
Deci, cel mai rău caz este faptul că am pentru a face acest lucru de n ori.
Și pentru fiecare dintre aceste momente, trebuie să face n swap-uri pentru că am să compare
fiecare două elemente.
De aceea este n pătrat pentru că este de n ori n.
>> Apoi, selecție fel este, de asemenea, n pătrat pentru că, pentru fiecare iterație, trebuie să
uita-te la fiecare element de în listă.
Și apoi a găsi cel mai mic, ceea ce înseamnă că trebuie să
uita-te prin n elemente.
Și eu trebuie să fac asta de n ori, deoarece Eu am pentru a selecta toate n elemente.
>> Un fel de inserare este, de asemenea, n pătrat pentru că cel mai rău caz se va
fi, o, trebuie să introduceți N numere, nu?
Deci, eu deja știu că am de gând de a avea n iterații.
Dar, pentru fiecare dintre aceste numere, dacă am avut să se uite la toate numerele din
lista sortată și a pus-o la capăt în partea din față, care va fi n pătrat
deoarece va fi de n ori n din nou.
A face sens?
Ce zici de omega?
>> Audiența: [inaudibil].
>> LUCAS: Este cel mai bun caz.
Deci e ca, într-o mulțime de ori pentru sortarea, cel mai bun caz este
atunci când lista este deja sortat.
Deci, nu aveți cu adevărat de a face ceva.
Bubble Sort are cel mai bun scenariu caz de n.
Nu voi stiti de ce?
>> Audiența: [inaudibil].
>> LUCAS: Da, dacă vă țineți evidența dacă rația de date a avut nici un swap-uri sau
nu, dacă aveți ceva de genul setat la true dacă a existat o repetare, dacă este
Lista este deja sortate, de fapt, ce se va întâmpla este am de gând să
încercați să schimbați fiecare două elementele adiacente.
Mă duc să văd că nu sunt swap-uri.
Și mă voi întoarce imediat.
>> Deci, asta înseamnă că am avut de a du-te prin lista singură dată.
Deci, este n pentru că mă uit la n elemente.
De ce fel de selecție n pătrat?
>> Da, chiar dacă lista este sortată, pentru fiecare iterație de selecție fel, am
trebuie să selectați elementul minim.
Asta înseamnă că trebuie să te uiți afară la toate elementele din nesortate
lista și pentru a găsi minimul pentru fiecare iterație.
Are vreun sens?
>> Și sabia inserare este N, deoarece în cazul în care am încercat să introduceți
numere și toate numerele, când am încercați să le introduceți, văd că ei
sunt în poziția corectă.
Nu am sa verific toate celelalte numerele din lista nesortat.
Deci, de aceea va fi n.
A face sens?
Și ceea ce este theta?
>> Audiența: [inaudibil].
>> LUCAS: Ce, îmi pare rău?
Spune-o din nou.
>> Audiența: [inaudibil].
>> LUCAS: Exact.
Deci, puteți vedea că numai selecție stocate în Merge avea un fel thetas.
Și asta pentru că ai doar theta dacă ambele Big O și Omega sunt aceleași.
OK.
Și, în sfârșit, fuziona fel este în log n.
>> Și apoi, cum spunea Dan, Merge fel este un fel de același fel în care
ce faci binar de căutare.
Astfel încât să obțineți lista.
Și ai de gând să taie în jumătate.
Și apoi le taie în reprize mai mici.
Și apoi le îmbinați.
Voi aminti asta, nu?
OK, așa cum spunea el.
>> OK, indicii.
Deci, ceea ce este un indicator?
>> Audiența: [inaudibil].
>> LUCAS: O adresă.
OK.
Știu că David arată o grămadă de videoclipuri binky și lucruri de indicare
reciproc.
Dar mie îmi place să mă gândesc la indicii ca doar o adresă.
Deci, este o variabilă care se întâmplă pentru a stoca o adresă.
>> Deci, e doar această variabilă special care este de patru bytes lung.
Amintiți-vă, că pointer la orice este întotdeauna patru bytes lung pentru noastre pe 32 de biți
mașină așa cazul cu aparatul.
Și are doar locația unei variabile în interiorul acestuia.
>> OK, deci nu e de memorie, de fapt.
Deci, fiecare bloc de memorie este de fapt o etichetă, care este adresa
memorie slotty.
Deci asta înseamnă că eu pot avea o indicare pointer la
oricare dintre aceste adrese.
Deci, motivul pentru care vom folosi indicii este dacă am să-mi amintesc locul
că o anumită variabilă este o memorie.
>> Și voi aminti că unul dintre cei cazuri a fost dacă am o funcție
daca am de fapt, doresc să de swap pentru reali, eu de fapt
trebuie să trimită un pointer.
Nu este variabila.
Nu voi aminti asta?
Diferență dintre--
ceea ce este numele?
Apelarea prin valoare și apel de referință, nu?
>> OK, da.
Sună de valoare.
Când trimiteți doar o variabilă de funcționeze tu doar trimite o valoare.
Deci de fapt trimiterea o copie a variabilei.
Iar programul nu ar putea pasa mai puțin despre cazul în care aceeași variabila de fapt
face o copie.
>> Și de asteptare de referință înseamnă că Sunt de fapt trimit o copie a
pointer la variabila.
Deci, asta înseamnă că eu sunt trimiterea Locul de amplasare a acelei variabile.
Așa simt eu am localizarea variabilă, atunci când am apela funcția
cu indicii, eu sunt în măsură să efectiv schimba datele care a fost în principal.
A face sens?
>> Deși, indicatorul este o copie, pointer are încă adresa reală de
variabila care doresc să se schimbe.
A face sens?
>> Deci, crearea de indicii.
Amintiți-vă, indicatorul avea întotdeauna tipul care se indică
și apoi la o stea.
Și apoi ai pus numele.
Deci, amintiți-vă că ori de câte ori aveți orice stea, e ca un pointer la
că orice variabilă tip pe care le avea.
>> Deci, aici în stea, de exemplu, este un pointer și un întreg.
Și atunci stele char este un pointer stele char și așa mai departe.
Da?
>> Audiența: Ce se întâmplă dacă avem o pointer la n pentru a juca x.
Știu că creează un pointer la x.
Are, de asemenea, să declare x un număr întreg?
>> LUCAS: OK, asa ca atunci cand spui n stele x, tu nu creați un pointer la un
x variabil.
Creezi un pointer numit x.
>> Audiența: [inaudibil].
>> LUCAS: Așa că atunci când am spus n stea x, eu sunt zis, hei, în memorie, am de gând să
a obține unul dintre aceste trei cutii.
Și am de gând să spun că va fi x, care este
O să fie un pointer.
Si ceva interesant despre indicii este că noi spunem că ei au
4 octeți pentru o mașină de 32 de biți.
Iar motivul pentru care se datorează faptului că 4 octeți sunt de 32-biți.
>> Și mașini care sunt de fapt 64 de biți au indicii adrese
care sunt 64 de biti.
Deci, aceasta înseamnă doar că mărimea adrese în aparatul este diferit.
>> Deci, de referință și dereferencing.
Există doi operatori care voi ar trebui sa ne amintim.
Primul este ampersand.
Al doilea este stea.
Nu te confuz de care stea și aceasta star amintiți-vă, pentru că, în
acest caz, ai n stele.
>> E ca o chestie împreună.
Nu există nici o stea n spațiu.
Deci, asta înseamnă că e tipul.
Amintiți-vă, că atunci când aveți steaua variabilă, tu ești
vorbind despre tipul.
>> Când ai doar stea și apoi Numele variabilei, aceasta înseamnă că
te dereferencing indicatorul, care înseamnă că te uiți la
pointer, pentru aflarea adresei e arătând spre, merge la acea adresă,
și ori de câte ori se uită la aveți acolo.
Așa că am spus elevilor mei că, atunci când aveți stele, trebuie sa te gandesti ca este
abrevierea de conținut de.
>> Deci, dacă aveți un pointer și tu face pointer stele, este
conținut de indicatorul.
Deci, te duci la orice se indică la si uita-te la conținut constant.
Și ampersand este aceeași lucru ca adresa de.
>> Deci, dacă am o variabilă un-- ca, hai sa spune că am făcut int un egal 3--
dacă vreau să găsesc adresa de care variabilă o memorie, pot face doar
ampersand o.
Deci, este adresa o.
A face sens?
>> Deci, aici este un exemplu.
Acest lucru lipsește int b și c Int.
Deci, int-o este egal cu 3 mijloc care Am de gând să merg la memorie.
Și am de gând să găsească un slot și a pus numărul 3 aici.
>> Și apoi int b este egal cu 4.
Am de gând să facă același lucru.
Du-te la memorie și a pus un număr 4 într-una dintre casetele.
Și int este egal cu 5.
Găsește-o altă cutie și a pus un număr de 5.
>> Deci, ce este această linie faci? pa n stele este egal cu ampersand o.
Deci, în primul rând, n pa stea.
Ce o face?
>> Audiența: [inaudibil].
>> LUCAS: Da, deci n pa stele, în primul rând, declară un pointer numit pa.
Și apoi se atribuirea valoarea de că indicatorul să fie adresa unui.
Deci ampersand o.
Apoi, dacă am face pb stele, ceea ce este o pb stea?
>> Oh, îmi pare rău.
Acest lucru este, de asemenea, lipsește. n pb stele.
Adică buc stele.
Îmi pare foarte rău.
E același lucru.
Dar acum sunt bine ar crea un pointer la B și apoi un pointer la c.
Da?
>> Audiența: [inaudibil]?
>> LUCAS: Da.
Deci, dacă te duci la memorie și te duci la caseta care este indicator pentru pa,
tu esti de fapt de gând să vedea o adresă de o.
OK?
Da?
>> Audiența: [inaudibil]?
>> LUCAS: Da, pointer este o adresă.
Nu uita niciodată că.
E ca si cum cel mai important parte despre indicii.
Există stocarea și adresa într-o anumită variabilă.
Altceva?
Orice alte întrebări?
OK.
>> Deci Pointeri și Arrays.
Amintiți-vă că atunci când fac int matrice 3, de fapt, ceea ce fac este că sunt, un fel
de, declarând într-un pointer.
Deci, matrice este un fel de un pointer la un loc specific în memorie, în care am
alocate trei sloturi pentru numere întregi.
Are vreun sens?
>> Așa că, atunci când fac int matrice 3, ceea ce am face, în principiu, este de a crea trei
sloturi în memorie.
Așa că am găsit doar trei sloturi în memorie.
Deci, dacă o fac, atunci, o matrice stea, ea înseamnă, în esență conținutul de matrice,
ceea ce înseamnă că șterge indicatorul, mă duc pentru că locul pe care este îndreptat la,
și am pus numărul unu.
>> Și apoi, dacă am face matrice stele plus 1, că e același lucru ca a face matrice
paranteze unul, ceea ce înseamnă că mă duc la locul pe care este îndreptat la.
Și apoi plus 1 mărci mi schimba o poziție.
Așa că mă duc la această poziție, de fapt, și a pus numărul doi.
>> Și apoi, în cele din urmă, atunci când fac matrice plus 2, merg acolo unde
îndreptat matrice de la.
Și apoi m-am muta la blocuri de memorie.
Și apoi am pus numărul trei aici.
Da?
>> Audiența: array Deci stea este pur și simplu spune foarte primul punct.
Și puteți adăuga 1, doar pentru că suntem doar într-adevăr
referire la prima adresa.
>> LUCAS: Da.
De ce avem, de exemplu, spune matrice 0, 1 matrice, matrice și 2?
Spun, de ce faci 0, 1, 2, 3 în loc de 1, 2, 3?
Unul dintre motive este, unul, calculator programatori preferă să înceapă
numărare de la 0.
Doi este că atunci când faci matrice 0, E același lucru ca a face matrice
plus 0, ceea ce înseamnă că mă duc la această poziție, și eu nu fac
sări peste orice blocuri de memorie.
Așa că nu se mișcă nici blocuri de memorie.
Da?
>> Audiența: [inaudibil]?
>> LUCAS: Deci, ea cere ceea ce este diferența între a face
aceasta sau de a face malloc.
Una dintre diferențele este că int matrice 3 este crearea unui
matrice pe stiva.
Și când o voi face malloc el, creează pe heap.
Are vreun sens?
>> Deci, cum malloc lucru de fapt?
Deci, de ce nu, chiar avem nevoie pentru a folosi malloc?
Fel compilator de figuri tot variabilele pe care le declarate.
Și el creează spațiu pentru toți Dintre acestea în stivă.
Deci, toate variabilele sunt de gând să fie undeva în stivă.
Deci, aici este variabilele de mediu.
>> Deci, practic, spațiu pentru acele variabile în memorie este alocată la
compila timp.
Deci, asta înseamnă că computerul are să cunoască toate aceste variabile
în prealabil.
Ea nu are nevoie să știe ce valoare ai de gând să pună în ele.
Dar trebuie să știe cum memorie de mult ai nevoie.
>> Dar acum, hai să spunem că, de exemplu, creați un tablou sau de a lua o
șir pe care le iei de la utilizator.
Nu știu cât de mult sirul va fi, de exemplu.
Deci, nu știi exact câți blocuri de memorie va aloca, corect?
>> Deci, nu prea are sens pentru să spui pune 100 de caractere.
Și apoi ce se întâmplă dacă utilizatorul scrie 150?
Vei fi înșurubat.
>> Deci, practic, nu poți fi sigur de cum de mult de memorie ai nevoie pentru a aloca
atunci când compilați programul.
Trebuie doar știi că în timp a alerga.
De aceea ai heap.
Deci, heap va avea memorie că tu alocarea în timpul
Durata de funcționare a programului.
>> Deci, practic, atunci când faci malloc, ceea ce ce faci este alocarea de memorie la
rulare, ceea ce înseamnă că ești decide chiar în acel moment că voi
ar trebui să aibă ca memorie.
Deci, asta e atunci când o alocare.
Are vreun sens?
>> Deci, amintiți-vă, stiva are variabile care sunt create pe timpul compilării.
Și apoi heap are variabile care sunt create ca te duci
cu malloc, de exemplu.
>> Audiența: [inaudibil]?
>> LUCAS: Deci getString este va suna malloc.
Permiteți-mi să vorbesc despre malloc, și Voi explica getString.
Deci, malloc este același lucru ca alocare de memorie.
Deci, o să aloce memorie pe heap.
Și o să se întoarcă un pointer la unde memorie a fost alocată la.
>> Deci, atunci când facut--
aici pentru exemplu--
n pointer stele.
Și apoi pointer este egal cu malloc Dimensiunea de ori inch 10.
Creez un pointer.
Și apoi voi atribuirea că indicatorul de valoarea indicatorului care malloc
este să-mi dea.
>> Deci, eu cer malloc se poate aloca spațiu pentru 10 de numere întregi.
Asta e ceea ce se spune.
Și malloc îmi dă înapoi o pointer la acel loc.
A face sens?
OK.
Am Si getString este, de fapt, a face o apela la malloc astfel încât să puteți aloca
memorie în timpul rulării.
>> Întotdeauna amintiți-vă pentru a verifica null pentru că malloc va intoarce null
în cazul în care aceasta nu poate aloca memorie.
Să spunem că vă întreb pentru un ridicol cantitate de memorie.
Computerul nu va fi posibilitatea de a aloca atât de mult.
>> Deci, malloc este doar de gând pentru a reveni null.
Deci, amintiți-vă mereu pentru a verifica dacă pointer că ai de la malloc este
nul sau nu, deoarece, în cazul în care acesta este, s-ar putea se dereferencing un pointer și
cauzând defecte secundare.
Și, în sfârșit, nu uitați memorie gratuit.
>> Malloc este de a crea memorie în heap.
Și trebuie să elibereze memoria înainte de terminarea programului.
OK, asta e tot pentru mine.
Îmi pare rău, Rob.
Multumesc.
>> [Aplauze]
>> LUCAS: Orice ultimele întrebări înainte de Rob vine?
Nu?
Da?
>> Audiența: N-am văzut asta on-line.
L-ai încărcat încă?
>> LUCAS: Cred că Dave este încărcarea în curând.
>> DAVE: Va fi postate.
>> LUCAS: Va fi on-line.
>> Audiența: Depinde.
>> LUCAS: Depinde?
OK.
Da?
>> Audiența: [inaudibil]?
>> LUCAS: Da, ar trebui să elibereze toți memorie care este pus în grămadă.
>> Audiența: [inaudibil]?
>> LUCAS: Da.
De fiecare dată că aveți o malloc cultură, ar trebui să aveți o cultură liberă
după ce încetați să mai folosiți variabile.
Deci, malloc și gratuit sunt mereu împreună.
Cei mai buni prieteni.
Da.
Rob?
>> ROB: Mă duc repede.
Și, de asemenea, videoclipul va fi pus.
Am microfonul pe.
>> OK, deci săptămână cinci lucruri.
Primul lucru pe care îl avem este stiva.
Deci, amintiți-vă că există o singură stivă cadru pe apel funcție activă.
Vom vedea că într-o secundă.
Și, de asemenea, amintiți-vă ce se întâmplă de fapt în fiecare cadru stivă vor fi
variabilele locale ale functiilor noastre, argumentele care sunt trecute în nostru
funcții, împreună cu un cuplu alte lucruri pe care nu prea
trebuie să vă faceți griji.
>> Deci, aici e un program de exemplu în cazul în care, notificare, principal este printfing revenirea
Valoarea de foo 4.
foo este doar de gând să se întoarcă Valoarea de bar 4 virgulă 6.
Și bar se va stabili unele locale n variabilă egală cu de 4 ori 6.
Și apoi să se întoarcă n.
>> Deci, să ne uităm la stiva pe tot parcursul repetare efectivă a acestui program.
Deci, există în partea de jos a stivei noastre.
Amintiți-vă că stiva crește.
Deci, la partea de jos a stivei noastre, am au un cadru stivă de principal.
Când începe programul, principal este întotdeauna o să fie la
partea de jos a stivei noastre.
>> Și ceea ce este în interiorul nostru stiva cadru pentru principal?
Deci, chiar dacă nu există locale variabile de principal, cum am spus înainte,
am argc și RGV să ocupe spațiu în interiorul cadrului pachetul principal.
Deci principal este acum de gând să apeleaza functia foo.
Și asta înseamnă foo va obține propriul cadru stivă.
>> Deci, acum suntem în interiorul foo funcție.
Și ce trebuie să meargă în cadru stiva foo lui?
Ei bine, foo are un argument n.
Și n este egal cu 4, deoarece asta e ceea ce principal trece ca argument foo lui.
>> Deci, acum foo se va numi bar.
Ce este bara va avea în interior de "cadru de stivă?
Are x egal cu 4 y egal cu șase.
Asta nu e tot ce vom avea în cadrul stivei deoarece bar
are, de asemenea, o variabilă n locală.
Și n-am de gând să se stabilească egal cu 24.
>> Deci, acum, bar se va reveni n.
Deci, bar se întoarce la 24 alim cadru stivă.
Și pentru că bar se întoarce acum, că înseamnă că vom popping cadrul stivă
pentru bar de pe stivă.
Deci, toate de memorie care bara a fost utilizarea este acum de pe stiva.
>> Acum, foo este, de asemenea, va pentru a reveni la 24 la principal.
Deci, acum că foo se întoarce, memoria că foo folosea în "sale
cadru stivă este, de asemenea, a dispărut.
Și acum, principal se va numi printf.
Deci printf este doar o altă funcție.
Când numim printf, aceasta va fi un alt cadru stivă pentru printf
apel de functie.
>> Ce ne trece printf?
Asta e ceea ce se întâmplă pentru a merge pe cadru de stivă.
Cel puțin, vom trece că la sută i backslash n și
argumentul 24.
S-ar putea să aibă mai mult în ea este cadru stivă dacă printf se întâmplă să fie folosind unele
variabile locale.
Nu știm.
>> Dar toate acestea se în lui printf stiva cadru.
Se va executa printf.
Apoi printf făcut.
Acesta va reveni.
În final, se face principal.
Principal va reveni.
Și apoi programul nostru se face.
Da?
>> Audiența: Te vezi [inaudibil]
argumente [inaudibil]
parametri?
>> ROB: Deci, există o diferență subtilă între argumente și parametri.
Și într-adevăr, în vorbesc comun, oamenii tind pentru a amesteca doar le tot timpul.
Dar parametrii sunt formale Numele lucrurile.
>> Deci, argc și argv sunt parametri principal.
Argumentele sunt ceea ce de fapt trece în care acești parametri.
Așa că, atunci când eu numesc foo de 4, 4 este argumentul Trec în.
Și parametrul n, în interiorul foo, ia valoarea 4
de la 4 a fost argumentul.
>> Audiența: [inaudibil]?
>> ROB: n este o variabila locala la bar.
n este încă locală a foo, dar este un parametru de foo.
Nu este o variabilă locală.
Da?
>> Audiența: [inaudibil]?
>> ROB: bar foo este sunat și revenind orice bar întoarce.
>> Audiența: [inaudibil]?
>> ROB: Da, doar pentru a vedea mai multe stiva de cadre.
Da?
>> Audiența: De ce a fost numit foo înainte printf?
>> ROB: De ce a fost numit foo înainte printf?
Deci, am putea avea, în schimb, face ceva ca int x este egal cu foo din 4
și apoi imprimate x.
Dar, în loc, am combinat funcția pune în argumentul printf.
>> Dar observați că nu putem de fapt executa apelul la printf până când vom
dau seama ce este foo de 4.
Deci, vom evalua acest lucru.
Și doar o singură dată, care a făcut merg să se întoarcă și să evalueze acest lucru.
Da?
>> Audiența: Din moment ce ambele bar [inaudibil]
valoare, de ce nu ne-am [inaudibil]?
>> ROB: Ei total ar trebui să fie int.
Asta nu a fost prins peste mai multe treceri.
Deci, ar trebui să fie bar int și int foo deoarece atât a celor
se întorc întregi.
Void este doar în cazul în care ei nu vor să se întoarcă valorile reale.
Da?
>> Audiența: Dacă ați avea o linie mai sus întoarcerea, [neauzit]?
>> ROB: O linie de mai sus întoarcerea?
>> Audiența: Da.
Ca și în cazul în care ai făcut printf și [neauzit], s-ar imprima de doua ori?
>> ROB: Deci, în interiorul foo?
Dacă am avea un printf aici?
>> Audiența: Da.
>> ROB: Deci, dacă am fi avut un drept printf aici, ar fi afișat o dată.
Din moment ce sunt de asteptare foo dată drept aici, atunci vom lovi printf.
Apoi vom suna bar.
Și apoi foo va reveni.
Și asta e tot.
Ne întâlnim doar vreodată printf dată.
Da?
>> Audiența: [inaudibil]
printf apel foo pentru că suntem primul apel printf și apoi vom trece
argumentele.
>> ROB: Deci, în teorie, nu este printf apel foo?
Deci, nu.
Doar ordinea în care c este de gând să executa aceste lucruri este, înainte de a putea
apela o funcție, toate argumentele la funcția trebui să
fi evaluate complet.
Deci, este acest evaluat complet?
Da, e doar un șir.
E doar o valoare.
>> Apoi, trebuie să complet evalua acest lucru.
Odată ce se face acest lucru, acum toate argumentele sale sunt evaluate.
Și acum putem face apela la printf.
Da?
>> Audiența: O întrebare.
Dacă aveți o funcție gol, trebuie să Ai virgulă schimb?
>> ROB: Nu face un punct și virgulă revenire dacă aveți o funcție gol.
OK.
Deci, acum niște chestii grămadă.
Deci, heap este cum vom face cu memorie de management dinamic.
Și acest contrast direct cu stiva pe care am numi automat
de gestionare a memoriei.
>> Deci, pe stiva, nu aveți cu adevărat de a face cu modul în care variabilele locale
sunt împinse și mi-a venit de pe toate aceste cadre stiva și toate chestiile astea.
Nu trebuie să vă faceți griji despre asta.
Este automat.
Deci, heap este manual.
Și [neauzit]
vine de la aceste funcții malloc și gratuit.
>> Deci, aici este un alt program.
Tot ce facem este mallocing un număr întreg.
Suntem o depozitați în stea x.
Desigur, avem de a verifica pentru a vedea dacă x este nul.
Apoi vom stabili exact ceea ce x este îndreptat la 50.
Printeaza ce x este îndreptat la, imprimare x, și apoi gratuit x.
>> Deci, cum este acest fapt de gând să se uite daca ne uitam la stiva si heap nostru?
Deci, vom începe din nou.
Partea de jos a stivei noastre ca înainte.
Amintiți-vă că te-heap direct se opune stiva?
Deci, vom avea partea de sus a morman noastre acolo.
>> Deci, partea de jos a stivei noastre, ne-am cadru noastră stiva de principal.
Ea are spațiu pentru argc, argv, și ne-am au acum un x variabilă locală, care
este o stea int.
Deci, vom repeta prin intermediul acestui program.
Primul lucru pe care îl avem este un apel la malloc.
>> Deci, facem un apel la malloc.
Malloc este o funcție.
Va obține un cadru stivă.
Ce vom trece la malloc?
Asta va merge în interiorul a cadrului stivă.
Trecem dimensiune de n, care este de 4.
Deci, care este trecut la malloc.
>> Ce face malloc?
Ne ia de spațiu pe heap.
Deci, vom merge la grămadă.
Și vom apuca 4 bytes din heap.
Așa că hai să dai o adresă arbitrar.
0x123 Doar pretinde că este un adresa care este pe heap.
>> Deci, ce este de fapt in interiorul că regiune de memorie la adresa Ox123?
Garbage.
Așa că nu ne-am depozitat nimic în ea.
Deci, în măsura în care știm, ea ar putea fi orice.
Nu ar trebui să-și asume că e zero.
Este cel mai probabil nu este zero.
>> Deci, acum se întoarce malloc.
Și ce facem când se întoarce malloc?
Am stabilit ce se întoarce.
Ne-am propus x egal cu ceea ce ea se întoarce.
Deci, ceea ce este ea întoarce?
Se întoarce 0x123 de la care este adresa blocului de memorie care se
doar alocată în heap.
>> Deci reveni 0x123 x este acum de gând să fie stabilite egal la 0x123 care, pictural,
tragem frecvent ca x are un efectiv săgeată arătând spre acel bloc.
Dar x doar stochează adresa.
Deci, acum avem de a verifica dacă x este nul.
Nu este nul.
Ne prefacem că malloc reușit.
>> Deci, acum stea x este egal cu 50.
Deci, stele își amintește ea înseamnă du-te la acea adresă.
Deci, 0x123 Vom du-te la acea adresă.
Așa că ne aduce acolo.
Ce facem la acea adresa?
Suntem depozitare 50.
>> Deci, după această linie, care este ceea ce lucrurile se vor arăta.
Deci, acum nu mai este acolo gunoi sus.
Acum știm că 50 este în faptul că Adresa special deoarece
l-am setat la asta.
OK?
Deci, acum vom imprima f.
>> Deci, primul vom imprima stea x.
Deci, ceea ce este steaua x?
Din nou, stele x înseamnă a merge la lucru care x este îndreptat la.
Deci, x este stocarea 0x123 Du-te la asta.
Ne-am 50.
Deci imprima f asta.
Și asta înseamnă că va imprima 50.
Și atunci se întoarce.
>> Și atunci avem de-al doilea printf.
Suntem acum la sută p.
Dacă nu ați văzut-o, asta-i doar cum să imprimați un pointer.
Deci avem la sută i, la sută f, și toți cei deja.
Deci la sută p, imprima un pointer.
>> Deci, x este un pointer.
Deci, dacă vom imprima x sine, suntem imprimare ceea ce este de fapt în interiorul
x, care este 0x123 Deci primul imprimare f se va imprima 50.
Cea de a doua imprimare f se întâmplă pentru a imprima 0x123 Da?
>> Audiența: Folosești la sută x pentru a imprima un pointer?
>> ROB: Deci, folositi la sută x pentru a imprima un pointer?
Deci, poti, dar la suta x este doar, în general, pentru ca daca ai ceva
întreg și doriți să imprimați ea ca un hexazecimal.
Asta e doar modul în care faci asta.
>> Întrucât, suta d ar imprima ca zecimal.
Asta este, dacă am lua la sută d. i este doar întreg.
procente p este în mod special pentru indicii.
>> Deci, x este un pointer.
Vrem să folosim la sută p.
Dar la suta x ar putea funcționa.
Da?
>> Audiența: [inaudibil]?
>> ROB: Da.
Cel de acest lucru la call--, așa că am nu-l includ aici.
Dar aceste două argumente sunt în mod necesar în interiorul acestui cadru stivă
împreună cu orice variabile locale printf se întâmplă să fie folosind.
Și apoi următorul apel la printf acum interiorul printf cadru stivă este
la sută p backslash n și indiferent Valoarea lui x este, care este 0x123.
Da?
>> Audiența: [inaudibil]?
>> ROB: Va imprima ceva care arata ca aceasta.
>> Audiența: [inaudibil].
>> ROB: Deci, se imprimă în formă adresa.
Se pare ca o adresă.
Da?
>> Audiența: [inaudibil]?
>> ROB: De ce este ceea ce?
>> Audiența: [inaudibil]?
>> ROB: De ce este acest indicator de 4 bytes?
Deci, există o grămadă din 0 in fata de acest lucru.
Deci, este într-adevăr 0x0000000123.
Pe un sistem pe 64 de biți, nu ar fi o grămadă de mai multe zerouri.
Da?
>> Audiența: [inaudibil].
>> ROB: Deci, primul printf se va print--
>> Audiența: [inaudibil].
>> ROB: Da, o să imprime ceea ce x se indică spre.
Star spune ce este aceasta lucru indică spre.
Prinde-l.
Deci, ceea ce este ea indică spre?
50.
Prinde-l.
Asta e ceea ce am de gând să-l imprimați.
Întrucât, cea viitoare, suntem doar imprimarea x sine.
Ce este în interiorul de f?
0x123.
OK.
>> Și apoi, în sfârșit, avem liber.
Ce vom trece la libera?
Trecem x.
Acest timp am afișat de fapt aceasta în cadrul stivei.
>> Deci, vom trece de valoarea 0x123 pentru a elibera.
Deci, acum gratuit știe, bine, Trebuie să mă duc până la grămada
și gratuit, care memorie.
Este nu mai folosește ceea ce este la adresa 0x123.
>> Deci, liber este de gând să elibereze că din grămada.
Acum morman noastră este din nou gol.
Nu avem pierderi de memorie.
Acum, liber va reveni.
Observați că x este încă 0x123.
Dar asta nu este acum valabil memorie.
Ar trebui să nu mai dereference x.
Da?
>> Audiența: Este întoarce 0 redundant?
>> ROB: Este returen 0 redundant?
Da.
Ne-am pus ca acolo pentru că avem o revenire una pentru aer.
Deci, e ca, da, vă permite se numără revenirea la 0.
Da?
>> Audiența: [inaudibil]?
>> ROB: Deci, după x gratuite, ce se întâmplă dacă vom încerca să dereference indicatorul?
Este posibil ca nimic nu merge bine.
Este posibil ca vom primi în continuare 50.
>> Este posibil, de asemenea, că faptul că memoria este acum folosite pentru altceva.
Deci, este un comportament nedefinit.
Și nedefinit înseamnă nimic se poate întâmpla.
Da?
>> Audiența: [inaudibil]?
>> ROB: Nu, așa că dacă atribuiți x la altceva.
Deci, dacă aici am spus x este egal cu ceva malloc else--
malloc dimensiune event--
apoi că blocul inițial de memorie nu este eliberat.
Și l-am pierdut în mod oficial.
Aceasta este o scurgere de memorie.
Am pierdut toate referirile la acel bloc de memorie.
Deci, nu există nici un fel putem elibera vreodată.
OK, deci apoi să se întoarcă 0 mijloace făcut.
>> În regulă, așa overflow stack.
Care-i ideea aici?
Deci ține minte, morman se întâmplă în jos.
Stivă este în creștere.
Deci asta a fost exemplul de la curs, Cred că, în cazul în care principalul este doar de gând să
apela această funcție foo, care se va să se numească recursiv peste și
peste din nou.
>> Deci, stivă cadre sunt de gând să lucrează exact la fel.
Deci, vom începe cu principal ca rama stiva de jos.
Apoi principal se va numi foo, care este mergi la a lua un cadru stivă.
>> Apoi foo se va numi foo din nou, care urmeaza sa se
un alt cadru stivă.
Și apoi, din nou, și din nou, și din nou, și din nou, până când, în cele din urmă, vom rula
în grămada.
Deci, acesta este modul în care ne un overflow stack.
Și la acest moment, vă SEG vina.
Sau te-ai într-adevăr vina seg înainte acest punct, dar, da.
>> Audiența: Este de bază groapa de gunoi același ca vina seg?
>> ROB: Deci, veți vedea de segmentare core vina fac obiectul unui dumping.
Ai un depozit central în tu Seg vina.
Și e ca o groapa de toate conținutul de memorie curent, astfel încât
pe care le puteți încerca și de a identifica de ce Seg acuzat.
Da?
>> Audiența: [inaudibil]?
>> ROB: Deci, un mijloc de eroare de segmentare există o depășire stack.
Deci, nu neapărat.
O eroare de segmentare înseamnă că ești memorie atinge într-un mod
tu nu ar trebui să fie.
Deci, într-un fel de care se întâmplă este, când tu Stack Overflow, vom începe emoționant
memorie într-un mod pe care noi nu ar trebui să fie.
Da?
>> Audiența: [inaudibil]?
>> ROB: Deci, în interiorul de o buclă infinită.
Cum ar fi, aceasta este ca un infinit recursive buclă și astfel vom obține un alt
stivă cadru de fiecare dată.
Dar, doar în interiorul unui regulat infinit în timp ce unu--
bine, hai să nu mai imprime F--
face ceva.
Oricare ar fi.
>> Noi nu vom fi obtinerea un alt cadru stivă.
Mergem doar pentru a păstra looping peste această instrucțiune singur.
Stiva nu este în creștere.
Este faptul că fiecare recursiv apel este oferindu-ne un cadru stivă.
De aceea, avem un overflow stack.
Da?
>> Audiența: Deci, dacă ai spus pentru a obține în timp ce buclă și apoi [neauzit]?
>> ROB: Deci, dacă în interiorul buclei în timp ce a existat o printf, tot ar fi
vina nu seg.
Pur și simplu nu am vrut să confunde lucrurile.
Ar fi bucla.
Ai primi un singur teanc cadru pentru printf.
>> Apoi printf se va întoarce.
Apoi, ar fi din nou buclă.
Ai primi un singur teanc cadru pentru printf.
Se va întoarce.
Cadru stivă unică.
Deci nu vei primi acest infinit piling sus cadre stiva.
>> Audiența: [inaudibil]?
>> ROB: Da.
Deci, acest overflow stack se întâmplă pentru că nici una dintre aceste
apeluri către foo se întorc.
Deci, dacă ne-am întoarce, atunci ne-ar începe a pierde cadre stiva.
Și atunci nu ne-ar Stack Overflow.
Și de aceea ai nevoie de un caz de bază pentru funcțiile personale.
Da?
>> Audiența: Este de mărimea potențială și stiva pentru heap aceeași pentru
toate programele?
>> ROB: Aproximativ.
Este de mărimea potențială a stivei și heap la fel pentru toate programele?
Aproximativ.
Există unele randomizare a unde începe stivă și
în cazul în care grămada începe.
Dacă se întâmplă să aveți o mulțime de variabile globale și lucruri, s-ar putea
ia de la un spațiu pentru heap dumneavoastră.
>> Pe un sistem pe 64 de biți, aveți practic au memorie infinit.
Nu e doar atât de mult.
Între 32 de biți și 64 de biți, care este o diferență semnificativă.
>> Vei obține un întreg lot mai mult stiva și spațiu grămadă pe un 64-bit
sistem pentru că nu e doar mai mult adrese pe care le pot folosi.
Dar, pe un sistem individual, se va fi aproximativ aceeași cantitate de stivă
și spațiu grămadă.
În regulă.
>> Deci, ultimul lucru este compilare.
Deci, ar trebui să știi acest proces.
Există patru pași mari.
Deci, prima ar trebui să fi ușor de ținut minte.
Pre-procesare.
Ea are prefixul pre în ea.
Deci, este vorba, înainte de orice altceva.
>> Lucru de retinut este hash.
Deci, hash definește și hash include în toate.
Acestea sunt toate pre-procesor directive.
Acestea sunt lucrurile pe care pre-procesor are grijă de.
>> Deci, ce face un pre-procesor?
Este un lucru foarte prost.
Tot ce e capabil sunt toate de acestea copiere, și tăiate, și pastă de operațiuni.
>> Deci, hash include standard de I0 punct de ore.
Ce este faptul că face?
Este hapsân standard i0 dot h fișier și să îl inserați în partea de sus
ori de câte ori se spune hash include standard de i0 punct de ore.
>> Și orice hash defini care le-am văzut, ce este că face?
Copierea sa valoarea pe care hash definit este definit ca și lipire că
ori de câte ori îl utilizați valoarea.
Deci preprocesor doar face într-adevăr operațiunile bazate pe text simplu.
Ea nu face nimic inteligent.
Deci, orice altceva este mai complicată.
>> Deci, acum că preprocesor este făcut, am de fapt compila.
Deci, ceea ce nu înseamnă compilarea?
Acum vom cod de c la codul de asamblare.
Da?
>> Audiența: [inaudibil]?
>> ROB: Da, ne-am prins că.
Deci, compilarea.
Vom de la c la adunare.
Deci, aceasta este o schimbare limbaj actual.
Compilarea se înseamnă trecerea de la un limbaj de nivel mai ridicat de
un limbaj de nivel inferior.
>> Și c este un limbaj de nivel înalt în comparație cu asamblare.
Ce este de asamblare?
Instrucțiunile sale, care sunt, destul de mult, a făcut pentru CPU.
Dar computerul încă nu nu inteleg de asamblare.
Se înțelege numai unu și zero.
Deci, urmatorul pas este de asamblare, care ne aduce din aceste instrucțiuni care
CPU-ul înțelege și de fapt le traduce, la
cei și zerouri.
>> Deci C la asamblare la binar.
Dar nu am un executabil încă.
Deci, cred că a bibliotecii CS50.
Am furnizat cu un binar pentru această bibliotecă CS50, care are getString
și getint și tot ce.
>> Dar CS50 library--
în și de itself-- nu este executabil.
Ea nu are o funcție principală.
E doar o grămadă de binar pe care le puteți folosi.
Deci, de legătură este modul în care ne aduce împreună toți din aceste diferite fișiere binare
într-un executabil real.
Una pe care aveți posibilitatea să tastați punct slash un punct afară.
>> Deci, acest lucru este ca fișierul pe care a scris, - indiferent de programul este--
Ceaser punct c.
Dar acum că a fost compilat până la binar.
Deci, Ceaser punct o.
Și acest lucru este CS50 nostru biblioteci binar.
Și că sunt combinate într-un singur executabil.
Da?
>> Audiența: [inaudibil]?
>> ROB: includ Deci în primul rând, amintiți-vă, hash includ este de fapt o
pre-procesor pas.
Dar asta e separat.
Dacă nu utilizați funcții care sunt în afara fișierului singur, atunci,
Nu, nu aveți nevoie pentru a lega nimic din moment ce ai totul.
>> Asta a spus, printf este legat în.
Dacă utilizați niciodată printf, asta e ceva care trebuie să fie legate în
pentru că nu a scris asta.
Și, de fapt, este în mod automat printf legate în.
Știi cât de la linia de comandă sau când ce tastați face, veți vedea o ai
bord l CS50, care are legătură în biblioteca CS50?
Printf, și chestii de genul asta, se întâmplă să fie legate în mod automat.
Orice alte întrebări cu privire la nimic?
>> Audiența: [inaudibil]?
>> ROB: Legarea?
Avem o grămadă de diferite fișiere binare.
Acesta este un exemplu canonic pe care le folosim este biblioteca CS50.
Am compilat și administrat de binar pentru această bibliotecă CS50.
>> Doriți să utilizați getString în programul tău.
Deci, tu du-te și de a folosi getString.
Dar, fără codul meu binar pentru GetString, atunci când vă compila codul
jos, nu puteți rula de fapt, dumneavoastră Programul pentru getString String este
nu încă complet definit.
>> Este doar atunci când vă conectați în binar mea care conține getString că acum, toate
Bine, poate de fapt executa getString.
Dosarul meu este complet.
Și eu pot rula acest lucru.
Da?
>> Audiența: Are legătură între converti binar executabil a?
Deci, chiar dacă nu aveți alte biblioteci, nu ar mai fi
necesare pentru a traduce [neauzit]?
>> ROB: Deci, un executabil este încă în binar.
Doar combinând un întreg buchet de binare.
>> Audiența: Vă mulțumesc foarte mult.
>> ROB: Nici o problema.
Orice alte întrebări?
În caz contrar, suntem gata.
În regulă.
Multumesc.
>> [Aplauze]
>> Audiența: Mulțumesc.
>> ROB: Da.