Tip:
Highlight text to annotate it
X
>> SPEAKER 1: Max toată lumea.
Vom începe.
Cred că oamenii sunt încă în desfășurare să fie filtrarea inch
Dar, în interesul de timp, astfel încât să putem te voi de aici la timp,
vom începe.
Deci, bun venit la CS50 Quiz 0 revizuirea.
Pentru cei dintre voi care nu au realizat totuși, aveți o întrebare pe miercuri.
Iu-hu.
>> Dacă nu ați început să studieze încă sau nu au dat seama că aceasta există încă,
*** trecute și toate informațiile cu privire la quiz-ul sunt pe cs50.net/quizzes.
Există unele lucruri destul de bine pe acolo, *** trecute de la ultimul 10
ani, precum și informații cu privire la acest test și subiectele
care vor fi acoperite.
Așa că hai 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
face în binar.
Binar înseamnă ceea ce se pare *** ar fi, 0 și 1 a lui.
Ea are două valori care poate fi reprezentat.
>> Deci, la fel ca în prima zi a secțiunii când David pornit-o lumină
bec pentru a reprezenta pe, sau 1, calculatorul nostru înțelege binar ca 0 și
1, a pornit sau oprit.
Bazele de binar.
Fiecare loc este reprezentată în baza doi.
Astfel încât să adăugați 2 la 0 la 1 la 2 până sus.
>> Pentru a calcula ceea ce binar ta este de a zecimal, trebuie doar să urmați această ecuație
tip lucru.
Dacă aveți un 1, în oricare dintre aceste locuri, 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 faceam pe ultimul diapozitiv, acesta este modul în care ar fi
reprezintă 1 prin 5.
>> În mod similar, la fel ca și puteți adăuga și scade în zecimal sau baza 10, sau
într-adevăr orice bază, pe pot 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, face un 0, și de a face adăugarea în acest fel, doar
ca și *** v-ați aștepta cu regularitate zecimal sau orice alt tip de suport.
Rece.
>> Așa *** am spus mai înainte, tot ceea ce merge pe sub capota calculatorul nostru
se face în 0 și 1 a lui, sau binar.
Deci, *** putem exprima, de exemplu, litere, sau numere, sau caractere?
Și răspunsul la care este ASCII.
>> ASCII este o cartografiere între caractere care ne-ar vedea în mod normal în
Limba engleză ca a lui A, lui B, C lui, subliniere, cratime, ș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 poate face plus și scădere cu numere, puteți face
le cu valori ASCII.
>> Deci, în acest exemplu, ce va imprima acest lucru?
Da, deci doar un spatiu spatiu spatiu B C D. În cazul în care sa dus mouse-ul meu?
Observați puteți defini un int la 65.
Și atunci când imprimați pe care cu ajutorul la sută C, se va interpreta ca pe un
caracter și va imprima A.
>> În mod similar, puteți declara ca un char.
Și când vor fi imprimate cu ajutorul suta C, se va interpreta ca,
la sută D. Și, la fel ca tine se poate adăuga un număr, puteți adăuga caractere sunt
Valori ASCII, în acest caz.
>> Deci, un pointer pic pentru toată lumea.
5, ca un șir de caractere, nu de fapt egală cu 5.
Deci, *** 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 că ne va da 5.
Și în mod similar, dacă avem 5 ca întreg, care se adaugă la șirul de zero.
Și care ne dă șirul 5.
Rece.
>> Acum, amintesc înapoi pentru a preda una în care am vorbit despre algoritmi.
Deci, *** ne-o dorim de fapt un calculator de a face lucruri interesante?
Știi, doar adăugând și scăzând numere și de imprimare lucruri nu este
că interesant.
De obicei, vrem calculatorul nostru pentru a efectua un fel de algoritm.
Ceva un pic mai complex mult decât doar aritmetică simplă.
>> Un algoritm este doar un pas cu pas set de instrucțiuni pentru modul de a efectua
o anumită sarcină -
ca doar o reteta.
S-ar putea aduc aminte de prima zi de clasă unde David ne-a conta-o cameră
de oameni și cât de mulți oameni au fost în cameră.
S-ar putea fi folosite pentru numărarea 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 de
unde toată lumea stă în sus, spuneți dvs. număr către o altă persoană, adaugă că
numărul de sus, și o persoană stă în jos.
Și să repeți.
Acesta este un tip de algoritm.
Putem analiza cât de eficient un 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 un 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 cred.
Dacă ghici este corect, spune-le acestea 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 acest lucru î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ă în prezent, în CS50, ne-am a fost cea mai mare parte cu ajutorul c.
Deci, acest lucru ar putea fi codul sursă pentru c.
Mai târziu, în cursul, ai venit noaptea în contact cu alte programe
limbi, *** ar fi PHP.
Sau dacă luați chiar alte clase, vă s-ar putea face Java, Python, sau chiar OCML.
Dar în c limba programul nostru, aceasta este *** am putea scrie codul sursă pentru
algoritmul pseudocod care Tocmai am descris mai devreme.
>> Deci, *** face computerul de fapt, înțeleg că?
*** am spus mai înainte, el doar într-adevăr înțelege zero si unu.
Deci, *** 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 dvs. psets, ai avut un fel de program
scris într-un fișier punct c.
Și atunci trebuie să tastați face.
Deci, ceea ce se face face?
>> Aveți posibilitatea să tastați make pentru a compila dvs. Program pentru că cineva -
oricine a scris set p; probabil David -
a creat un fișier face.
Și care spune face să știți pentru a rula dvs. compilator, numit zăngănit, că voința
apoi compila codul sursă de obiect cod, care este zero si unu
care computerul înțelege.
Dar un pic mai târziu, vom merge mai în profunzime despre compilatoare.
>> Astfel amintesc PSET 0, unde - da, Ai o intrebare?
>> Audiența: [inaudibil]?
>> SPEAKER 1: Da.
Cred că 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: Slash ***, slash 2013, slash 0, și doar să faceți clic pe
*** 2013 și test 0, revizui diapozitive secțiune.
>> SPEAKER 1: Da, așa că dacă vreți să trageți-l în sus și se uite la ea pe dvs.
calculator propriu, care e prea bine.
Spun asta din nou.
>> Audiența: [inaudibil].
>> SPEAKER 1: Da, [imperceptibil] este variabila fals.
Oh, da?
>> Audiența: [inaudibil]?
>> SPEAKER 1: Nu, greve nu sunt la examen.
Ne pare rău, întrebarea ei a fost, a fost greve pe examenul.
Și nu este.
Deci PSET 0, voi ar trebui să aibă toate implementat ceva folosind zero.
Și am învățat unele de programare de bază blocuri folosind zero.
>> Deci, haideți să aruncăm o privire la unele din aceste blocuri de constructii
care face un program.
În primul rând este de expresie booleană.
Expresii booleene sunt cele și 0 sau ceva care are
două valori posibile.
În acest caz, adevărat sau fals, on sau off, și da sau nu.
Un exemplu de simplu, foarte simplu, program care utilizează un Boolean
expresie aici.
>> Deci, în scopul de expresii booleene pentru fi util, avem operatori booleeni.
Acestea sunt operatori 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
egală, ș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 dvs. stabilește că noi
a avut condiții.
Ele sunt, în esență, ca și furci în logica de program 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, altfel, condițiile, dacă, și în altă parte.
>> Iată un exemplu de cât de s-ar putea folosi.
Nimeni nu știe diferența dintre folosind doar dacă declarațiile tuturor
modul în jos versetele dacă, altfel, dacă, și altceva combinate?
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, ea va continua testarea următoarele două.
Întrucât, cu un altul, în cazul în care, de altfel declarație, în cazul în care cel returnează true,
ceilalți nu sunt testate.
Orice întrebări despre asta?
Rece.
>> Astfel încât să utilizați o dacă-altceva de o parte afirmație dacă știți că se poate doar
fie unul din aceste cazuri.
Deci, noi știm dacă x este mai mic decât 0, e cu siguranta nu va fi
mai mare de 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ă utilizați.
Deci, *** putem decide care unul?
>> Noi folosim, în general, o pentru buclă, dacă știm de câte ori ne-o dorim pentru a itera
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 să fie adevărat pentru a păstra funcționare.
Și vom folosi în timp ce face foarte asemănător cu în timp ce, dar vrem codul nostru pentru a rula la
puțin o dată.
>> Deci, nu în timp ce, tot ce este în a face voia se execută întotdeauna cel puțin o dată.
Întrucât, în timp, se nu poate rula la toate, dacă
condiție nu este îndeplinită.
Orice întrebări cu asta?
>> Astfel încât structura de un pentru buclă.
Ați văzut toate astea.
Ai inițializa.
Ai un fel de condiție.
Deci, de exemplu, am putea inițializa *** 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 de a avea un fel de initializare,
un fel de condiție, și un fel de update.
Astfel încât să putem pune în aplicare pentru buclă nostru, 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 inițializare,
executa ceva, actualiza, și apoi a verifica 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 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 folosit, printf - printf este o funcție -
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
standard de I / O bibliotecă.
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ă știi de unde să încep
rularea codului.
>> Audiența: Deci nu ar [inaudibil]?
>> SPEAKER 1: Nu.
Orice alte întrebări?
Rece.
Deci, la fel ca tine 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 a noastră
listă de parametri.
>> Și rețineți că trebuie să scrie datele tip de parametrul pe care doriți să
utilizarea sau altfel funcția nu știu ce fel de
parametru ar trebui să mă accepte.
Deci, în acest caz, ne-o dorim un număr întreg ca intrare nostru.
Deci, de ce ar putea să ne-o dorim pentru a utiliza funcțiile?
>> Mai întâi de toate, o mare pentru organizație.
Ele ajuta rupe codul în mai organizat bucăți și să facă
mai ușor de citit.
Simplificare.
Acest lucru este bun pentru proiectare.
Când sunteți de lectură 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 reutilizarea-abilitate.
Dacă aveți o bucată de cod care este fiind numit sau rula mai multe ori,
în loc de a rescrie codul de 10 ori în funcția de principal, s-ar putea
Vreau să-l refolosiți.
Și apoi de fiecare dată când aveți nevoie pentru a folosi bucata de cod, apela funcția.
>> Deci, acum, dacă ne amintim din nou la zero, am vorbit de asemenea despre câteva concepte,
dintre care unul este filetat.
Fir este conceptul de multiple secvențe 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 thread-uri 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 care rulează propriile lor scripturi.
Acesta este un exemplu de filetare.
>> Și celălalt concept care a fost introdus în zero a fost evenimente.
Și 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 ai folosit difuzat de control și când am
Primesc blocuri.
>> Și, de asemenea, în Problema Set 4, am văzut un pic de evenimente, precum.
Voi ar 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 pe dvs., în acest caz, ar fi eveniment și așteptați pentru clic este dvs.
tratare a evenimentului.
>> Și, de asemenea, de-a lungul 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ă terminal sau orice fereastră
care apare pe g de editare pentru a, în esență, naviga pe computer.
>> Deci, de exemplu, LS listează conținutul de un director.
Face directorul creează un nou director.
CD, directorul de 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 era dacă ar sugera punerea acest
pe foaia de ieftin.
S-ar putea ajuta.
Dacă aveți cameră, puteți să-l pune pe.
Este, de asemenea, doar, în general, destul de bun să ne amintim că atunci când este utilizat
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 fost 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.
Și ș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 *** bibliotecile de lucru și modul în care acestea
interacționează cu restul de cod.
Dar acestea sunt cele două cele mai importante pe care noi, au venit în contact cu până în prezent în
curs.
>> Tipuri.
Acestea sunt bine să ne amintim cât de mult fiecare tip este reprezentat prin sau ***
mulți bytes fiecare tip necesită -
Int, 4 bytes, 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, dublu o Int.
Da.
>> Audiența: [inaudibil].
>> SPEAKER 1: Long [inaudibil].
Și apoi un 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 int sunt aceleași.
Și apoi un lung lung este dublu int.
Rece.
Și atunci, ceea ce este ultimul tip?
>> Audiența: Pointer.
>> SPEAKER 1: Da, așa am învățat un pic despre indicii.
Și indiferent de ceea ce este un indicator arătând la - ar putea fi o stea char
sau o stea int -
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, apoi un lung lung este dublu o Int.
>> Audiența: Aceasta este de 32 de biți?
>> SPEAKER 1: 32 bit, da.
>> Audiența: Deci [inaudibil]?
>> SPEAKER 1: Da, în cazul în care aceasta 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 care schimbare sunt tânjește și indicii.
Amândoi [neauzit].
>> SPEAKER 1: Da?
>> Audiența: Întrebare.
Astfel, pe unul dintre chestionare de practică, se întreabă cu privire la un int nesemnate.
Deci, *** ar fi stabilit că de la un int [inaudibil]?
>> SPEAKER 1: O nesemnat in este, de asemenea, de 4 bytes.
Dar ceea ce este diferit de un document semnat int și un int nesemnate?
>> Audiența: [inaudibil].
>> SPEAKER 1: Corect.
Se poate reprezenta valori negative.
Dar *** se face asta?
>> Audiența: [inaudibil].
>> SPEAKER 1: Da, se economisește 1 biți pentru a reprezenta semnul.
Semnat are un bit care reprezintă semnul.
Și nesemnat este doar toate pozitive.
>> Audiența: OK.
Deci, spune că o dubla este de două ori de mărimea unui flotor?
>> SPEAKER 1: Double este de două ori de mărimea unui float, da.
>> Audiența: *** face un pointer pentru un timp lung [inaudibil]?
>> SPEAKER 1: Deci, întrebarea este *** se indicatorul pentru o lungă lung -
*** este faptul că doar patru bytes atunci când un timp lung de 8 bytes.
Deci, amintiți-vă ceea 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 care pointer este îndreptat la.
Este nevoie de doar 4 bytes pentru a ține evidența de acea locație de memorie.
Orice alte întrebări?
Rece.
>> Deci, ultimul lucru pe care am este standard de ieșire.
Ar trebui să le folosească frecvent suficient de care 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 formatare.
>> Astfel la sută c char, i la suta pentru Int, și putem folosi, de asemenea, procente d.
E același lucru.
Dar, în general, în CS50 ne încercați să utilizați la sută i.
La sută F pentru float.
Ld la suta pentru mult timp și la suta s pentru șir.
>> În mod similar, am fost folosind câteva din aceste secvențe de evacuare.
De exemplu, backslash n pentru noua linie.
Acest lucru este doar pentru atunci când sunteți de formatare Codul dvs. de imprimare f..
Da?
>> Audiența: Ce este suta pentru d?
>> SPEAKER 1: Deci, întrebarea este ceea ce este suta pentru d?
La suta d este pentru int.
Suta la suta d și i sunt la fel.
>> Audienta: Care este diferența dintre backslash n și backslash r?
>> SPEAKER 1: Deci, întrebarea este ceea ce este diferență între reacție și n
reacție r?
Cred că backslash r este -
>> Audiența: Deci backslash r implică doar revine la începutul liniei
fără de fapt de gând să o linie nouă.
Deci, dacă imprimați un backslash r și tu du-te înapoi la începutul liniei
atunci când imprimați mai multe lucruri, vă suprascrie chestii care e 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?
Bine.
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 clasa, care sunt
aproximativ reprezentant de doua saptamani, si începutul săptămânii trei demararea
cu turnare, care este doar un mod de tratarea unei valori a unui anumit tip ca
o valoare de un tip diferit.
Astfel încât să putem face acest lucru cu caractere la int, float la int, și
tânjește lungi pentru a dubla.
>> Toate aceste lucruri pot fi utilizate ca metode de a trata o anumită valoare numerică
minus char ca un alt valoare numerică.
Deci, există unele probleme cu aceasta, de Desigur, care vine atunci când ai aruncat
lucruri *** 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 o multiplicare de 10.000 înainte eu o turnare.
>> Audiența: Oh.
Nu ar exista un 9 și unele 0 numere?
>> DAN: S-ar putea avea unele cifre ciudate.
Deci, chiar, este de 1,3 ori de 10.000.
Așa că e de 13.000.
Și acest plus ciudat -
>> Audiența: 13.100.
>> DAN: 13100.
Mulțumesc, Rob.
Și această ciudățenie suplimentar -
acest 9,9 -
este pur și simplu pentru că acest turnare a ajuns rotunjirea în jos în cazul în care
aceasta nu ar trebui să aibă.
Da.
>> Audiența: Turnarea se întâmplă după altceva?
>> DAN: Deci, pentru că am acest lucru în print, ea face acest lucru înainte de multiplicare
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?
Rece.
Deci, aceasta este de 13099.
De ce se întâmplă acest lucru?
Imprecizie.
>> Flotoare nu sunt perfecte.
Ele pot reprezenta doar numere la un anumit număr de cifre semnificative.
Deci, dacă vom imprima 8 smochine sig pe acest float, vom obține un fel de
număr urât caută.
Și asta pentru că nu se poate cu exactitate 1.31 fi reprezentat prin simpla
puteri ale lui doi în mașină.
Deci, se termină prin a lua cel mai aproape de ghici, care se încheie până
fiind un pic mai jos.
Face sens?
OK.
>> Acum, trecut sunt un mod diferit de face declarații condiționale în care toate
ne pasă doar de o singură variabilă.
Deci, în acest exemplu special, suntem obține 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.
>> Astfel încât să faci un comutator de numele variabilei.
Atunci când configurați cazuri de posibile valorile pe care le-ar putea fi.
Deci-un caz, spun că este scăzut.
Și apoi rupe să iasă a stării comutatorului, astfel
tu nu mergi mai departe.
>> În cazul următor -
așa caz doi și trei de caz -
dacă e 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 a numai scăzut de imprimare este că am
au această pauză aici.
Dacă eu, să zicem, a ignorat această pauză - dacă am aruncat acest separatistă -
ar imprima scăzută, și apoi s-ar imprima de 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 menționate în mod explicit sunt gestionate de către implicit
majuscule în comutatorul și ar trebui să fie aruncat.
>> 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ă [auzite]?
>> DAN: Te-ar imprima scăzut, și apoi s-ar imprima de mijloc, și
atunci s-ar rupe.
>> Audiența: De ce-ar imprima de mijloc în cazul în care [inaudibil]?
>> DAN: Deci totul sub un caz înainte de o pauză cade sub.
Astfel de caz unul de imprimare este cazul sub unul ca acesta este următoarea imprimare.
Da?
>> Audiența: [inaudibil]?
>> DAN: Deci, acest număr este doar un anumit Valoarea că această variabilă
pot lua, nu?
Asta face sens?
Da.
>> Audiența: [inaudibil]?
>> DAN: Da, caz doi ar imprima de mijloc și apoi rupe.
>> Audiența: [inaudibil]?
>> DAN: Cred ca orice?
Ce alte tipuri de date poti trece peste?
>> Audiența: Aveți posibilitatea să comutați peste orice tipuri de date.
Dar aceasta înseamnă doar ceva mai mult de caractere și int si chestii de genul asta, pentru că
Dacă treceți peste un pointer că nu prea are sens,
trecerea sarcini, în cazul în care chiar lasa lui să faci asta, pentru că de virgulă mobilă
în precizie, tu nu ar fi într-adevăr vrei să faci asta oricum.
Deci, destul de mult, doar int și caractere și chestii de genul asta.
>> DAN: Da, e atunci când aveți explicit Valorile pe care le cunosc, cred, pot fi
că un comutator este, de fapt util.
Bun?
OK.
>> Domeniul de aplicare este intervalul pe care o declarată variabil se extinde.
Deci, în această mică bucată de cod am, ar fi plin de erori.
Și motivul pentru care este am declarat acest lucru int i în domeniul de aplicare al acestei 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 orice altceva pe care le declara
cu interiorul unui set de acolade numai există în cadrul acestor acolade.
Și dacă încercați și de a folosi că variabila in afara de aceste acolade, veți
a obține o eroare de compilator.
Da?
>> Audiența: Deci, acesta nu funcționează?
>> DAN: Acest lucru nu funcționează, da.
Siruri de caractere.
String un char *.
Sunt exact la fel.
Acestea sunt doar indicii pentru caractere.
Și orice 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, capital de U, de capital L, capitalul L -
nu este același lucru ca și Terminator NULL.
Acesta este un pointer.
Aceasta este un personaj.
Ei sunt foarte distincte.
Amintiți-vă că.
Acesta va fi pe testul, probabil.
Nu am vazut testul.
Da?
>> Audiența: Deci NULL este, să zicem, indicatorul?
>> DAN: Da.
>> Audiența: Ce face [inaudibil]?
>> DAN: În cazul în care, să zicem, malloc se numește atunci când nu are suficientă memorie pentru a obține
indiferent de mărimea ceri, malloc va intoarce NULL.
Este, de fapt, de fiecare dată când o funcție este ar trebui să se întoarcă un pointer, te
nevoie pentru a verifica împotriva NULL deoarece NULL este un destul de bun -
este, un fel de, valoarea gunoi.
Este 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
NULL deoarece este foarte frecvente.
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 aceasta.
>> Audiența: [inaudibil]?
>> DAN: Spell ca aceasta.
Este terminatorul NULL.
Este litere mici N-U-L-L, dacă esti o ortografie.
>> Audiența: Și eu doar dus înapoi și testat-o.
Și dacă încerci să pui o virgulă mobilă valoare într-un comutator, va tipa la tine
spunând, declarația cere expresie de tip întreg.
>> DAN: Nu te duci.
Dar da, care a fost din nou problema?
>> Audiența: [inaudibil]?
>> DAN: Deci de capital N, capital de U, de capital L, capitalul L este un lucru real c.
Este indicatorul NULL și va fi tratate ca atare.
Tu nu va încerca niciodată ș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 revenirea char max din getchar, sau
oricare ar fi ea?
>> Audienta: Da.
>> Publicul: Da, așa generalul Termenul pentru toate aceste lucruri
sunt valori santinelă.
Astfel ca revenirea int max de la getint și char maxim 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ă că toată lumea
este de acord.
Iar acest lucru 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
*** 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 am putut verifica NULL.
Ar trebui să verificați char max deoarece volumul valoarea returnata de functia este
un personaj, nu un pointer.
Da?
>> Audiența: Această întrebare cere de lungimea șirului.
Asta include caracterul NULL?
>> DAN: Nu.
Și asta este de fapt modul în care lungimea șirului știe să se oprească, deoarece trece prin
matrice dvs. de caractere până la se vede un caracter NULL.
Și apoi e ca si ***, tot Bine, am terminat.
>> Audiența: [inaudibil] cinci?
>> DAN: Buna 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 pe care doriți să mergeți la, acestea sunt indexate de la zero, prin
lungimea unui array minus 1.
>> Și sunt declarate de tipul de lucru pe care îl stocarea în
matrice, numele de matrice, și apoi indiferent de mărimea este de matrice.
Deci, aceasta este o matrice char de lungime sase care are aceste valori.
Da?
>> Audiența: [inaudibil]?
>> DAN: Da.
>> Audiența: [inaudibil]?
>> DAN: Dacă aveți ceea ce se întâmplă în deja făcut matrice.
Deci, ai putea preciza acest lucru în schimb ca, spune, char, indiferent de numele dvs.
matrice este, paranteze goale este egal cu buclat bretele H virgulă E virgulă L virgulă L virgulă
Caracter O virgulă NULL și acoladă.
Care 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 în principal.
Principal are două argumente.
Numărul de argumente, care este în curs de a trecut de-a lungul liniei de comandă și A
vector șir sau un șir de matrice de toate argumentele.
>> Deci, dacă Eu, să zicem, numit o funcție, *** ar fi un punct din spațiu 1, 2 spațiu, trei,
argc ar fi 4.
Și argv 0 va fi un punct afară.
Argv1 ar fi 1.
argv2 ar fi 2. argv3 ar fi 3, în acest 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 am spus doar, ea ar fi argv 0 este un punct afară.
argv 1 este 1. argv2 este 2. argv 3 este 3.
argv 4, care este una mai mare decât argc ar fi NULL.
>> Și că este indicatorul NULL.
Da.
Și asta pentru că șir este o stea char este un pointer.
Așa că trebuie să fie de același tip.
Da?
>> Audiența: Două întrebări.
Deci unul, ceea ce este diferența dintre aceasta și alte getString mult de un tip
în motorul de utilizator?
Și doi, este stocată în memoria recenta?
Astfel ca, getString ar fi fie [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ția pe care-l numim argumentele lui
sunt stocate în stivă?
Deci, argc și argv sunt argumente la principal și ele sunt în stivă, sau într-adevăr
chiar deasupra ceea ce crezi ca începutul stivei.
Ceea ce a fost pe de altă parte se pune problema?
>> Audiența: Deci, ce e [inaudibil]?
>> DAN: Da, e doar un mod diferit de a obține de la utilizator.
Puțin mai eficient și asta e e mai la îndemână pentru scripturi, deoarece
pot trece doar argumente pentru dumneavoastră principal funcție mai degrabă decât să aștepte
pentru utilizatori, dacă nu aveți nici o utilizatori.
>> Audiența: Și da, obține 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 slash punct 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 punct de comandă slash un punct de 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, n-ai 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ția din linia de comandă
argumente, chiar dacă e incluse în argv.
>> DAN: Dar dacă ar fi fost pe test -
Da - și, de asemenea, dacă spui ceva *** ar fi egal cu argc 3,
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 păstrează aceleași tipuri și tocmai a sunat le ceva diferit ca o
și b, ar lucra în continuare?
Și ar funcționa în continuare, v-ar pur și simplu -
în loc de a folosi argc - v-ar folosi o și b.
Da?
>> Audiența: [inaudibil]?
>> DAN: Deci, întrebarea este getString este va stoca în memorie heap
deoarece getString este char *.
Se stochează în memoria 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 o și vă va permite nici un acces la orice
de informațiile dvs., motiv pentru care toată lumea construiește propriile mașini,
sistemele lor de operare proprii, toate lor programe de la zero, și, evident,
Nu conecta la orice alte mașini prin intermediul internetului.
Deci, calculatoarele sunt nesigure.
Ele sunt într-adevăr.
Trebuie să avem încredere altor persoane.
>> Și ideea de securitate este că sunteți încercarea de a limita cantitatea de
încredere de care aveți nevoie.
Și unul din mijloacele pe care le faci ca este prin criptografie.
Criptografie 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ă am cripta secretele noastre într-un mod care sperăm că nimeni nu poate da seama.
>> Așa că am folosit -
prin cursul acestei clase -
lucruri *** ar fi Cezar cifru și [Inaudibil], care sunt atât de foarte, foarte
metode nesigure de criptare lucruri.
Acestea sunt ușor să dau seama ce sunt și ceea ce secretele tale sunt.
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 pauză, pe care 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 imprimă indiferent de care variabila este la faptul că
punct în execuția ta.
Următor se mută execuție dvs. împreună cu un pas.
Și pași pas în interiorul unei funcții în execuția ta.
>> Alte lucruri sunt conduse, care este modul în care executați de fapt codul.
Continua ia toate măsurile necesare pentru a ajunge la următorul punct de pauză.
Ș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 e un program care găsește bug-uri pentru te, cu toate că ar fi grozav.
>> Și ultima pentru mine este de căutare.
Deci tipurile de căutare pe care am vorbit despre în această clasă sunt căutare liniară,
care este doar faptul că te uiți prin fiecare element al spațiului de căutare, cel
element de la un moment dat, până când veți găsi ceea ce sunteți în căutarea pentru sau până când ajungeți
sfârșitul de spațiu de căutare la care Punctul de spuneți că nu ați putut găsi
elementul pe care îl căutați.
Și acest lucru are cel mai bun timp constant, care este 0 din 1 și în cel mai rău liniară
timp, care este de n 0.
>> Binar de căutare, care are nevoie de Elemente de 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.
Acesta este mai mare, vă spun că în partea de jos din spațiul de căutare este dvs.
locația curentă, mijloc, și repornirea procesului.
Dacă este mai mic, te uiti spune ca - Da, care-i treaba?
>> Audiența: [inaudibil]?
>> DAN: Da.
Orice fel de fel care a fost predat în clasa este un joc corect pentru testul.
>> [Râsete]
>> DAN: Și faptul că nu au avut să facă acest lucru pentru o problemă de set, este corect
joc pentru testul.
>> Audiența: Putem merge peste ea *** 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 practica în pagina de îmbinare fel de
study.cs50.net, există codul pentru punerea în aplicare a îmbinare fel.
Deci, nu trebuie să pună în aplicare singur in seara asta.
Dar asigurați-vă că înțelegeți mai degrabă decât doar memorarea.
>> Audiența: [inaudibil]?
>> SPEAKER 2: Pagina de îmbinare fel pe study.cs50.net, există o practică
problemă care, dacă faceți clic prin problema, la sfârșitul este o
soluție, care este reprezentată de fuziunea implementarea de sortare.
Dar asigurați-vă că înțelegeți mai degrabă decât doar o memorarea
sau copierea jos.
>> Audiența: Și o perfect valid problemă pentru examenul ar fi
ceva ca aici este o listă.
Ce înseamnă această listă arata ca, 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 aceasta, trebuie să-l înțeleagă
suficient pentru a ști *** se întâmplă să fie modificarea acestei 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 din toate indicii.
OK?
Deci, în primul rând, recursivitate.
Ce înseamnă să spun că o funcție este recursiv?
>> Audiența: se numește.
>> LUCAS: OK, se cheamă, da.
Deci, ca această imagine, de exemplu.
E ca în imaginea de interior de o imagine și așa mai departe.
Deci, de exemplu, puteți avea - ca Dan că a fost vorba despre binar de căutare.
O modalitate în care binar de căutare este recursiv este faptul că 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ă vă aflați numărul este va fi pe stânga, e la fel
lucru ca a face de căutare din nou, dar Tocmai din stânga listei.
Deci, asta e *** suna ca este recursiv.
De aceea voi avea recursive soluție de îmbinare fel.
>> OK, așa că aici e un exemplu.
Deci, haideți să spunem că vreau să aleagă toate numerele de la 1 la n.
Pot să dau seama că suma 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 însumarea numere până la n minus 1.
Deci, eu pot spune suma de o sumă egală este egal cu n plus suma n minus 1.
Asta face sens?
>> Și eu, de asemenea, ar fi altceva denumit cazul de bază, care este faptul că
suma numerelor sus la zero, ar fi zero.
Asa ca imediat ce ajung la numărul la zero, am opri numărare.
Asta face sens?
>> Deci, aici este un exemplu de cât de Eu pot pune în aplicare acest lucru.
Așa că am această funcție în unele.
Care are un număr întreg n.
Deci, aici am verifica în primul rând dacă n este mai puțin sau egal cu zero.
Deci, în cazul în care este mai mică sau egală cu zero, I a reveni la zero, ceea ce este cazul nostru de bază.
În caz contrar, mă pot întoarce doar n plus suma numerelor din
unul la n minus unu.
Face sens?
OK.
>> Deci, aici e ceea ce pare.
Aveți suma de 2 egali 2 plus suma de 1.
Și unele din 1 este 1 plus sumă de 0, care este 0.
Face sens?
Deci, dacă ne uităm la stiva de dvs. programul, asta este ceea ce pare.
>> În primul rând, avem funcția principală.
Și apoi funcția principală numit sumă 2.
Și apoi suma 2 este de gând să spun, 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ă
a stivei.
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ă 0.
Și apoi alege suma de 1.
Apoi, suma de 1 se va a reveni de la 1 la suma de 2.
Și, în final, suma de 2 se va pentru a reveni la 3 principal.
Asta face sens?
>> Este foarte important să înțelegem 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ă de sortare, î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ă avem toate cuvinte în un 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ântul pe care îl căutați pentru.
>> Dacă sunteți folosind Facebook, de asemenea, atunci când sunteți în căutarea la prietenii tăi, tu ești
O să vezi că Facebook a pus dvs. prieten apropiat este pe partea de sus a celor
că tu nu vorbești cu atât de mult.
Dacă te duci tot drumul la partea de jos a lista ta de prieteni, ai de gând să vezi
oameni care, probabil, nici nu amintiți-vă că suntem prieteni cu.
Și asta pentru că felul Facebook prietenii tăi bazat pe modul în care
închide tu ești pentru ei.
>> Astfel încât 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 nesortate de o listă de 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 sa arati 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 apoi vă păstrați faci care și așa mai departe.
>> Deci selecție fel este, în principiu te selectați de fiecare dată cel mai mic
valoare nesortat.
Pune la sfârșitul sortate parte din lista.
Și continua 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 cel mai mic număr de 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-am uita-te pentru cel mai mic următor 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.
Am găsit 4 și a pus-o la sfârșitul anului.
Găsi 5 și a pus-o la sfârșitul anului.
>> Si uita-te la modul în care toate aceste ori Spun că a pus-o la sfârșitul anului este,
în esență, schimbând două valori.
OK?
Și apoi ultima, tu doar au mai mult un element.
Deci, este deja sortate.
>> OK, deci un fel de introducere.
Fel de inserare ai de gând să aibă, de asemenea, chestia aia de a avea un sortate și
o listă nesortat.
Singurul lucru este că de fiecare dată când când adăugați un element la sortate
lista, tu alege doar elementul care este în partea din față a listei nesortate.
Și atunci ai de gând pentru a găsi ceea ce poziția pe care 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
sortate parte 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 de 3.
Deci, eu știu că trebuie să fie după 3.
Așa că am pus 3 și 5.
>> Apoi vreau să introduce numărul 2.
Am observat că numărul 2 este de fapt dura atunci ambele 3 și 5.
Așa că am de fapt, trebuie să-l pună toate drum la începutul listei.
Deci, am sa, un fel de, trecerea tuturor 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 ar trebui să fie între 3 și 5.
Și apoi am pus-o acolo și schimbare toate celelalte elemente.
Face sens?
>> Bubble Sort.
Deci, cu bule de sortare este de fapt ceea ce esti de gând să faci - o numim cu bule
fel pentru că te duci prin lista - este de fapt mai bine dacă am arăta
vă place acest lucru -
și ai de gând să compare numere alăturate.
Și ai de gând să schimbe lor poziții în cazul în care 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ă ordinea va fi sortat fi de fapt 6 și 5, nu?
Deci, ai de gând să schimbe ordinele.
Apoi m-am vezi 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, a le schimba.
>> Se numeste Bubble Sort pentru că, după fiecare dintre aceste iterații, de fapt,
cel mai mare număr din lista devine tot drumul până la sfârșitul listei.
Asta face sens?
Deoarece 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 swap și apoi ultima.
I, care nu sunt 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 face ca repetare, ceea ce
înseamnă că lista este deja sortat.
Face sens?
>> Hai sa vorbim un pic despre care rulează timp.
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 de execuție, ceea ce înseamnă pur și simplu că este
cât de mult vă așteptați ca programul pentru a lua pentru a rula.
*** ar fi, din punct de vedere -
în acest caz - n.
Numărul de elemente din lista, în cel mai rău caz.
*** ar fi, în cel mai rău caz posibil.
>> Deci, pentru Bubble Sort, de exemplu, avem Big O de n pătrat.
De ce nu avem asta?
De ce este Bubble Sort Big O n pătrat?
>> Audiența: [inaudibil].
>> LUCAS: Da, așa că cel mai rău caz va fi că va trebui să fac n iterații.
Astfel încât fiecare dintre iterații se va aduce cel mai mare element la sfârșitul
listei.
Deci, cel mai rău caz este faptul că am pentru a face acest lucru de n ori.
Și pentru fiecare din acele timpuri, 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 că, pentru fiecare iterație, trebuie să
uita-te la fiecare singur element in lista.
Și apoi a găsi cel mai mic, ceea ce înseamnă că trebuie să
uita-te prin intermediul n elemente.
Și eu trebuie să fac ca de n ori, deoarece Trebuie să selectați toate cele n elemente.
>> Un fel de inserare este, de asemenea, n pătrat pentru că cel mai rău caz, va
fi, un, 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 aceasta va fi de n ori n din nou.
Face sens?
Ce despre omega?
>> Audiența: [inaudibil].
>> LUCAS: Este cel mai bun caz.
Deci e ca și ***, într-o mulțime de ori pentru sortarea, scenariul 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 știți de ce?
>> Audiența: [inaudibil].
>> LUCAS: Da, dacă vă păstrați evidența dacă rația de date a avut nici un swap-uri sau
Nu, dacă aveți ceva de genul set de true dacă a existat o repetare, dacă
Lista este deja sortate, în esență, ceea 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ă doar am avut de a du-te prin lista o singură dată.
Deci, este pentru că n-am uita-te 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.
Deci 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.
Asta face sens?
>> Și sabia de inserție este N, deoarece în cazul în care am încercat să introduceți
numere și toate numerele, atunci când am încercați să le introduceți, am vedea că ele
sunt în poziția corectă.
Nu trebuie sa verific toate celelalte numerele din lista nesortat.
Deci, de aceea va fi n.
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 Theta.
Și asta pentru că ai doar theta în cazul în care atât Big O și Omega sunt la fel.
OK.
Și, în sfârșit, merge de sortare este in log n.
>> Și apoi, ca Dan spunea, Merge fel este un fel de același fel în care
faci căutare binară.
Astfel încât să obțineți lista.
Și ai de gând să taie în jumătate.
Și apoi le taie în reprize mici.
Și apoi le îmbinați.
Voi aminti asta, nu?
OK, așa *** spunea el.
>> OK, indicii.
Deci, ce este un indicator?
>> Audiența: [inaudibil].
>> LUCAS: O adresă.
OK.
Știu că David arată o grămadă de clipuri de binky și lucruri de indicare
reciproc.
Dar îmi place să cred de indicii ca doar o adresă.
Deci, este o variabilă care se întâmplă pentru a stoca o adresă.
>> Deci, este doar această variabilă special care este de patru bytes lung.
Amintiți-vă, că pointer la orice este întotdeauna patru bytes lung pentru noastră 32-bit
mașină astfel încât în cazul aparatul.
Și are doar locația de un interior variabil de ea.
>> OK, deci nu e de memorie, de fapt.
Astfel încât fiecare bloc de memorie de fapt, are 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ă-și amintească locația
că o anumită variabilă este o amintire.
>> Și voi amintiți-vă că unul dintre cei cazuri a fost dacă am avea o funcție
dacă v-am dori de fapt să de swap pentru reali, eu de fapt
trebuie să trimită un pointer.
Nu este variabila.
Nu voi aminti de asta?
Diferența între -
ceea ce este numele?
De asteptare de valoare și apel de referință, nu?
>> OK, da.
Sună de valoare.
Când trimiteți doar o variabilă de funcționeze esti doar trimite o valoare.
Deci tu esti de fapt trimiterea o copie a variabilei.
Și programul nu ar putea pasa mai puțin despre cazul în care același variabila de fapt
face o copie.
>> Și de asteptare de referință înseamnă că Sunt de fapt trimit o copie a
pointer la acea variabila.
Deci, asta înseamnă că eu sunt trimiterea Locul de amplasare a acelei variabile.
Deci sens am locația a variabilă, atunci când am apela funcția
cu indicii, eu sunt în măsură să efectiv schimba datele care a fost în principal.
Face sens?
>> Deși, indicatorul este o copie, pointer are încă adresa reală a
variabila pe care vreau să se schimbe.
Face sens?
>> Creând astfel indicii.
Amintiți-vă, indicatorul avea întotdeauna tipul care este îndreptat
a și apoi o stea.
Și apoi ai pus numele.
Deci, amintiți-vă că ori de câte ori aveți indiferent de stele, e ca un pointer la
că orice variabilă tipul pe care ai avut.
>> Deci, aici, în stea, de exemplu, este un pointer și un întreg.
Și apoi 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 la stea x.
Știu că creează un pointer de x.
Are, de asemenea, să declare x un număr întreg?
>> LUCAS: OK, asa ca atunci cand spui n stea x, nu creați un pointer la un
x variabilă.
Creezi un indicator numit x.
>> Audiența: [inaudibil].
>> LUCAS: Deci, atunci când spun n stea x, eu sunt a 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.
Și ceva interesant despre indicii este că noi spunem că au
4 octeți pentru o mașină de 32 de biți.
Și motivul pentru care se datorează faptului că 4 bytes sunt de 32-biți.
>> Și mașinile care sunt pe 64 de biți de fapt au indicii adrese
că sunt 64 de biți.
Deci, aceasta înseamnă doar că mărimea adrese în aparatul este diferit.
>> Astfel Referindu și dereferencing.
Există doi operatori care voi ar trebui să ne amintim.
Primul este ampersand.
Al doilea este stele.
Nu te confunda cu acea stea, iar acest stele amintesc pentru că, în
acest caz, aveți n stele.
>> E ca o chestie împreună.
Nu există nici un spațiu n stele.
Deci, asta înseamnă că e tipul.
Amintiți-vă, că, atunci când aveți steaua variabilă, tu esti
vorbesc despre tipul.
>> Când tocmai ați stea și apoi nume de variabila, aceasta înseamnă că
te dereferencing indicatorul, care înseamnă că sunteți în căutarea la
pointer, găsirea adresa e indicând, merge la acea adresă,
și se uită la ori de câte ori aveți acolo.
Așa că am spus elevilor mei că, atunci când aveți stele, ar trebui să cred că este
abrevierea de conținut din.
>> Deci, dacă aveți un pointer și tu face pointer stele, este
Conținutul de indicatorul.
Deci, te duci la orice este îndreptat la si uita-te la conținut constant.
Și ampersand este aceeași lucru ca adresa.
>> Deci, dacă am o variabilă o - *** ar fi, să spun că am făcut un int este egal cu 3 -
dacă doriți să găsiți adresa de care variabilă o memorie, eu pot face doar
ampersand o.
Deci, este adresa de o.
Face sens?
>> Deci, aici este un exemplu.
Acest lucru lipsește int b și c Int.
Deci, int a 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ăsi o altă cutie și a pus un număr de 5.
>> Deci, ce este această linie faceti? n pa stele este egal cu un ampersand.
Deci, înainte de toate, n pa stea.
Ceea 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 care pointer să fie adresa unui.
Așa ampersand o.
Apoi, în cazul în care fac pb stele, ceea ce este o pb stea?
>> Oh, îmi pare rău.
Acest lucru este, de asemenea, lipsesc. n pb stele.
Adică buc stele.
Îmi pare 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,
esti de fapt de gând să vedea o adresa de un.
OK?
Da?
>> Audiența: [inaudibil]?
>> LUCAS: Da, pointer este o adresă.
Nu uita niciodată asta.
E ca și *** cel mai important parte de indicii.
Au stocarea și adresa într-o anumită variabilă.
Altceva?
Orice alte întrebări?
OK.
>> Deci, indicii ș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 ca un pointer la un loc specific în memorie, în care am
alocate trei sloturi pentru numere întregi.
Asta face sens?
>> Așa că atunci când eu int matrice 3, ceea ce am face, în esență, este de a crea trei
sloturi de memorie.
Așa că am găsit doar trei sloturi în memorie.
Deci, dacă am face, apoi, 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ă fac matrice stele plus 1, că este același lucru ca a face matrice
paranteze unul, ceea ce înseamnă doar să merg la locul în care se indică la.
Și apoi plus 1 mărci mi schimba o poziție.
Așa că am merge 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
arătând matrice de la.
Și apoi m-am muta în 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, și matrice 2?
Eu spun, de ce faci 0, 1, 2, 3 în loc de 1, 2, 3?
Unul dintre motive este, unul, calculator programatori preferă să înceapă
începând de 0.
Două este că atunci când faci matrice 0, e același lucru ca a face matrice
plus 0, ceea ce înseamnă că merge 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
acest lucru sau de a face malloc.
Una dintre diferențele care este int matrice 3 este de a crea o
matrice pe stiva.
Și când o voi face malloc, ea creează pe heap.
Asta face sens?
>> Deci, *** malloc lucru de fapt?
Deci, de ce nu, chiar avem nevoie pentru a utiliza 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, aceasta înseamnă că computerul are să cunoască toate aceste variabile
prealabil.
Ea nu are nevoie să știe ce valoare ai de gând să pună în ele.
Dar ea trebuie să știe *** memorie de mult ai nevoie.
>> Dar acum, să spunem că, de exemplu, creați un tablou sau de a lua o
șir pe care le iei de la utilizator.
Tu nu știi cât de mult șirul va fi, de exemplu.
Deci, nu știu exact câți blocuri de memorie pe care le aloca, corect?
>> Deci, nu prea are sens pentru să spui pune 100 de caractere.
Și apoi ce se întâmplă dacă utilizatorul scrie 150?
Ai de gând să fie înșurubată.
>> Deci, practic, nu poti fi sigur de modul în care memorie de mult ai nevoie pentru a aloca
atunci când compilați programul.
Trebuie doar știi că la timpul de rulare.
Deci, de aceea ai heap.
Astfel heap va avea memorie că sunteți alocarea timpul
Durata de funcționare a programului.
>> Deci, practic, atunci când faci malloc, ceea ce ce faci memorie este alocarea la
de execuție, ceea ce înseamnă că ești decide in acel moment pe care le
ar trebui să aibă ca amintire.
Deci, asta e atunci când ești o alocare.
Asta face sens?
>> Deci, amintiți-vă, stiva are variabile care sunt create în 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.
Asa ca va aloca memorie pe heap.
Și se va întoarce un pointer la în cazul în care de memorie a fost alocată la.
>> Deci, atunci când faci -
aici de exemplu -
n pointer stele.
Și apoi pointer este egal cu malloc Dimensiunea de ori inch 10.
Creez un pointer.
Și apoi am atribuirea care pointer la 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.
Face sens?
OK.
Am Si getString este, de fapt, a face o apel 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 capabil să aloce atât de mult.
>> Deci, malloc este doar de gând pentru a reveni nul.
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 fi dereferencing un pointer și
cauzează defecte laterale.
Și, în sfârșit, nu uitați memoria gratuit.
>> Malloc este de a crea în memoria heap.
Și va trebui să elibereze memoria înainte de a se termină programul.
OK, asta e tot pentru mine.
Îmi pare rău, Rob.
Mulțumiri.
>> [Aplauze]
>> LUCAS: Orice ultimele întrebări înainte de a veni Rob?
Nu?
Da?
>> Audiența: N-am văzut asta on-line.
L-ai încărcat încă?
>> LUCAS: Cred că Dave este încărcați-l î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 toate memorie, care este pus în grămadă.
>> Audiența: [inaudibil]?
>> LUCAS: Da.
Orice moment, că aveți un 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 în sus.
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 de fapt în fiecare cadru stivă de gând să fie
variabilele locale ale funcțiilor noastre, argumentele care sunt transmise în nostru
funcții, împreună cu o pereche alte lucruri pe care nu prea
trebuie să vă faceți griji.
>> Deci, aici este un program de exemplu în cazul în care, preaviz, 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 este de gând să se stabilească unele locale Variabila n egal cu 4 ori 6.
Și apoi să se întoarcă n.
>> Așa că haideți să ne uităm la stiva de-a lungul repetare efectivă a acestui program.
Deci, nu e de partea de jos a stivei noastre.
Amintiți-vă că stiva crește.
Deci, în partea inferioară a stivei noastre, am au un cadru stivă de principal.
Atunci 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 de principal?
Deci, chiar dacă nu există locale variabile în principal, așa *** am spus mai înainte,
avem argc și RGV inițierea spațiu în interiorul cadrului stivă principal.
Deci principal este acum de gând să apela funcția de foo.
Și asta înseamnă foo se va obține propriul cadru stivă.
>> Deci, acum suntem în interiorul foo funcția.
Și ceea 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 este de gând pentru a apela bar.
Ce este bara de gând să aibă în interiorul de "cadru de stivă?
Are x egal cu 4 y egal cu șase.
Asta nu-i tot ce am de gând să aibă în cadrul stivă deoarece bar
are, de asemenea, o variabilă n locala.
Și n-am de gând să egală cu 24.
>> Deci, acum, bar este de gând să se întoarcă n.
Deci, bar se întoarce 24 de stivă cadru foo.
Și pentru că bar se întoarce acum, că înseamnă că vom popping cadrul stivă
pentru bar de pe stivă.
Deci, tot de memorie care bara a fost utilizarea este acum de pe stivă.
>> Acum, foo este, de asemenea, va să se întoarcă 24 la principal.
Deci, acum că foo se întoarce, memoria care foo folosea în "sale
cadru stivă este, de asemenea, plecat.
Și acum, principala este de gând pentru a apela printf.
Deci printf este doar o altă funcție.
Când numim printf, o să fie un alt cadru stivă pentru printf
apel de funcție.
>> Ceea ce ne trece printf?
Asta e ceea ce se întâmplă pentru a merge în cadrul său stivă.
Cel puțin, vom trece că la suta i backslash n și
argumentul 24.
S-ar putea să aibă mai mult în ea este stiva cadru dacă printf se întâmplă să fie folosind unele
variabile locale.
Noi nu știm.
>> Dar tot ceea ce merge în a printf stiva cadru.
Se va executa printf.
Apoi printf făcut.
Se va întoarce.
Î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-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.
Deci, nu există, atunci când eu numesc foo de 4, 4 este argumentul Trec inch
Și parametrul n, în interiorul foo, ia cu privire la valoarea 4
de la 4 a fost argumentul.
>> Audiența: [inaudibil]?
>> ROB: n este o variabilă locală la bar.
n este încă la nivel local foo, dar este un parametru de foo.
Nu este o variabilă locală.
Da?
>> Audiența: [inaudibil]?
>> ROB: foo este doar de asteptare bar ș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?
Așa că am putea fi, în schimb, face ceva *** ar fi int x este egal cu foo de 4
și apoi imprimate x.
Dar, în loc, am combinat funcția apel în argumentul printf.
>> Dar observați că nu putem de fapt executa apelul de a printf până când vom
dau seama ce este foo de 4.
Așa că am de gând pentru a 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: Acestea total ar trebui să fie int.
Care 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 numai în cazul în care ei nu vor să se întoarcă valorile reale.
Da?
>> Audiența: Dacă ați avut o linie de mai sus întoarcerea, [imperceptibil]?
>> ROB: O linie deasupra întoarcerea?
>> Audienta: Da.
*** ar fi dacă ați printf și [neauzit], ar imprima de doua ori?
>> ROB: Deci, în interiorul de foo?
Dacă am avea un printf chiar aici?
>> Audienta: Da.
>> ROB: Deci, dacă am avea un drept printf aici, ar fi afișat o dată.
Din moment ce sunt de asteptare foo dată drept aici, atunci vom lovi printf.
Atunci vom numi bar.
Și apoi foo va reveni.
Și asta e tot.
Întâlnim doar vreodată printf dată.
Da?
>> Audiența: [inaudibil]
printf apel foo pentru că suntem în primul rând apel printf și apoi vom trece
argumentele.
>> ROB: Deci, în teorie, nu este printf asteptare 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 trebuie să
fi evaluată 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 apel la printf.
Da?
>> Audiența: O întrebare.
Dacă aveți o funcție gol, trebuie să aveți virgulă schimb?
>> ROB: Nu face o virgulă revenire dacă aveți o funcție gol.
OK.
Deci, acum, unele lucruri grămadă.
Deci, heap este *** vom face față 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, grămada este manual.
Și [neauzit]
provine 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 stocarea în stea x.
Desigur, avem de a verifica pentru a vedea dacă x este nul.
Apoi vom stabili exact ceea ce x indică la 50.
Imprima ceea ce x este îndreptat la, x imprimare, și apoi gratuit x.
>> Deci, *** este acest fapt de gând să se uite dacă ne uităm la stack și grămadă nostru?
Așa că vom începe din nou.
Partea de jos a stivei noastră ca și mai înainte.
Amintiți-vă că te îngrămădi direct se opune stiva?
Așa că am de gând să aibă partea de sus de acolo nostru morman sus.
>> Astfel încât partea de jos a stivei noastre, ne-am cadru nostru stivă de principal.
Ea are spațiu pentru argc, argv, și ne-am au acum o variabila x locale, care
este o stea Int.
Așa că am de gând să itera prin acest program.
Primul lucru pe care îl avem este un apel la malloc.
>> Deci, facem un apel la malloc.
Malloc este o funcție.
Se va obține un cadru stivă.
Ceea ce ne trece la malloc?
Care va merge în interiorul cadrului stivă.
Trecem dimensiune de n, care este de 4.
Astfel că este trecut la malloc.
>> Ce face malloc?
Ea ne apucă spațiu pe heap.
Așa că am de gând să merg la grămadă.
Și vom apuca 4 octeti 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, în interiorul de care regiune de memorie la adresa Ox123?
Gunoi.
Deci, nu am stocat nimic în ea.
Astfel în măsura în care știm, ea ar putea fi orice.
Tu nu ar trebui să-și asume că e zero.
Este cel mai probabil nu este zero.
>> Deci, acum se întoarce malloc.
Si ce facem atunci 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,
atragem frecvent ca x având un real săgeată arătând spre acel bloc.
Dar x este doar stocarea acea adresă.
Deci, acum avem de a verifica dacă x este nul.
Nu e nul.
Ne prefacem că malloc reușit.
>> Deci, acum stea x este egal cu 50.
Deci, stele își amintește aceasta înseamnă du-te la acea adresa.
Deci, 0x123 Mergem la du-te la acea adresa.
Așa că ne aduce acolo.
Ce facem la acea adresă?
Suntem depozitarea 50.
>> Deci, după această linie, care este ceea ce lucrurile se vor arăta.
Deci, acum nu mai e acolo gunoi sus.
Acum știm că 50 este în Adresa special din cauza
l-am setat la asta.
OK?
Deci, acum vom imprima f.
>> Deci, în primul rând vom imprima stea x.
Deci, ceea ce este steaua x?
Din nou, stele x mijloace merge la lucru care x este îndreptat la.
Astfel încât x este stocarea 0x123 Du-te la asta.
Ne 50.
Astfel imprima f asta.
Și asta înseamnă că va imprima 50.
Și apoi că se întoarce.
>> Și atunci avem de-a doua printf.
Suntem acum la suta p..
Dacă nu l-au văzut, că e doar *** 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.
>> Astfel încât x este un pointer.
Deci, dacă am de gând să imprima x sine, suntem de imprimare ceea ce este de fapt, în interiorul
x, care este 0x123 Deci primul imprimare f se va imprima 50.
Cea de a doua f imprimare se întâmplă pentru a imprima 0x123 Da?
>> Audiența: Nu folosiți la sută x pentru a imprima un pointer?
>> ROB: Deci, nu folosiți la sută x pentru a imprima un pointer?
Astfel încât să puteți, dar la suta x este doar, în general, pentru ca în cazul în care aveți unele
întreg și doriți să imprimați ca un hexazecimal.
Asta e doar modul în care faci asta.
>> În timp ce, la suta d ar imprima ca zecimal.
Care au fost ajungem la sută d. i este doar întreg.
la sută p este în mod special pentru indicii.
>> Astfel încât 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 puțin pentru acest apel - 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: Se 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ă de 0 în fața acestui.
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 imprima -
>> Audiența: [inaudibil].
>> ROB: Da, se va imprima ceea ce x se indică spre.
Star spune ce este asta lucru indică spre.
Prinde-l.
Deci, ce este indică spre?
50.
Prinde-l.
Asta e ceea ce am de gând să imprima.
Întrucât, în cea următoare, suntem doar de imprimare x sine.
Ceea ce este în interiorul de f?
0x123.
OK.
>> Și apoi, în sfârșit, avem liber.
Ceea ce ne trece pentru a elibera?
Trecem x.
Atunci am afișat de fapt aceasta în cadrul stivei.
>> Deci vom trece valoarea 0x123 pentru a elibera.
Deci, acum știe gratuit, bine, Trebuie să mă duc până la grămadă
și gratuit care de memorie.
Este nu mai este folosind ceea ce este la adresa 0x123.
>> Deci, liber se va elibera că din heap.
Acum morman noastră este din nou gol.
Noi nu avem pierderi de memorie.
Acum liber va reveni.
Observați că x este încă 0x123.
Dar care este acum de memorie nu este valid.
Noi nu ar trebui să mai dereference x.
Da?
>> Audiența: Este reveni 0 redundant?
>> ROB: Este returen 0 redundant?
Da.
Ne-am pus acolo pentru că avem un retur de aer.
Deci, e ca, da, vă permite numără revenirea 0.
Da?
>> Audiența: [inaudibil]?
>> ROB: Deci, după gratis x, 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ă 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ă chiar aici, am spus x este egal cu malloc altceva -
eveniment dimensiunea malloc -
apoi că blocul inițial de memorie nu este eliberat.
Și l-am pierdut în mod oficial.
Că 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, amintiți-vă, 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 pentru a se apela recursiv peste și
peste din nou.
>> Deci, stivă cadre sunt de gând să funcționează exact la fel.
Așa că am de gând să încep cu principal ca rama stiva de jos.
Atunci principal este de gând pentru a apela foo, care este de gând pentru a obține un cadru stivă.
>> Apoi foo este de gând pentru a apela 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ămadă.
Deci, acesta este modul în care ne un stack overflow.
Și la acest punct, tu SEG vina.
Sau te-ai SEG vina înainte acest punct, dar da.
>> Audiența: Este de bază cu benă același ca și vina SEG?
>> ROB: Deci, veți vedea de segmentare core vina fac obiectul unui dumping.
Ai o groapa de bază, atunci când te SEG vina.
Și e ca o groapa de toate a 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 o eroare de segmentare înseamnă există un stack overflow.
Deci, nu neapărat.
O eroare de segmentare înseamnă că ești memorie atinge într-un mod
tu nu ar trebui să fie.
Deci, un mod de care se întâmplă este, când tu stivă overflow, vom începe emoționant
memorie într-un mod care nu ar trebui să fie.
Da?
>> Audiența: [inaudibil]?
>> ROB: Deci, în interiorul de o buclă infinită.
*** ar fi, aceasta este ca un infinit recursive buclă și așa că am obține un alt
stivă cadru de fiecare dată.
Dar doar în interiorul unui regulat infinit în timp ce unul -
bine, să nu mai imprimă f -
face ceva.
Oricare ar fi.
>> Noi nu vom fi obtinerea un alt cadru stivă.
Suntem doar de gând să păstreze 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 stack overflow.
Da?
>> Audiența: Deci, dacă ai spus pentru a obține în timp ce bucla și apoi [inaudibil]?
>> ROB: Deci, dacă în interiorul buclei în timp ce a existat un printf, tot ar fi
nu SEG vina.
Eu pur și simplu nu a vrut să confunde lucrurile.
Ar fi bucla.
Veți primi o singură stivă cadru pentru printf.
>> Apoi printf se va întoarce.
Apoi, ai face din nou bucla.
Veți primi o singură stivă cadru pentru printf.
S-ar întoarce.
Cadru stivă singur.
Deci, nu vei primi acest infinit piling sus cadre stiva.
>> Audiența: [inaudibil]?
>> ROB: Da.
Deci, acest overflow stack se întâmplă deoarece nici unul dintre acestea
apeluri către foo se întorc.
Deci, dacă ne-am întoarce, atunci ne-ar începe a pierde cadre stiva.
Și atunci nu ne-ar stivă overflow.
Și de aceea ai nevoie de un caz de bază pentru funcțiile personale.
Da?
>> Audiența: Este dimensiunea potențial și stiva pentru heap aceeași pentru
toate programele?
>> ROB: Aproximativ.
Este dimensiunea potențială a stivei și heap aceeași pentru toate programele?
Aproximativ.
Există unele randomizare a în cazul în care începe stiva și
în cazul în care începe heap.
Dacă se întâmplă să aveți o mulțime de variabile globale și de lucruri, s-ar putea
ia de la un spațiu pentru morman 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ă.
>> Ai de gând pentru a obține un întreg lot mai mult stivă și grămadă de spațiu pe un 64-bit
sistem pentru că nu e doar mai mult adrese pe care le pot folosi.
Ci pe un sistem individual, se va fi aproximativ aceeași cantitate de stivă
și spațiu grămadă.
Bine.
>> Deci, ultimul lucru este de compilare.
Deci, ar trebui să știi acest proces.
Există patru pași mari.
Deci, în primul rând ar trebui să să fie ușor de ținut minte.
Pre-procesare.
Are pre prefix în ea.
Deci, este vorba, înainte de orice altceva.
>> Lucru de reținut este hash.
Definește astfel hash hash și include în toate aceste.
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.
Totul este capabil de toate acestea sunt operații de copiere, și tăiate, și pastă.
>> Astfel hash include standard de I0 punct ore.
Ce este faptul că face?
Este hapsân standard i0 dot h fișier și lipiți-l în partea de sus
ori de câte ori se spune hash include standard de I0 punct ore.
>> Și orice hash defini care ne-am văzut, ce este că face?
Sa copierea valoarea pe care hash definit este definit ca și lipire că
ori de câte ori vi se utilizând valoarea.
Astfel preprocesor doar face cu adevărat text simplu pe bază de operațiuni.
Nu face nimic inteligent.
Deci, orice altceva este mai complicat.
>> Deci, acum că Preprocessor este făcut, am de fapt compila.
Deci, ce nu întocmire înseamnă?
Suntem acum merge de la codul de c la codul de asamblare.
Da?
>> Audiența: [inaudibil]?
>> ROB: Da, ne-am prins de asta.
Așa compilarea.
Mergem de la c la adunare.
Deci, aceasta este o schimbare limbaj real.
Compilarea în sine înseamnă a merge de la un limbaj de nivel mai ridicat de
un limbaj de nivel inferior.
>> Și C este un limbaj de nivel înalt față de asamblare.
Ce este de asamblare?
Instrucțiunile sale, care sunt, destul de mult, a făcut pentru CPU.
Dar computerul încă nu nu înțelege de asamblare.
Se înțelege numai unu și zero.
Deci, următorul pas este asamblarea, care ne aduce din aceste instrucțiuni care
CPU-ul înțelege și de fapt le traduce, la
cele si zerouri.
>> Deci, C de asamblare la binar.
Dar nu am un executabil încă.
Deci, cred că a bibliotecii CS50.
Noi le-ați furnizat cu un binar pentru această bibliotecă CS50, care are getString
și getint și tot ce.
>> Dar biblioteca CS50 -
în sine - nu este executabil.
Ea nu are o funcție principală.
Este doar o grămadă de binar pe care le puteți folosi.
Astfel de legătură este modul în care ne-am reuni toți din aceste diferite fișiere binare
într-un executabil real.
Unul pe care aveți posibilitatea să tastați dot slash un punct afară.
>> Deci, acest lucru este ca fișierul pe care a scris, - indiferent de programul tău este -
Ceaser punct c.
Dar acum acesta a fost compilat până la binar.
Astfel Ceaser punct o.
Și acest lucru este bibliotecile noastre CS50 binar.
Și că sunt combinate într-un singur executabil.
Da?
>> Audiența: [inaudibil]?
>> ROB: Deci se numără î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 ceva din moment ce totul.
>> Asta a spus, printf este legat inch
Dacă utilizați vreodată printf, asta e ceva care trebuie să fie legate în
pentru că nu a scris asta.
Și, în fapt, printf este în mod automat legate inch
Știi *** la linia de comandă sau când tastați face, veți vedea o au
liniuță L CS50, care are legătură în bibliotecă CS50?
Printf, și chestii de genul asta, se întâmplă să fie legate în mod automat.
Orice alte întrebări cu privire la ceva?
>> Audiența: [inaudibil]?
>> ROB: Corelarea?
Avem o grămadă de diferite fișiere binare.
Acesta este un exemplu canonic pe care le folosim este biblioteca CS50.
Am compilat și dat la tine binar pentru această bibliotecă CS50.
>> Doriți să utilizați getString în programul dumneavoastră.
Deci, te duci și de a folosi getString.
Dar fără codul meu binar pentru GetString, atunci când compila codul
jos, nu puteți rula de fapt dvs. Programul deoarece 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 leagă converti binar pentru executabile?
Deci, chiar dacă nu aveți alte biblioteci, nu ar mai fi
necesare pentru a traduce [inaudibil]?
>> ROB: Deci, un executabil este încă în binar.
Este doar combinarea un întreg buchet de binare.
>> Audiența: Vă mulțumesc foarte mult.
>> ROB: Nici o problemă.
Orice alte întrebări?
În caz contrar, suntem gata.
Bine.
Mulțumiri.
>> [Aplauze]
>> Audiența: Mulțumesc.
>> ROB: Da.