Tip:
Highlight text to annotate it
X
>> SPEAKER 1: Ahoj všetci.
Chystáme sa začať.
Myslím, že ľudia sa stále deje , Ktoré majú byť filtrovanie palcov
Ale v záujme času, takže môžeme si chlapci odtiaľto včas,
ideme na štart.
Takže vitajte na CS50 Kvíz 0 hodnotení.
Pre tých z vás, ktorí si neuvedomili Ešte, že máte otázku na stredu.
Woo-hoo.
>> Ak ste začala študovať ešte, alebo si uvedomil, že to ešte existuje,
v minulých kvízy a všetky informácie o Váš kvíz sú na cs50.net/quizzes.
Je tu nejaký celkom dobrý veci tam, v minulých kvízy z posledného 10.
rokov, rovnako ako informácie o tomto *** a témy
ktoré sa bude vzťahovať.
Tak poďme začať.
>> Takže vy si možno spomenú, prvý deň triedneho David mal tie lampy na.
Takže v podstate všetko, čo ide pod kapotou z počítača
vykonáva binárne.
Binárne znamená, že to, čo znie ako, 0 a 1 je.
To má dve hodnoty, ktoré môžu byť reprezentované.
>> Takže, rovnako ako v prvý deň sekcie keď Dávid sa obrátil na svetlo
žiarovka reprezentovať na, alebo 1, náš počítač chápe ako binárny 0 a je
1 je, zapnúť alebo vypnúť.
Základy Binary.
Každé miesto je zastúpená v základni dva.
Takže si pridať 2 na 0 až 1 do 2 úplne ***.
>> Ak chcete vypočítať, aké sú vaše binárne je desiatkovej, stačí nasledovať túto rovnicu
typ vec.
Ak máte jeden v niektorom z týchto miest, to vynásobte čokoľvek
založiť to je v, pridajte ju, a dostanete desatinné miesto.
Tak to je, ako sa počítať až 5 v binárnom.
Rovnako ako to, čo sme robili na posledná snímka, je to, ako by ste
predstavujú 1 až 5.
>> Podobne, rovnako ako vy môžete pridať a odpočítať v desiatkovej, alebo základu 10, alebo
naozaj nejaký základ, na možné pridať a odčítanie v binárnej.
Presne to, čo by ste očakávali, keď ste pridať dve ***, ak je väčší, rovná
ako 1, nesiete 1, aby je 0, a to ďalej, že cesta, len
ako by ste očakávať, že s pravidelným desiatkovej alebo akýkoľvek iný základ.
V pohode.
>> Takže ako som povedal predtým, všetko, čo pokračuje pod pokrievku nášho počítača
sa vykonáva v 0 a 1 let, alebo binárne.
Tak ako sme sa vyjadriť, napríklad, písmená, alebo čísla, alebo znaky?
A odpoveď na to je ASCII.
>> ASCII je mapovanie medzi znakmi ktoré by sme za normálnych okolností vidieť
Anglický jazyk ako to, B je, C je, podčiarkovník, pomlčky, a
niečo také.
A to, že mapuje na hodnotu ASCII.
Hodnota ASCII je len číslo, ktoré možno chápať vo vašom počítači.
A rovnako ako si môžete urobiť sčítanie a odčítanie s číslami, môžete to urobiť
je s hodnotami ASCII.
>> Takže v tomto prípade to, čo bude tlačiť?
Jo, tak len priestor B priestor C space D. Kde si moja myš ísť?
Všimnite si môžete definovať int na 65 rokov.
A pri tlači, že s použitím percent C, bude to interpretovať, že ako
charakter a vytlačí A.
>> Podobne, môžete deklarovať to ako char.
A keď si ju vytlačiť pomocou percent C, bude to interpretovať, že ako
percent D. A rovnako ako môžete pridať číslo, môžete pridať znaky sú
Hodnoty ASCII, v tomto prípade.
>> Tak trochu ukazovateľ pre každého.
5, ako reťazec, nie je v skutočnosti rovná 5.
Takže, ako môžeme previesť reťazec 5 na celé číslo 5?
Nejaké nápady?
Jo.
>> Takže ak máme 5 ako reťazec, môžeme odpočítať 0.
A že nám dám 5.
A podobne, ak máme 5 as integer, dodať, že na reťazec 0..
A to nám dáva reťazec 5.
V pohode.
>> Teraz si pripomeňme, späť na prednášku jedného, kde sme sa rozprávali o algoritmy.
Tak ako to vlastne chceme počítač robiť zaujímavé veci?
Vieš, len sčítanie a odčítanie Čísla a tlač veci nie je
že vzrušujúce.
Zvyčajne, chceme, aby náš počítač k vykonať nejaký algoritmus.
Niečo trochu zložitejšie než len prosté aritmetiky.
>> Algoritmus je len krok za krokom set pokynov pre spôsob vykonania
určitú úlohu -
rovnako ako recept.
Možno si ešte spomínate na prvý deň trieda, kde David sa nám počítať izbu
ľudí a koľko ľudí boli v miestnosti.
Tie by mohli byť použité na počítanie jeden po druhom.
1, 2, 3, 4.
V tomto prípade, lineárny algoritmus.
>> Ale Dávid predstavený algoritmus pre budete počítať ľudí v miestnosti
kde každý vstane, ste hovoril, že číslo na inú osobu, dodať, že
číslo ***, a jeden človek sadne.
A to zopakovať.
To je jeden druh algoritmu.
Môžeme analyzovať, ako efektívne algoritmus je založený na to behu.
Ale budeme hovoriť trochu Viac o tom neskôr.
>> Takže všetky algoritmy možno tiež byť zapísaný v pseudokódu.
Pseudokódu je práve angličtina ako syntax používa na reprezentáciu
programovací jazyk.
Napríklad, ak by sme chceli požiadať užívateľa uhádnuť moje obľúbené číslo, my
môže mať pseudokódu ako také.
>> Získajte užívatelia hádať.
Je-li odhad je správny, povedzte im, sú správne, inak im povedať,
že to nie je správne.
A pseudokódu je spôsob, ako ľahko predstavuje myšlienku alebo algoritmus.
Takže teraz by sme mohli chcieť, aby skutočne napísať to v jazyku, ktorý počítač
môže pochopiť.
Takže môžeme napísať náš pseudokódu a interpretovať, že do zdrojového kódu.
>> Zatiaľ zdrojový kód musí dodržiavať do určitej syntaxe
programovací jazyk.
A tak ďaleko, v CS50, máme Používam väčšinou c
Takže to môže byť zdrojový kód pre cca.
Neskôr v priebehu, budete v noci prišiel do styku s inými programovania
jazyky ako PHP.
Alebo, ak ste ešte prijať ďalšie triedy, vy môže robiť Java, Python, alebo dokonca OCML.
Avšak v našom c programovacom jazyku, to je ako by sme mohli písať zdrojový kód pre
pseudokódu algoritmu, ktorý Len som popísal predtým.
>> Tak ako sa váš počítač skutočne pochopiť, že?
Ako som povedal predtým, je to len naozaj chápe núl a jednotiek.
Tak ako to dostať zo zdroja Kód na niečo, čo môže byť
pochopil?
No, máme niečo volal kompilátor.
>> Ak si spomeniete, späť väčšinu svojho psets, ste mali nejaký druh programu
písaný v bodka c súboru.
A potom by ste mali zadať značku.
Takže to, čo sa robiť robí?
>> Môžete zadať make zostaviť svoj Program preto, že niekto -
kto písal svoje p sadu; Pravdepodobne David -
vytvoril make súbor.
A to hovorí, aby poznať na spustenie kompilátor, tzv zvonenie, ktorá bude
potom skompilovať zdrojový kód objektu kód, ktorý je núl a jednotiek
že počítač rozumie.
Ale niečo neskôr, budeme pokračovať viac do hĺbky o kompilátory.
>> Tak spomínam pset 0, kde - áno, Máte otázku?
>> DIVÁKOV: [nepočuteľné]?
>> SPEAKER 1: Áno.
Myslím, že v skutočnosti by mal byť on-line.
Jo.
>> DIVÁKOV: Je to ako [nepočuteľné]?
>> SPEAKER 1: To nie je.
Sú na cs50.net/quizzes.
>> DIVÁKOV: Slash kvízy, lomítko 2013, lomítko 0, a len preklikať
kvízy 2013 a kvíz 0, skontrolovať sekciu snímky.
>> SPEAKER 1: Jo, takže ak vy chcete vytiahnite ju *** a pozrieť sa na to na vašom
vlastný počítač, to je tiež v pohode.
Povedz to ešte raz.
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Jo, [nepočuteľný] je dummy premenná.
Ach, áno?
>> DIVÁKOV: [nepočuteľné]?
>> SPEAKER 1: Nie, štrajku nie sú na skúšku.
Ospravedlňujeme sa, ale jej otázka bola, bola štrajku na skúšku.
A to nie je.
Takže pset 0, mali by ste chlapci majú všetci realizované niečo, pomocou poškriabaniu.
A my sme sa naučili niektoré základné programovanie stavebné bloky pomocou scratch.
>> Takže poďme sa pozrieť na niektoré z týchto stavebných blokov
ktoré tvoria program.
Prvý z nich je logický výraz.
Booleovské výrazy, sú tie, a 0, alebo niečo, čo má
dve možné hodnoty.
V tomto prípade, pravdivé alebo nepravdivé, zapnúť alebo vypnúť, a áno, alebo nie.
Príkladom jednoduchého, veľmi jednoduché, program, ktorý využíva logickú
Výraz tu.
>> Tak, aby pre logické výrazy do byť užitočné, máme logických operátorov.
Jedná sa o subjekty, ktoré môžu byť použité porovnať určité hodnoty.
Takže máme a alebo nie je rovné, menšie ako alebo rovnajúcu sa alebo väčšie ako
rovná, a menej než alebo väčšia ako.
Ale títo operátori nie sú príliš užitočné, ak môžeme spojiť ich do
podmienky.
>> Takže vy si možno spomenú na zelenej lúke a od svojho p stanovuje, že
mal podmienok.
Oni sú, v podstate, ako vidličky v logika programu, ktorý
vykonáva v závislosti na tom, či podmienka je splnená.
Takže jedna z podmienok, ktoré sme mali používa mnohokrát v tomto kurze je
if, else, ak podmienky, a inde.
>> Tu je príklad toho, ako môžete použiť.
Vie niekto aký je rozdiel medzi len pomocou if všetky
Cesta dole verše if, else, v prípade, a inak v kombinácii?
Áno?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Presne tak.
Takže ak by som mal, ak celú cestu dole tento spôsobom, aj keď táto podmienka vracia
pravda, bude aj naďalej pokračovať testovanie ďalšie dva.
Vzhľadom k tomu, inde, ak iný vyhlásenie, v prípade, že jedna vracia true,
ostatné nie sú testované.
Akékoľvek otázky týkajúce sa, že?
V pohode.
>> Takže môžete použiť if-else of Else vyhlásenie, ak viete, že to len možné
byť jeden z týchto prípadov.
Takže vieme, že ak je x menšie ako 0, je určite nebude
väčšie ako 0.
>> Ďalšie, ďalšie stavebné kameň že sme sa dozvedeli, sú slučky.
Máme tri typy slučiek.
Pre slučky, while, a to pri slučiek.
A všeobecne, keď si sadnúť na niečo písať, musíte sa rozhodnúť,
ktorý z troch, ktorý chcete použiť.
Tak ako sme sa rozhodnúť, ktorý z nich?
>> Všeobecne používame pre sláčiky, ak vieme, koľkokrát chceme iterovat
cez niečo alebo koľkokrát chceme vykonať úlohu.
Používame while ak budeme potrebovať nejaké podmienka aby to bola pravda, aby beh.
A používame robiť, keď veľmi podobné zatiaľ čo, ale chceme, aby náš kód bežať
aspoň raz.
>> Takže, keď to, čo je v úloh bude vždy prebiehať najmenej raz.
Vzhľadom k tomu, sa na chvíľu, že nemusí spustiť vôbec, ak
podmienka nie je splnená.
Akékoľvek otázky s tým?
>> Takže štruktúra pre sláčiky.
Vy ste všetci videli to.
Môžete inicializovať.
Máte nejaký stave.
Tak, napríklad, môžeme inicializovať ako aj rovná 0.
i je menší ako 10.
A i + +.
Veľmi jednoduchá, že sme urobili.
>> Pre while, podobne, máte mať nejaký druh inicializácia,
nejaký stavu, a nejaká aktualizácia.
Takže môžeme realizovať naše pre slučku tiež ako while pomocou tejto.
A podobne ako s úlohami, kým slučka, by sme mohli mať nejakú inicializácii,
vykonať niečo, aktualizovať, a potom skontrolujte stav.
>> Takže teraz funguje.
My sme dali všetko dohromady.
Mohli by sme chcieť napísať niektoré druh funkcie.
Spoločné funkcie, ktoré by mohli Videl už je hlavné.
Hlavné je funkcia.
To má návratový typ, int.
Má názov funkcie, hlavné.
A to má argumenty, argc a argv.
Takže hlavné je len funkcia.
>> Ďalšie funkcie, ktoré by mohli používajú, printf - printf je funkcia -
Vezmi_int, toupper.
Ale to sa stalo, že bol implementovaný pre nás
nejaký knižnice.
Ak vy spomenúť, vrátane Táto knižnica CS50.h alebo
Štandardné I / O knižnice.
Áno, otázka?
>> DIVÁKOV: Je hlavnou len vlastné c?
Je to len druh [nepočuteľný]?
>> SPEAKER 1: Otázkou je, ak hlavné je vlastné c
A áno, všetky funkcie majú hlavnú funkciu.
Je to celkom nevyhnutné, aby počítač vedieť, kde začať
spustenie kódu.
>> DIVÁKOV: Takže by ste sa [nepočuteľný]?
>> SPEAKER 1: Nie
Nejaké ďalšie otázky?
V pohode.
Takže rovnako ako môžete využiť funkciu , Ktorý je napísaný pre vás, môžete tiež
napísať svoju vlastnú funkciu.
To je funkcia, ktorá by niekto mohol písali pre výpočet objemu
z Q, napríklad.
K dispozícii je návratový typ tu, v tomto prípade int, náš názov funkcie q a naše
Zoznam parametrov.
>> A všimnite si, že máte písať dáta typ parametra, ktorý chcete
použiť inak funkcia nie je vedieť, aký druh
parameter by som mal prijať.
Takže v tomto prípade, chceme číslo ako náš vstup.
Tak prečo by sme mohli chcieť použiť funkcie?
>> Po prvé, ideálne pre organizáciu.
Pomáhajú rozbiť svoj kód do viac organizovanej kusy a aby
to čitateľnejšie.
Zjednodušenie.
To je dobré pre dizajn.
Keď čítate kus kódu a hlavnou funkciou je naozaj,
naozaj dlho, mohlo by to byť ťažšie dôvod, prečo o tom, čo sa deje.
Takže ak ste vyraziť do funkcie, to by mohlo byť čitateľnejšie.
A opätovné použitie-schopnosť.
Ak máte kus kódu, ktorý je bytosť volali alebo sa spustiť viackrát,
Miesto prepisovanie, že kód 10 krát vo svojej hlavnej funkcii, môžete
chcete ho znova použiť.
A potom zakaždým, budete musieť použiť, že kus kódu, volanie funkcie.
>> Takže teraz, ak si spomenieme späť do nuly, sme tiež hovorili o niekoľkých pojmy,
z ktorých jedna je rezanie závitov.
Závit je pojem násobok sekvencie kódu
prevedenie v rovnakom čase.
Takže myslíte, že späť do prvého dňa, kedy mal David počítať vy off počtu
ľudia v miestnosti.
>> V podstate to, čo sa deje Na všetko je z vás boli
beží samostatné vlákna.
A tie závity sa stretávajú dostať nejakú odpoveď.
Podobne, v Scratch, keď máte viac škriatkovia, môžete
majú mačku a psa.
A oni by boli súčasne vedú svoje vlastné skripty.
To je príklad závitov.
>> A ďalší koncept, ktorý bol zavedený v roku nuly bola akcia.
A udalosti, ak sú viac častí Váš kód komunikovať spolu navzájom.
V nuly, to bolo, keď ste použili vysielanie kontrolu a keď som
Príjem bloky.
>> A tiež, v problémových Sada 4, videli sme Trochu udalostí rovnako.
Vy ste mohli použiť knižnica Gevent.
A tam bola funkcia waitForClick v ktorej ste čakali
pre užívateľov na kliknutie.
A vaše kliknutie, v tomto prípade by bolo akcie a čakať na kliknutie je vaše
obslužnú rutinu udalosti.
>> A tiež, v priebehu zobrazovanie vašich psets a pracovať na svojich psets, môžete
mohla prísť do styku s niektoré z týchto príkazov.
To je to, čo ste napísali do svojej okno terminálu alebo čokoľvek okno
ktoré sa objavia na vašom g upraviť, aby, v podstate, navigovať počítač.
>> Tak napríklad, LS uvádza Obsah adresára.
Uistite sa adresár vytvorí novú zložku.
CD, zmena adresára.
RM, odstrániť, odstráni súbor alebo nejaký adresár.
A potom odstráňte adresár odstráni adresár.
>> DIVÁKOV: [nepočuteľné]?
>> SPEAKER 1: Jo, jasne.
Ospravedlňujeme sa, ale otázka bola, ak by naznačovali uvedenie tejto
na ťahák.
Mohlo by to pomôcť.
Ak máte priestor, môžete si ju na.
Je to tiež len všeobecne dosť dobrý mať na pamäti, pretože pri použití
možno budete chcieť len si to zapamätal.
To bude váš život oveľa jednoduchší.
Už som odpovedal na vašu otázku?
>> Takže teraz, hovorili sme trochu Krátko o knižniciach.
Ale dva hlavné tie, ktoré sme boli s použitím doteraz v kurze sú
Štandardné I / O a CS50.
Aké veci sú zahrnuté v štandardnom I / O knižnice?
>> Jo, tak ďaleko sme použili printf.
V CS50, sme použili vezmi_int a GetString.
A dátový typ string je zhodou okolností tiež musia byť vyhlásené v tomto CS50 knižnici.
Porozprávame sa o trochu viac do hĺbky o ako knižnice fungujú a ako sa
komunikovať so zvyškom kódu.
Ale to sú dva hlavné tie, ktoré sme ktoré prichádzajú do styku s doteraz v
Samozrejme.
>> Typy.
Jedná sa o dobré si uvedomiť, ako veľmi Každý typ je reprezentovaný alebo ako
počtu bytov každého typu vyžaduje -
int, 4 byty, char 1 byte.
Float je 4 bajty.
Čo je dvojitý?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Jo, tak float ale zdvojnásobiť.
Čo dlho?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: OK.
Čo je to dlho?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Jo, dvakrát int.
Áno.
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Long [nepočuteľné].
A potom dlho dlho je dvojnásobná.
>> DIVÁKOV: Nie, nie.
Dlho len int.
Záleží na architektúre pred [nepočuteľný]
a int majú rovnakú veľkosť.
[Nepočuteľné].
>> SPEAKER 1: Tak dlhý a int sú rovnaké.
A potom dlho dlho je dvojaký int.
V pohode.
A potom, čo je posledný typ?
>> DIVÁKOV: Pointer.
>> SPEAKER 1: Jo, tak sme sa dozvedeli, trochu o ukazovatele.
A bez ohľadu na to, čo je ukazovateľ ukázal na - to by mohlo byť char hviezda
alebo int hviezda -
je to vždy 4 bajty pre ukazovateľ.
Otázky o tom?
Áno?
>> DIVÁKOV: [nepočuteľné]?
>> SPEAKER 1: Tak dlhý a int sú rovnaké v tomto CS50 zariadení.
>> Divákov: Prístroj je úplne zameniteľné.
>> SPEAKER 1: Jo.
Tak dlho, dlho double int.
>> DIVÁKOV: Toto je 32 bit?
>> SPEAKER 1: 32 bit, jo.
>> DIVÁKOV: Tak [nepočuteľné]?
>> SPEAKER 1: Áno, ak to nie je explicitne povedať, že
by mal prevziať 32 bitov.
>> DIVÁKOV: To by som povedal niečo ako predpokladu
Architektúra ako spotrebiče.
Pre 64 bit, len veci, ktoré zmeny sú túžia a ukazovatele.
Obaja [nepočuteľný].
>> SPEAKER 1: Áno?
>> DIVÁKOV: Otázka.
Takže na jednej z praxe kvízy, požiada o unsigned int.
Tak, ako by to byť stanovený z int [nepočuteľný]?
>> SPEAKER 1: unsigned v je 4 bajty.
Ale to, čo sa líši o podpísané int a unsigned int?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Správne.
Jeden môže predstavovať zá***é hodnoty.
Ale ako to urobiť, že?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Jo, to ušetrí 1 bit reprezentovať značku.
Podpísal má jeden bit, ktorý predstavuje znak.
A unsigned jednoducho všetkých pozitívnych výsledkov.
>> DIVÁKOV: OK.
Takže vravíte, že dvojité je dvakrát veľkosť plaváku?
>> SPEAKER 1: Double je dvakrát veľkosť plaváku, áno.
>> DIVÁKOV: Ako sa ukazovateľ na long long [nepočuteľný]?
>> SPEAKER 1: Takže otázka je, ako sa ukazovateľ na long long -
ako je to len štyri bytov, Je dlhá jej 8 bajtov.
Takže si spomenúť, čo je ukazovateľ, v podstate, na samom základné hodnoty.
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Jo, tak ukazovateľ je len miesto v pamäti.
Takže nezáleží na tom, koľko miesta že ukazovateľ ukazuje.
Je len potrebné 4 bajty sledovať tejto pamäte.
Nejaké ďalšie otázky?
V pohode.
>> Takže posledná vec, ktorú musím je štandardný výstup.
Mali by ste ich používať často natoľko, že si môžete spomenúť.
Ale to je, keď použijeme printf, napríklad.
A máme tieto zástupné symboly, ktoré boli povolaní formáte kódy.
>> Takže percent c char, percenta aj pre int, a môžeme tiež použiť percent d.
Je to to isté.
Ale, všeobecne, v CS50 sme skúste použiť percent i
Percentá f na plaváku.
Percento ld dlho dlho a percent s pre reťazec.
>> Rovnako tak sme používali niekoľko z týchto escape sekvencií.
Napríklad, spätné lomítko n na nový riadok.
To je len, keď ste formátovanie Váš kód pre tlač f
Áno?
>> DIVÁKOV: Čo je to percent d pre?
>> SPEAKER 1: Takže otázka je to, čo je percent d pre?
Percento d je pre ints.
Percento d a percenta aj sú rovnaké.
>> DIVÁKOV: Aký je rozdiel medzi spätné lomítko n a lomka r?
>> SPEAKER 1: Takže otázka je, čo je Rozdiel medzi vôľou n a
odpor r?
Myslím, že spätné lomítko r -
>> DIVÁKOV: Tak spätné lomítko r len znamená, sa vráti na začiatok riadku
bez toho by vlastne ísť na nový riadok.
Takže ak máte vytlačiť spätné lomítko r a návrat na začiatok riadku
potom si vytlačiť viac vecí, môžete prepísať veci, ktoré je už na
[Nepočuteľné].
Vzhľadom k tomu, n v skutočnosti ide do novej linka a ide do [nepočuteľný].
>> SPEAKER 1: No, nejaké ďalšie otázky?
Dobrá.
Chystám sa odovzdať ju do Dan, ktorý bude pokračovať.
>> [APPLAUSE]
>> DAN: Tak jo.
Takže budem hovoriť o ďalší široký Rad myšlienok z triedy, ktoré sú
zhruba zástupca dva týždne a Začiatok tretieho týždňa rozjazde
s liatím, čo je len spôsob, ako liečenie hodnotu určitého typu as
hodnotu iného typu.
Takže to môžeme robiť s znakmi na ints, pláva na ints, a
dlhé túži na dvojnásobok.
>> Všetky tieto veci môžu byť použité ako spôsoby liečenie nejakú číselnú hodnotu
mínus char ako iné číselná hodnota.
Takže tam sú niektoré problémy s tým, ze Kurz, ktorý príde, keď obsadil
veci, ako je plaváku na ints.
Tak toto je trochu divný.
Máme plavák, ktorý je 1.31.
Vynásobíme ju 10000.
A potom sme ho vytlačiť ako int.
Čo robí tento výstup?
10,000 krát 1.31.
Takže 13000, je to odhad?
>> DIVÁKOV: Myslím, že je to 10000.
>> DAN: Tak som sa vynásobí 10000 predtým, než som ho liatia.
>> DIVÁKOV: Oh.
Nebolo by tam byť jeden 9 a niektoré 0 čísla?
>> DAN: Môžete mať nejaké podivné číslice.
Tak jo, to je 1,3 krát 10,000.
Tak to je 13000.
A to navyše divný -
>> DIVÁKOV: 13.100.
>> DAN: 13100.
Ďakujem, Robe.
A to navyše podivnosť -
Tento 9,9 -
je jednoducho preto, že tento odliatok skončil zaokrúhlení nadol, kde
to by nemalo mať.
Jo.
>> Divákov: liatie sa stane po čokoľvek iné?
>> DAN: Takže, pretože som to v tlačenej podobe, je Znamená to, násobenie pred ním
to liatia.
>> DIVÁKOV: [nepočuteľné].
>> DAN: Myslím, že by obsadenie prvý, jo, čo by bolo 10.000.
Ešte niečo?
V pohode.
Tak toto je 13099.
Prečo sa to stalo?
Nepresnosť.
>> Plaváky nie sú dokonalé.
Môžu predstavovať iba čísla určitý počet významných osobností.
Takže ak budeme tlačiť 8 sig figy na to float, získame akúsi
škaredý hľadáte číslo.
A to preto, 1.31 nemožno presne byť zastúpené jednoduché
právomoci dvoch na stroji.
Takže to skončí s najbližšou hádať, ktorá končí
je trochu málo.
Zmysel?
OK.
>> Teraz, zapnutie je iný spôsob robí podmienené príkazy, kde sú všetky
staráme sa len o jediné premenné.
Takže v tomto konkrétnom prípade sme získanie celé číslo od užívateľa.
A potom sa pozeráme na čo to číslo je.
Možno predpokladať, že je to číslo medzi jedným a štyrmi.
To je to, čo žiadaš.
>> Takže si urobiť prepínač názov premennej.
Potom môžete nastaviť prípadoch možné Hodnoty by to mohlo byť.
Takže v prípade, že jeden, hovoria, že je nízka.
A potom si zlomíte dostať von stavu spínača tak,
nemusíte ísť ďalej.
>> V ďalšom prípade -
tak tomu dva a prípad troch -
ak je to prípad dvoch to len klesne Prvý riadok kódu to vidia rovnako ako u
malá tri, kým nenarazí na prestávku.
Takže dôvod, prečo ste si prípad jedného do iba tlač nízka preto, že som
túto prestávku tu.
Mám-li, povedzme, ignoroval túto prestávku - keď som hodil tento odtrhnutie -
to by tlačiť nízka, a potom by vytlačiť strednej, a potom by to zlomiť.
>> Takže prestávky sú dôležitou súčasťou z prepínať podmienky a
že by tam mala byť.
Všetky prípady, ktoré nie sú výslovne uvedené sú spracované predvolené
malá v spínači a mali by byť obsadenie.
>> DIVÁKOV: Tak 1, 2, 3, a 4 by sa n?
>> DAN: Hodnoty, ktoré n môže byť.
Áno.
Jo?
>> DIVÁKOV: Takže keď máte že [nepočuteľný]?
>> DAN: Tie by tlačiť nízka, a potom že by sa vytlačiť strednej a
potom by to zlomiť.
>> DIVÁKOV: Prečo by to vytlačiť middle-ak [nepočuteľný]?
>> DAN: Tak všetko v prípade, pred prestávka spadá.
Tak tomu jeden tlač je pod prípad jeden, ako je to po tlači.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Tak toto číslo je len zvláštne hodnota, ktorú táto premenná
môže vziať, že jo?
Má to zmysel?
Jo.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Áno, prípad dvoch vytlačí strednej a potom zlomiť.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Myslím, že nejaké?
Aké ďalšie dátové typy môžete prepínať?
>> DIVÁKOV: Môžete prepínať cez akékoľvek dátové typy.
Ale to len znamená, že čokoľvek *** znakov a ints a tak podobne, pretože
ak ste prepínanie ukazovatele to nie je naozaj zmysel,
prepínanie zaťaženie, ak je to dokonca rokov to urobíte, pretože plávajúcou desatinnou čiarkou
v presnosti, by ste v skutočnosti Chcem to urobiť tak ako tak.
Takže v podstate, len ints a znaky a veci, ako že.
>> DAN: Jo, to je, keď máte explicitné hodnoty, ktoré poznáte, myslím, že môže byť
že prepínač je v skutočnosti užitočné.
Dobrý?
OK.
>> Rozsah je rozsah, ktorý vyhlásil, variabilný rozširuje.
Takže v tomto malom kuse kódu mám, to bude plná chýb.
A dôvod je, že som vyhlásil tento int aj v rámci tohto pre sláčiky.
A potom som sa snaží odkazovať, že aj mimo, že pre rozsah slučky.
>> Takže v podstate, môžete premýšľať o rozsahu ako niečo, keď deklarujete
sa vnútri súboru zložených zátvorkách iba existuje v týchto zložených zátvoriek.
A ak sa pokúsite a použiť túto premennú mimo týchto zložených zátvoriek, budete si musieť vybrať
Dostávam chybu z kompilátora.
Jo?
>> DIVÁKOV: Tak toto nefunguje?
>> DAN: To nefunguje, áno.
Reťazca.
String char *.
Sú to presne to isté.
Sú to len ukazovatele na charaktery.
A všetky reťazce, ktoré máte by mal skončiť s lomítkom nulové, čo je práve
c konvencie.
>> To sa nazýva NULL zakončenie.
A NULL -
kapitál N, kapitál U kapitál L, kapitál L -
nie je to isté ako NULL terminátor.
To je ukazovateľ.
To je charakter.
Oni sú veľmi odlišné.
Pamätaj si ho.
To bude na kvíz, pravdepodobne.
Nevidel som kvíz.
Jo?
>> DIVÁKOV: Tak NULL je, povedzme, ukazovateľ?
>> DAN: Áno.
>> DIVÁKOV: Čo znamená [nepočuteľný]?
>> DAN: Ak je, povedzme, malloc je volaná, keď ste nemajú dostatok pamäte, aby si
bez ohľadu na veľkosť žiadaš, malloc vráti NULL.
Je to v podstate, keď je funkcia mal vrátiť ukazovateľ, budete
je potrebné skontrolovať pred NULL, pretože NULL je celkom dobrý -
to je, tak nejako, hodnota odpadky.
Je to ako pokiaľ ide o ukazovatele ísť nula.
>> Kedykoľvek budete volať funkciu, ktorá vracia ukazovateľ.
Budeš chcieť skontrolovať, aby sa Uistite sa, že, že ukazovateľ nie je NULL
preto, že NULL je veľmi časté.
Je to akýsi návrat odpadky.
Takže ak sa niečo sa nedarí, len vrátiť NULL miesto.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Áno, a to je to.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Spell ako to.
Je to NULL zakončenie.
Je to malá N-U-L-L, ak ste hláskovanie to.
>> DIVÁKOV: A ja som proste šiel späť a skúša to.
A ak sa pokúsite dať s plávajúcou desatinnou čiarkou cení do prepínača, bude to kričať na vás
hovorí, vyhlásenie vyžaduje výraz integer typu.
>> DAN: Tu to je.
Ale jo, to bola otázka znova?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Tak kapitál N, kapitál U kapitál L, kapitál L je skutočná c vec.
To je ukazovateľ NULL a bude len byť ako taký.
Nebudete niekedy skúsiť a kúzlo NULL charakter a vidieť akýkoľvek
iným spôsobom, než je táto.
Jo?
>> DIVÁKOV: Tak návrate do char max alebo niečo v poznámkach, by to
stelesňujú rovnakú funkciu ako [nepočuteľný]?
>> DIVÁKOV: Takže máte na mysli vracia char max z getchar, alebo
čo to je?
>> DIVÁKOV: Jo.
>> DIVÁKOV: Jo, tak všeobecne termín pre všetky tie veci
sú overovací hodnoty.
Tak ako vracajúci int max od vezmi_int a char max od getchar, je to
by mal byť rád, v poriadku, ak Tieto veci sa vracajú k nám,
niečo sa pokazilo.
>> U ukazovateľov, len náhodou tento sentinel hodnota, ktorá každý
súhlasí s tým.
A to je vec, ktorú by ste sa vrátiť keď sa niečo pokazí.
Takže char max je to, čo sme pomocou reprezentovať niečo
ako NULL alebo getchar.
>> DIVÁKOV: Takže ak ste testovania getchar, mohol by si dať NULL?
Bolo by to niečo zmeniť?
>> DAN: Dalo by sa to len skontrolovať NULL.
Musel by ste skontrolovať char max, pretože návratová hodnota funkcie je
postava nie je ukazovateľ.
Jo?
>> DIVÁKOV: Táto otázka sa pýta pre dĺžku reťazca.
Znamená to, že obsahujú znak NULL?
>> DAN: Nie
A to je vlastne, ako dĺžka reťazca vie, zastaviť, pretože to prechádza
vaše pole znakov, kým to vidia znak NULL.
A potom je to ako všetko Dobre, som urobil.
>> DIVÁKOV: [nepočuteľné] päť?
>> DAN: Dobrý deň bude päť.
Jo.
Takže polia sú spojité bloky pamäte.
Majú okamžitý prístup tým, názov poľa, a potom, v kučeravý
traky, bez ohľadu na index, ktorý chcete ísť sa, že sú indexované od nuly do
Dĺžka poľa mínus 1.
>> A oni to vyhlásil podľa typu vec, že ste ukladanie do
pole, názov poľa, a potom bez ohľadu na veľkosť tohto poľa.
Takže je to char pole o dĺžke šesť, ktorý má tieto hodnoty.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Jo.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Ak máte to, čo sa deje do už poľa vyrobený.
Takže by ste mohli zadať toto miesto as, povedať, char, bez ohľadu na názov vášho
Pole je prázdne zátvorky rovná kučeravé Ortéza H čiarka čiarka E L L čiarka čiarka
O čiarka znak NULL a zložená zátvorka.
To by tiež fungovať ako vyhlásenie.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Potom musíte mať veľkosť už.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Áno.
V poriadku.
Argumenty príkazového riadku sú spôsob, ako ako vstup od užívateľa, ako
Argumenty hlavné.
Hlavné berie dva argumenty.
Počet argumentov, ktorý je prešiel pozdĺž príkazového riadku a A
string vektor alebo pole reťazcov zo všetkých argumentov.
>> Takže keď som sa, povedzme, sa nazýva funkcie, ako je dot out 1 miesto, 2 priestor, tri,
argc by byť 4.
A argv 0 bude bodka von.
Argv1 by 1.
argv2 by 2. argv3 bude 3, v tomto konkrétnom prípade.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: posledný prvok v poli preto, že je pole dĺžky a argc
jeden z argB, posledný prvok je ukazovateľ NULL.
Je argc plus 1.
Takže v prípade, že som práve povedal, že by argv 0 je bodka von.
argv 1 je 1. argv2 je 2. argv 3 je 3.
argv 4, čo je jedna väčšia než argc by byť NULL.
>> A to je ukazovateľ NULL.
Áno.
A to preto, že reťazec je char hviezda je ukazovateľ.
Tak to musí byť rovnakého typu.
Jo?
>> DIVÁKOV: Dve otázky.
Takže jedna, aký je rozdiel medzi to a GetString iné ako jednom type
v užívateľskej motora?
A za druhé, je to uložené v vaša posledná spomienka?
Tak ako, by GetString byť [nepočuteľný]?
>> DAN: Tam, kde je to uložené?
Ja neviem, kde je uložený.
>> DIVÁKOV: Takže, vlastne, viete, ako si fungovať hovoríte, že je to argumenty
sú uložené v zásobníku?
Takže argc a argv sú argumenty pre hlavné a oni sú na zásobníku, alebo naozaj
tesne *** to, čo si myslíte, že ako štart stack.
Aká bola druhá časť otázky?
>> DIVÁKOV: Takže to, čo je [nepočuteľný]?
>> DAN: Jo, je to len iný spôsob, ako ako sa dostať vstup od užívateľa.
Tahle je o niečo účinnejší a je to šikovnejšie pre skripty, pretože vám
môže len odovzdať argumenty do hlavného funkcie skôr než čakať
pre používateľa v prípade, že nemáte žiadne užívateľom.
>> DIVÁKOV: A jo, získať reťazca by [nepočuteľné].
To by sa ukladať veci, ktoré potrebujete.
>> DAN: Jo?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Áno, argv 0 vždy zahŕňa bodka lomítko z volania funkcie.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Áno, každý z argumentov sú skončila znak NULL, pretože
sú reťazce.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Áno, argv argc je ukazovateľ NULL.
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Ach jo.
Jo, ospravedlňujem sa.
>> DIVÁKOV: Tak [nepočuteľné]?
>> DAN: Takže otázka je, ak ste mali príkazového riadku bodka lomítko bodku z 1, 2,
by počet príkazového riadku Argumenty byť dva alebo by to bolo tri?
>> DIVÁKOV: Myslím, že to nie je naozaj záleží.
Mám vo zvyku hovoriť, oh, si neprešiel žiadne argumenty príkazového riadku, keď
Je zrejmé, že sa nazýva funkcia.
Tak som tendenciu hlasno vylúčiť funkcie z príkazového riadku
argumenty, aj keď je to súčasťou argv.
>> DAN: Ale keby to bolo na skúšku -
Jo - a tiež ak poviete niečo ako argc sa rovná 3,
ste v núdzovom státí.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Myslím, že keby namiesto volania tejto v argc a argv reťazec zátvorkách
ale stále rovnaké typy a len volal je niečo iné, ako
a b, to by ešte fungovať?
A to by ešte fungovať, by ste len -
namiesto použitia argc - by ste používať a b.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Takže otázka je GetString je bude ukladať pamäť na halde
pretože GetString je char *.
Ukladá pamäte v halde, pretože to žiada, aby sa podnikom malloc v aktuálnej
realizácia GetString.
OK, ďalej.
>> Security.
Takže sa naozaj bezpečné, môžete spoľahnúť na č jeden a necháte nikto prístup k akejkoľvek
vaše informácie, čo je dôvod, prečo všetci stavia svoje vlastné stroje,
ich vlastné operačné systémy, všetky ich programy z nuly, a samozrejme
nepripájajte žiadne iné zariadenie cez internet.
Takže počítače sú neisté.
Oni naozaj sú.
Musíme veriť ostatným ľuďom.
>> A myšlienka bezpečnosti je, že ste sa snaží obmedziť množstvo
veríme, že budete potrebovať.
A jedným z prostriedkov, ktoré robíte, že je cez kryptografiu.
Kryptografie je, v podstate, máme tajomstvo.
>> Niekedy musíme prejsť naše tajomstvo spolu cez, povedzme, na internete alebo
iné veci.
A my nechceme ľudí poznať tieto tajomstvá.
Tak sme zašifrovať naše tajomstvo na ceste že dúfame, že nikto nemôže prísť.
>> Takže sme použili -
prostredníctvom priebehu tejto triedy -
veci ako Caesara a [Nepočuteľné], čo sú obaja veľmi, veľmi
neisté spôsoby šifrovania veci.
Sú ľahko zistiť, čo sa sú a aké sú vaše tajomstvá sú.
Skutočný svet používa oveľa viac zložité šifrovacie schémy.
A budeme sa dostať do oveľa viac než to.
>> Ladenie.
GDB je najlepší.
Chystám sa zdôrazniť to znova.
Použite gdb po celú dobu každý keď budete mať problém.
Príkazy, ktoré sú užitočné v GDB sú rozbiť, ktorý predáte buď linku
číslo, názov funkcie, v podstate kde v kóde Ak chcete zastaviť,
a musí byť schopný prevziať kontrolu.
>> Tlač má premennú a vytlačí čo že premenná je, že
bodu v prevedení.
Ďalšie pohybuje váš výkon po jednom kroku.
A krok kroky vnútri funkcie v prevedení.
>> Ostatné veci sú beh, čo je, ako ste skutočne spustiť svoj kód.
Continue všetky kroky potrebné sa dostať k ďalšiemu bodu zlomu.
A existuje mnoho, mnoho ďalších.
Nájdite si ich.
Sú to skvelé.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Áno, čo je debugger.
Takže debugger je program, ktorý umožňuje ladenie programu.
Nie je to program, ktorý nájde chyby pre môžete, aj keď to by bolo skvelé.
>> A posledný je pre mňa hľadanie.
Takže typy hľadanie, ktoré sme hovorili o V tejto triede sú lineárne vyhľadávanie,
čo je len, že sa pozriete do každého prvok vyhľadávacieho priestoru, jeden
prvok v čase, kým nenájdete to, čo hľadáte, alebo, kým sa nezobrazí
koniec vašej hľadanie priestoru, v ktorom Bod hovoríte, že ste nemohli nájsť
prvok, ktorý ste hľadali.
A to trvá v najlepšom konštantnom čase, čo je 0 1 a v najhoršom prípade lineárnej
Doba, ktorá je 0 n
>> Binárne vyhľadávanie, ktoré je potrebné špinavý prvky.
Idete do stredu svojich prvkov, či prvok hľadáte
je väčší alebo menší, než je prvok že ste v stredu.
Je to väčšia, hovoríte, že dno vášho hľadania priestoru je vaša
aktuálna poloha, stredná, a reštartovanie procesu.
Ak je to menšie, vyzeráš hovoria že - jo, čo sa deje?
>> DIVÁKOV: [nepočuteľné]?
>> DAN: Áno.
Každý druh druh, ktorý bol vyučovaný v trieda je poctivá hra pre skúšku.
>> [Smiech]
>> DAN: A skutočnosť, že ste nemali aby to pre problém nastaviť, je to fér
hra pre skúšku.
>> DIVÁKOV: Môžeme ísť na to, ako -
>> DAN: bude to preč cez.
>> SPEAKER 2: Skutočný kód [Nepočuteľné] je na study.cs50.net.
Takže keď sa pozriete na problém praxe na stránke zlúčenie druhu
study.cs50.net, je kód k vykonávaniu hromadnej korešpondencie druhu.
Takže nemusíte vykonávať to si dnes večer.
Ale uistite sa, že ste to pochopili skôr než len memorovat to.
>> DIVÁKOV: [nepočuteľné]?
>> SPEAKER 2: stránky merge sort na study.cs50.net, je prax
problém, ktorý, ak sa preklikať Problém, na samom konci je
riešenie, ktoré je zlúčenie implementácia triedenie.
Ale uistite sa, že ste to pochopili skôr než len memorovat to
alebo kopírovanie ho nadol.
>> DIVÁKOV: A dokonale platný problém pre skúšku bude
niečo ako tu je zoznam.
Čo to zoznam vyzerať po jeden krok výbery druhu alebo
vloženie triedenie alebo čokoľvek iného.
Jedna iterácia plný zoznamu.
Takže aj keď nechcete skončiť museli Kód pre neho, musíte pochopiť
stačí vedieť, ako to ide , Ktoré majú byť zmenu tohto poľa.
>> DAN: Tak to je pre mňa.
>> [APPLAUSE]
>> LUCAS: Ahoj všetci.
Moje meno je Lucas.
Budem hovoriť o rekurziu, všetky že druhy, ktoré sme sa naučili, a
Trochu všetkých ukazovateľov.
OK?
Takže v prvom rade, rekurzia.
Čo to znamená povedať, že funkcia je rekurzívny?
>> DIVÁKOV: žiada sám.
>> LUCAS: OK, volá sám, jo.
Tak ako obrázka, napríklad.
Je to ako na obrázku vo vnútri na obrázku a tak ďalej.
Tak napríklad, môžete mať - ako Dan že hovoril o binárne vyhľadávanie.
Jedným zo spôsobov, binárne vyhľadávanie rekurzívne, je fakt, že ste
sa snaží nájsť číslo.
Takže idete do stredu.
A potom by ste skontrolovať, či sú čísla tam na ľavej strane a na pravej strane.
>> A potom, keď zistíte, že číslo je bude na ľavej strane, je to rovnaké
niečo ako znovu robiť vyhľadávanie, ale len v ľavej časti zoznamu.
Tak to je, ako to vyzerá ako je rekurzívny.
Takže to je dôvod, prečo chlapci majú rekurzívne riešenie pre zlúčenie druhu.
>> OK, tak tu je príklad.
Takže povedzme, že chcem vybrať všetky čísla od 1 do n.
Môžem si uvedomiť, že súčet n číslo n a n mínus 1 až 1.
Ale potom, keď som sa na n mínus 1 plus n mínus 2 plus 1, to je rovnaký
vec ako súčet čísel až n mínus 1.
Takže môžem povedať, súčet rovnaké čiastky sa rovná n plus súčet n mínus 1.
Má to zmysel?
>> A tiež bude niečo iné tzv referenčný prípad, ktorý je
súčet čísel *** na nulu, je nulová.
Takže akonáhle sa dostanem do počtu nula, zastavte som počítať.
Má to zmysel?
>> Takže tu je príklad toho, ako Môžem realizovať to.
Tak som si túto funkciu v niektorej z nich.
To trvá celé číslo n
Tak tu som najprv skontrolovať, či n je menšia alebo rovná nule.
Takže ak je to menej alebo rovné nule, som vrátiť sa na nulu, čo je náš základný scenár.
Inak môžem len vrátiť n a súčet čísel z
kto n mínus jedna.
Zmysel?
OK.
>> Tak tu je to, ako to vyzerá.
Máte súčet 2 sa rovná 2 plus súčet 1.
A niektoré z 1 je 1 plus súčet 0, čo je 0.
Zmysel?
Takže ak sa pozrieme na zásobníku vášho Program, to je to, čo to vyzerá.
>> Po prvé, máme hlavnú funkciu.
A potom hlavné funkcie tzv súčet 2.
A potom suma 2 sa chystá povedať, oh, súčet 2 sa rovná 2 plus súčet jedného.
Tak som sa pridať čiastku vo výške 1 do zásobníka.
A súčet 1 bude volať súčet 0, ktorý je tiež bude pridaná
do zásobníka.
A potom každý z týchto tých, ktoré sú na druhú musieť vrátiť
než tie ostatné môže ísť ďalej.
>> Tak napríklad tu, súčet 0, Prvý, sa chystá k návratu 0..
A potom vybrať čiastku vo výške 1.
Potom súčet 1 bude návrat 1 až súčtu 2.
A konečne, súčet 2 sa deje vrátiť sa 3 na hlavné.
Má to zmysel?
>> Je to naozaj dôležité pochopiť, ako zásobník pracuje a snaží sa
uvidíme, či to dáva zmysel.
OK, tak triedenie.
Tak prečo je triedenie dôležité, v prvom rade?
Prečo by sme sa mali starať?
Každý, kto?
Daj mi nejaký príklad?
Jo?
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Jo, OK.
Takže môžete vyhľadávať efektívnejšie.
To je dobrý spôsob.
Tak, napríklad, máme veľa veci, v skutočnosti, v našich životoch, že
sú radené.
Napríklad, slovníky.
>> Je veľmi dôležité, aby sa všetky slová v nejakom druhu, aby sa
môžu pristupovať ľahko.
Tak to je to, čo hovorí.
Môžete vyhľadávať efektívnejšie.
Premýšľajte o tom, aké ťažké to bude mať slovník, slová sú v
náhodnom poradí.
Budete sa musieť pozrieť na, do značnej miery, každý slovo, kým nenájdete
slovo, ktoré hľadáte.
>> Ak používate Facebook tiež, keď pozeráte sa na svojich priateľov, že ste
ide vidieť, že Facebook dať svoj bližšie priateľ je na vrchole tých,
že nemusíte hovoriť, že veľa.
Ak sa vydáte celú cestu až na dno váš zoznam priateľ, budete vidieť
ľudia, ktorí pravdepodobne nemajú ani nezabudnite, že ste priatelia s
A to preto, že Facebook druhy vaši priatelia založené na tom, ako
zavrieť ste k nim.
>> Tak organizovanie dát.
Tiež Pokemon.
Takže vidíte, že všetky pokemonov majú čísla.
A to je ako ľahké spôsob prístupu k dátam.
>> DIVÁKOV: Prístup Pokemon.
>> LUCAS: Jo.
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Jo.
OK, takže výber sort.
Voľba triedenia sa chystá vybrať Najmenší netriedený hodnota zo zoznamu každého
čas v každej iterácii.
Je to niečo ako druh, čo robíte vo vašej hlave, keď sa snažíte
zoradiť zoznam na ruke.
>> V podstate všetko, čo urobiť, je sa pozriete pre najmenšie číslo.
Môžete dať do triedeného zoznamu.
A potom sa pozriete na ďalšie najmenšie číslo.
A potom budete robiť že a tak ďalej.
>> Takže výber druh je v podstate si vyberte zakaždým najmenší
netriedeného hodnota.
Dajte na konci triedeného Súčasťou zoznamu.
A pokračovať v tom, že.
Takže poďme sa rýchlo pozrieť, čo to vyzerá.
Tak tu je uvedená a netriedený zoznam.
>> Takže zoradené v zozname, je spočiatku prázdna.
A potom idem na výber Najmenšie číslo tu, čo je 2.
Tak som sa na číslo 2 a dal som v prednej časti zoznamu.
A potom som sa pozrieť na ďalšie najmenší element, ktorý je 3..
Tak som ju na konci z triedeného zoznamu.
A potom som to robiť.
Zistil som, 4 a dať to na konci.
Nájdite 5 a dať to na konci.
>> A pozrite sa na to, ako všetky tie časy, ktoré Hovorím, že dať to na konci je,
v podstate, že vymení dve hodnoty.
OK?
A potom ten posledný, ktorý ste práve ešte jeden prvok.
Tak to už je zoradený.
>> OK, takže vloženie sort.
Vloženie triediť budete mať tiež že vec má triedeného i
netriedený zoznam.
Jediná vec je, že zakaždým, keď tie pridanie prvku na radené
zoznam, stačí vybrať prvok, ktorý je v prednej časti netriedeného zoznamu.
A potom budete nájsť to, čo pozícia by mala byť v ďalej
Súčasťou zoznamu.
>> Poďme sa pozrieť, čo to je, takže to dáva väčší zmysel.
Takže najprv, napríklad, snažím sa vložiť číslo tri v
ďalej časť zoznamu.
Takže zoznam nemá nič.
Tak som si len dať číslo 3.
>> Teraz chcem pridať číslo 5 na triedeného časť zoznamu.
Tak som sa pozrieť na čísla 5.
Všimol som si, že je to väčšie ako 3.
Takže viem, že to musí byť po 3.
Tak som dal 3 a 5.
>> Potom Chcem vložiť číslo 2.
Všimol som si, že číslo 2 je v skutočnosti posledný potom obaja 3 a 5.
Takže som vlastne dať to všetko ako na začiatku zoznamu.
Takže musím, druh, posunúť všetky prvky triedeného zoznamu, takže môžem
vytvoriť priestor pre číslo 2.
>> Potom vidím číslo 6.
Vidím, že by to malo byť po 5.
Tak som to tam dal.
A nakoniec, keď sa pozriem na číslo 4.
A všimol som si, že by byť medzi 3 a 5.
A potom som to tam dal a posun všetky ostatné prvky.
Zmysel?
>> Bubble Sort.
Takže bubble sort je v podstate to, čo ste robiť - to nazývame bublina
druh, pretože si prejsť zoznam - je to vlastne lepšie, keď som len ukázať
sa ti to páči -
a budete k porovnání susediace čísla.
A vy budete vymieňať svoje pozície v prípade, že nie ste
v správnom poradí.
>> Takže v podstate to, čo sa bude stane, je tu napríklad,
Máte-8 a 6.
Viete, že zoradené objednávka bude v skutočnosti 6 a 5, že jo?
Takže sa chystáte vymeniť objednávky.
Potom vidím, 8 a 4 tu.
A ja to isté.
Znovu som vymeniť.
A konečne, 2 a 8.
Tiež som ich vymeniť.
>> Je to tzv Bubble Sort, pretože po každý z týchto iterácií, v skutočnosti,
najväčšie číslo v zozname dostane všetky cesta na koniec zoznamu.
Má to zmysel?
Vzhľadom k tomu, že udržuje ju vymeniť a pohybuje sa doprava.
>> OK, tak to je druhá iterácia.
Bolo by to to isté.
Urobím jednu výmenu a potom posledný.
Som si, že tam nie sú žiadne swapy a zoznam zoradený.
Takže v Bubble Sort, sme v podstate udržať prechádza zoznam a vymieňať
veci, kým som si, že som to neurobil každý swap robiť, že iterácie, ktoré
znamená, že zoznam už je zoradený.
Zmysel?
>> Hovorme trochu o prevádzke.
Takže vy spomenúť Big O, Omega, a Theta?
Jo?
OK, čo je Big O, v prvom rade?
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Jo, je to tzv najhorší prípad runtime, čo jednoducho znamená, že je to
koľko očakávate program aby sa spustiť.
Rovnako ako, pokiaľ ide o -
v tomto prípade - n
Počet prvkov v zoznam v najhoršom prípade.
Rovnako ako v najhoršom možnom prípade.
>> Takže pre Bubble Sort, napríklad, máme Big O n námestí.
Prečo máme, že?
Prečo je Bubble Sort Big O n štvorec?
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Jo, takže v najhoršom prípade bude že budem musieť robiť n iterácií.
Takže každý z iterácií bude prinesie najväčší prvok na koniec
zoznamu.
Takže najhoršie je, že mám k tomu, že vec n-krát.
A pre každý z týchto časov, musím to n swapy, pretože mám k porovnání
každé dva prvky.
Takže to je dôvod, prečo je to n na druhú pretože to je n krát n
>> Potom, výber triedenie je tiež n námestí pretože pre každú iteráciu, musím
pozrite sa na každé jednotlivé súčasti v zozname.
A potom nájsť najmenšie, čo znamená, že musím
prehliadnuť n prvkov.
A musím robiť, že n-krát, pretože Mám vybrať všetky n prvkov.
>> Vloženie druh je tiež n námestí pretože najhoršom prípade bude
byť jeden, musím vložiť n čísla, nie?
Takže už viem, že idem mať n iterácií.
Ale pre každý z týchto čísel, keby som mal pozrieť sa na všetky čísla v
radené zoznam a dať to celú cestu v prednej časti, ktorá bude n námestí
, Pretože to bude n krát n znova.
Zmysel?
Čo omega?
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Je to najlepší možný scenár.
Takže je to ako v mnohých časov pre triedenie, najlepší scenár je
, Ak je list už uvedená.
Takže si naozaj nemajú nič robiť.
Bubble má Radiť najlepšie scenár n
Neviete prečo?
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Áno, ak budete mať prehľad o či údaje pomer nejaké swapy alebo
nie, ak máte niečo ako sadu na platí v prípade, že bol iterácie, v prípade, že
Zoznam už je zoradený, v podstate, čo sa stane je, že idem do
skúste vymeniť každé dva susedné prvky.
Budem vidieť, že nie sú swapy.
A ja som len vrátiť hneď.
>> Takže to znamená, že som jednoducho musel prechádzajte zoznamom a jeden čas.
Tak to je n preto, že sa pozerám na n prvkov.
Prečo výber triediť n námestí?
>> Jo, aj keď je v zozname uvedená, pre každej iterácie výber druhu, som
musieť vybrať minimálny prvok.
Takže to znamená, že som sa pozrieť u všetkých prvkov v netriedeného
zoznam a nájsť minimum pre každú iteráciu.
Má to zmysel?
>> A vloženie meč je n preto, že v prípad, že sa snažím vložiť
čísla a všetky čísla, keď som pokúsiť sa ich vložiť, vidím, že
sú v správnej polohe.
Nemám ísť skontrolovať všetky ostatné Čísla v netriedeného zoznamu.
Takže to je dôvod, prečo to bude n
Zmysel?
A čo je theta?
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Čo, prosím?
Povedz to ešte raz.
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Presne tak.
Takže môžete vidieť, že iba výber uložené v korešpondencii triediť mať thetas.
A to preto, že máte len theta ak obidva Big O a Omega sú rovnaké.
OK.
A konečne, zlúčiť druhu je v log n
>> A potom, ako Dan hovoril, Merge sort je niečo ako rovnakým spôsobom, že
tie binárne vyhľadávanie.
Tak sa dostanete na zoznam.
A vy sa chystáte znížiť na polovicu.
A potom sa im znížiť v menších polovice.
A potom je zlúčiť.
Vy ste si uvedomiť, že, že jo?
OK, ako hovoril.
>> OK, ukazovatele.
Takže to, čo je ukazovateľ?
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: adresa.
OK.
Viem, že David ukazuje veľa videá Binky a vecí ukazujúce
navzájom.
Ale som rád, že z ukazovateľov ako len adresa.
Takže je to premenná, ktorá sa deje pre uloženie adresy.
>> Takže je to práve táto špeciálna premenná , Že je štyri bajtov.
Pamätajte si, že ukazovateľ na niečo je vždy štyri bajty dlhé pre našu 32-bit
Stroj tak v prípade zariadenie.
A to len má miesto o premenné vnútri nej.
>> OK, tak tam je to spomienka, v podstate.
Takže každý blok pamäti, v skutočnosti má štítok, ktorý je adresa
Slott pamäti.
Takže to znamená, že môžem mať ukazovateľ ukazujúce na
niektoré z týchto adries.
Takže dôvod, prečo budeme používať ukazovatele je keď som si pamätať umiestnenie
že konkrétna premenná je pamäť.
>> A vy si uvedomiť, že jeden z tých, prípadov bolo, či mám funkciu
či som naozaj chcem, aby ste výmena za reálnych čísel, som vlastne
musieť poslať ukazovateľ.
Nie premenná.
Myslíte si, chlapci si uvedomiť, že?
Rozdiel medzi -
ako sa volá?
Volanie hodnotou a volaním s odkazom, že jo?
>> OK, jo.
Tak zavolaj hodnotou.
Keď stačí poslať premennú funkciu, ktorú práve vysiela hodnotu.
Takže ste vlastne odosielanie kópie premenné.
A váš program nemohol starať menej o v prípade, že v skutočnosti rovnakej premennej
vytvorí kópiu.
>> A volanie odkazom znamená, že Ja som vlastne zaslaním kópie
ukazovateľ k tejto premennej.
Takže to znamená, že ja posielam Umiestnenie tejto premennej.
Takže mám pocit, umiestnenie variabilný, keď volám funkciu
s ukazovateľmi, som schopný skutočne zmeniť dáta, ktorá bola v hlavnej.
Zmysel?
>> Aj keď je ukazovateľ kopírovania, ukazovateľ má stále reálnu adresu
Premenná, že chcem zmeniť.
Zmysel?
>> Takže vytváranie ukazovateľov.
Pamätajte si, že ukazovateľ vždy typ, ktorý to ukazuje
, A potom hviezda.
A potom si dať meno.
Takže pamätajte, že vždy, keď máte čo hviezda, je to ako ukazovateľ na
že bez ohľadu na variabilné typ, ktorý ste mali.
>> Tak tu sa hviezdy, napríklad, že je to ukazovateľ a číslo.
A potom char hviezda je ukazovateľ char hviezda a tak ďalej.
Jo?
>> DIVÁKOV: Čo keď máme ukazovateľ na n Star x.
Viem, že vytvorí ukazovateľ na x.
Znamená to tiež vyhlásiť x celé číslo?
>> LUCAS: OK, takže keď hovoríte, že n hviezda x, nie ste vytvoriť ukazovateľ na
premennej x.
Tie vytvoria ukazovateľ s názvom x.
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Takže keď poviem, n hviezdu x, som hovorí, hej, v pamäti, budem
si jeden z týchto troch polí.
A ja poviem, že bude x, čo je
bude ukazovateľ.
A niečo zaujímavé o ukazovateli je to, že hovoríme, že majú
4 bajty pre 32-bitové stroje.
A dôvodom je to preto, 4 byty sú 32-bitov.
>> A stroje, ktoré sú 64 bitov skutočne majú ukazovatele adresy
ktoré sú dlhé 64 bitov.
Tak to jednoducho znamená, že veľkosť adresy v zariadení sa líšia.
>> Takže Odkazovanie a Nepriamy odkaz.
Existujú dva subjekty, ktoré vy by si mal uvedomiť.
Prvý z nich je ampersand.
Druhým je hviezda.
Nenechajte sa zmiasť tým, že hviezdy a to hviezda, pretože si uvedomiť, že v
V tomto prípade, máte n hviezdu.
>> Je to ako celú vec dohromady.
Neexistuje n vesmírnych hviezdu.
Takže to znamená, že je to typ.
Pamätajte si, že keď máte premenná hviezda, ty si
hovorí o type.
>> Ak ste práve hrať a potom názov premennej, to znamená, že
ste dereferencing ukazovateľ, ktorý Znamená to, že sa pozeráte na
ukazovateľ, nájsť adresu, že je to ukázal na, bude na túto adresu,
a pri pohľade na vždy Máte tam.
Tak hovorím svojim študentom, že keď máte hviezda, mal by si myslieť, že je to
skratka obsahu.
>> Takže ak máte ukazovateľ a to hviezda ukazovateľ, je to
obsah ukazovatele.
Takže idete, čo to ukazuje na a pozrite sa na konštantný obsah.
A ampersand je rovnaký vec ako adresu.
>> Takže ak mám premenné A - ako, poďme povedať, že som urobil int sa rovná 3 -
keď chcem nájsť adresu, ktorá variabilná pamäť, môžem len to,
ampersand.
Takže je to adresa.
Zmysel?
>> Takže tu je príklad.
Tento chýba int b a c int.
Takže int sa rovná 3 znamená, že Chystám sa ísť do pamäte.
A ja idem nájsť slot a dať číslo 3 tu.
>> A potom int b sa rovná 4.
Chystám sa urobiť to isté.
Prejsť na pamäti a dať číslo 4 v jednom z polí.
A int sa rovná 5.
Nájsť ďalšie krabicu a dať číslo 5.
>> Takže to, čo sa tento riadok robíte? n hviezda pa rovná ampersand A.
Takže v prvom rade, n hviezda pa.
Čo sa to robí?
>> DIVÁKOV: [nepočuteľné].
>> LUCAS: Jo, tak n hviezda pa, prvý, deklaruje ukazovateľ s názvom pa.
A potom je to priradením hodnoty že ukazovateľ je adresa.
Takže ampersand.
Potom, keď to urobím hviezdu PB, čo je hviezda pb?
>> Oh, ospravedlňujem sa.
To je tiež chýba. n hviezda pb.
Myslím hviezda pc.
Je mi to tak ľúto.
Je to to isté.
Ale teraz som v pohode ar vytvorenie ukazovateľ k b a potom ukazovateľ na c
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> LUCAS: Áno.
Takže ak idete do pamäte a idete do pole, ktoré je označenie pre pa,
ste vlastne bude zobraziť adresu.
OK?
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> LUCAS: Jo, ukazovateľ je adresa.
Nikdy na to nezabudnem.
Je to ako najdôležitejší časť o ukazovatele.
Tam je skladovanie a adresa do určitej premennej.
Ešte niečo?
Nejaké ďalšie otázky?
OK.
>> Tak ukazovatele a polia.
Pamätajte si, že keď som si int pole 3, v podstate to, čo robím, je, že som, druh
z, vyhlásil v ukazovateľ.
Takže rada je niečo ako ukazovateľ na špecifické miesto v pamäti, v ktorej som
pridelené tri sloty pre celé čísla.
Má to zmysel?
>> Takže keď som sa v pravý rad 3, čo som tým, v podstate, vytvára tri
sloty na pamäti.
Tak som si tri sloty v pamäti.
Takže keď to urobím, potom hviezda poľa, je v podstate znamená, že obsah poľa,
čo znamená, že som vymazať ukazovateľ, idem na tomto mieste, že to ukazuje na,
a dal som číslo jedna.
>> A potom, keď to urobím hviezdu poľa plus 1, to je to isté ako robiť rad
držiaky jedna, ktorá jednoducho znamená, že ísť do miesto, ktoré je to ukázal na.
A potom naviac 1 značky me posunúť o jednu pozíciu.
Tak ja idem na tejto pozícii, v skutočnosti, a dal číslo dva.
>> A potom, konečne, keď som si poľa a 2, idem tam, kde
polohovacie Array je na.
A potom som sa presunúť do blokov pamäte.
A potom som dal číslo tri tu.
Jo?
>> DIVÁKOV: Tak hviezda poľa je jednoducho hovorí úplne prvý bod.
A môžete pridať jeden, len preto, že sme len naozaj
odkazovanie, že prvý adresu.
>> LUCAS: Jo.
Prečo, napríklad, povedzme polia 0, 1 pole, a pole 2?
Ja hovorím, prečo to robíš 0, 1, 2, 3 miesto 1, 2, 3,?
Jedným z dôvodov je, jeden, počítač programátori radšej začať
počítanie od 0..
Dva preto, že keď robíte pole 0, je to to isté ako robiť rad
a 0, čo znamená, že idem do že pozície, a ja nie
preskočiť všetky pamäťové bloky.
Tak som sa nepohybujú všetky pamäťové bloky.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> LUCAS: Tak ona sa pýta, čo je rozdiel medzi tým
to alebo robiť malloc.
Jeden z rozdielov je to, že int array 3 je vytvorenie
pole na stacku.
A keď som to malloc, je vytvára na halde.
Má to zmysel?
>> Tak ako to malloc vlastne funguje?
Tak prečo ešte musieť použiť malloc?
Váš kompilátor druh postáv sa na všetky premenné, ktoré deklarované.
A to vytvára priestor pre všetky z nich v zásobníku.
Takže všetky vaše premenné sa deje byť niekde v stohu.
Takže tu je premenné prostredia.
>> Takže v podstate, priestor pre premenné, v pamäti je pridelené na
kompiláciu.
Takže to znamená, že váš počítač má poznať všetky tieto premenné
dopredu.
Nemusí vedieť, akú hodnotu sa chystáte dať do nich.
Ale je potrebné vedieť, ako koľko pamäte budete potrebovať.
>> Ale teraz povedzme, že, napríklad, budete vytvárať pole alebo pri
reťazec, ktorý užívate od užívateľa.
Nevieš, ako dlho reťazec bude, napríklad.
Takže nemusíte presne vedieť, koľko pamäťových blokov prideliť, že jo?
>> Takže to nie je naozaj zmysel pre vám povedať, dať 100 znakov.
A potom to, čo v prípade, že používateľ píše 150?
Tie bude v háji.
>> Takže v podstate, nemôžete byť istí, ako koľko pamäte budete musieť prideliť
pri kompilácii programu.
A tak jednoducho viete, že v dobe behu.
Takže to je dôvod, prečo máte hromadu.
Takže haldy bude mať pamäť že ste rozdelenie počas
Doba trvania behu programu.
>> Takže v podstate, keď to malloc, čo robíte na je prideľovanie pamäte
runtime, čo znamená, že ste rozhodovanie priamo v tú chvíľu, že ste
by mal mať túto pamäť.
Tak to je, keď ste ju prideľovanie.
Má to zmysel?
>> Takže pamätajte, že zásobník má premenné , Ktoré sú vytvorené v čase kompilácie.
A potom haldy má premenné ktoré sú vytvorené as you go
s malloc, napríklad.
>> DIVÁKOV: [nepočuteľné]?
>> LUCAS: Tak GetString je bude volať malloc.
Dovoľte mi, aby som hovoriť o malloc, a Vysvetlím ti to GetString.
Takže malloc je to isté ako alokácia pamäte.
Takže to bude prideľovať pamäť na halde.
A to bude vracať ukazovateľ na kde bol, že pridelené pamäti v.
>> Takže keď si to -
tu napríklad -
n hviezda ukazovateľ.
A potom sa ukazovateľ rovná malloc Veľkosť palca krát 10.
Ja som vytvoriť ukazovateľ.
A potom som priraďovanie, že ukazovateľ hodnota ukazovateľa, ktorý malloc
Je mi dal.
>> Takže sa pýtam malloc môžete prideliť priestor pre 10 čísel.
To je to, čo hovorí.
A malloc mi dáva späť ukazovateľ na toto miesto.
Zmysel?
OK.
Aj A GetString je, v podstate, tým volať malloc, takže si môžete prideliť
pamäti za behu.
>> Vždy nezabudnite skontrolovať na null pretože malloc sa chystá vrátiť null
ak nie je možné alokovať pamäť.
Povedzme, že budete žiadať o smiešny množstvo pamäte.
Váš počítač sa nebude schopný oveľa prideliť, že.
>> Takže malloc práve deje vrátiť null.
Takže nezabudnite vždy skontrolovať, či ukazovateľ, ktorý ste dostali od malloc je
null, alebo nie, pretože ak áno, môžete byť dereferencing ukazovateľ a
spôsobuje nežiadúce chyby.
A konečne, nezabudnite Váš voľnej pamäte.
>> Malloc vytvára pamäte v halde.
A musíte uvoľniť pamäť pred ukončením programu.
OK, to je všetko pre mňa.
Je nám ľúto, Rob.
Vďaka.
>> [APPLAUSE]
>> LUCAS: Nejaké posledné otázky Pred Rob príde?
Nie?
Jo?
>> DIVÁKOV: Nevidel som tento on-line.
Už ste to nahral ešte?
>> LUCAS: Myslím, že Dave je to nahrať čoskoro.
>> DAVE: Bude zverejnené.
>> LUCAS: Bude to on-line.
>> DIVÁKOV: To záleží.
>> LUCAS: Je to deje?
OK.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> LUCAS: Áno, mali by ste uvoľniť všetky pamäti, že sa dal v halde.
>> DIVÁKOV: [nepočuteľné]?
>> LUCAS: Áno.
Každý čas, ktorý máte kultúry malloc, mali by ste mať kultúru zadarmo
potom, čo ste prestali používať túto premennú.
Takže malloc a zadarmo sú vždy spoločne.
Ich najlepší priatelia.
Jo.
Rob?
>> ROB: Pôjdem rýchlo.
A tiež video sa zmieriť.
Mám mikrofón na.
>> OK, tak za týždeň päť vecí.
Prvá vec, ktorú máme, je zásobník.
Takže nezabudnite, že je tu len jeden zásobník Rám na aktívne volanie funkcie.
Uvidíme, že v sekunde.
A tiež si spomenúť, čo sa vlastne deje v každom zásobníku rámci sa bude
miestnej premenné našich funkcií, argumenty, ktoré sú odovzdané do nášho
funkcie, spolu s niekoľkými iné veci nemáte naozaj
je potrebné sa obávať.
>> Tak tu je príklad program, kde, oznámenia, hlavné je printfing návrat
hodnota foo 4.
foo práve chystá k návratu Hodnota riadku 4 čiarka 6.
A bar sa chystá nastaviť niektoré miestne Premenná n sa rovná 4 krát 6.
A potom sa vrátiť n
>> Takže poďme sa pozrieť na zásobníku v priebehu aktuálna iterácia tohto programu.
Takže tam dole našej zásobníka.
Nezabudnite, že zásobník rastie.
A tak v dolnej časti nášho zásobníka, sa majú zásobníka rámec pre hlavné.
Pri spustení programu, hlavné vždy bude na
Spodná časť našej zásobníka.
>> A to, čo je vo vnútri nášho stack frame za hlavnú?
Takže aj keď neexistujú žiadne miestnej premenné na hlavnej, ako som povedal predtým,
máme argc a RGV zaberajú miesto vnútri hlavného zásobníka rámu.
Takže hlavný je teraz chystá volanie funkcie foo.
A to znamená, že foo bude si svoj vlastný rámik zásobníka.
>> Takže teraz vnútri sme funkcie foo.
A to, čo musí ísť do Foo stack frame?
No, foo má argument n
A n je rovné 4, pretože to je to, čo Hlavné je okolo ako argumentu Foo.
>> Takže teraz foo bude volať bar.
Čo je bar bude mať vo vnútri jeho "zásobníka rámu?
Je x sa rovná 4 y, ktorá sa rovná šesť.
To nie je všetko, že budeme mať v zásobníku rámu, pretože bar
má tiež lokálnu premennú n
A n budeme rovná 24.
>> Takže teraz bar sa chystá k návratu n
Takže bar sa vracia 24 až stack frame foo.
A pretože bar je teraz vracia, aby znamená, že sa objavujú na rámček zásobníka
pre bar von zo zásobníka.
Takže všetky pamäti, že bar bol použitie je teraz mimo zásobníka.
>> Teraz foo bude tiež vrátiť 24 až hlavná.
Takže teraz, že foo vracia, pamäť že foo použil vo svojom '
stack frame je tiež preč.
A teraz, hlavné sa chystá zavolať printf.
Takže printf je len ďalšie funkcie.
Keď hovoríme printf, že to bude ďalší zásobník rámec pre printf
volanie funkcie.
>> Čo sme okolo printf?
To je to, čo sa deje ísť na jeho rámca zásobníka.
Prinajmenšom, sme okolo že percento aj spätné lomítko n a
Argument 24.
To by mohlo mať viac to stack frame ak printf sa stane byť použitie niektorých
lokálne premenné.
Nevieme.
>> Ale všetko, čo v printf rokoch stack frame.
Bude to vykonať printf.
Potom printf hotovo.
Je to vráti.
Napokon, hlavná je hotovo.
Hlavné vráti.
A potom náš program je hotovo.
Jo?
>> DIVÁKOV: Ste vidieť [nepočuteľný]
Argumenty [nepočuteľný]
parametre?
>> ROB: Takže tam je malý rozdiel medzi argumenty a parametre.
A naozaj, v bežnej reči, ľudia majú tendenciu len miešať po celú dobu.
Ale parametre sú formálne Názov vecí.
>> Takže argc a argv sú parametre na hlavnej.
Tvrdenia sú to, čo vlastne odovzdať ako tie parametre.
Takže keď hovorím foo o 4, 4 je argument som okolo palcov
A parameter n, vo vnútri foo, trvá na hodnotu 4.
od 4 bol argument.
>> DIVÁKOV: [nepočuteľné]?
>> ROB: n je lokálna premenná bar.
n je stále miestna foo, ale je to parameter foo.
Nie je to lokálna premenná.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: foo len volanie bar a návrate ktorákoľvek bar vráti.
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Jo, len aby videl viac zásobník rámy.
Jo?
>> DIVÁKOV: Prečo bol foo tzv pred printf?
>> ROB: Prečo bol foo volaná pred printf?
Takže som mohol, namiesto toho, urobiť niečo ako int x sa rovná foo z 4
a potom vytlačiť x.
Namiesto toho ale, v kombinácii Aj funkcii volania do printf argumentu.
>> Ale všimnite si, že nemôžeme v skutočnosti vykonávať volanie printf, kým sa
zistiť, čo foo 4 je.
Takže budeme hodnotiť to.
A len raz, že to urobil sa deje sa vrátiť a vyhodnotiť to.
Jo?
>> DIVÁKOV: Vzhľadom k tomu, ako v bare [nepočuteľný]
Hodnota, prečo nemajú [nepočuteľný]?
>> ROB: Tie by mali byť úplne int.
To nebol chytený na viac priechodov.
Tak to by malo byť int bar a int foo pretože oba tieto
sa vracia celé čísla.
Void je len v prípade, že to nebude vrátiť aktuálnej hodnoty.
Jo?
>> DIVÁKOV: Ak by ste mali linku *** návrat, [nepočuteľný]?
>> ROB: čiara *** oplátku?
>> DIVÁKOV: Jo.
Rovnako ako v prípade, že ste printf a [nepočuteľné], by to vytlačiť dvakrát?
>> ROB: Takže vnútri foo?
Keby sme mali printf tu?
>> DIVÁKOV: Jo.
>> ROB: Takže keď sme mali printf právo tu by to tlačiť raz.
Vzhľadom k tomu, voláme foo raz pravdu tu, potom budeme hit printf.
Potom zavoláme bar.
A potom foo vráti.
A to je všetko.
Len niekedy sa stretávame printf raz.
Jo?
>> DIVÁKOV: [nepočuteľné]
printf volá foo, pretože sme prvý volanie printf a potom sme okolo
argumenty.
>> ROB: Takže teoreticky, nie je printf volá foo?
Takže nie.
Len nariadiť, aby c sa chystá vykonať tieto veci je, že predtým, než môžeme
volanie funkcie, všetky argumenty funkciu musí
úplne vyhodnotené.
Takže je to úplne hodnotí?
Áno, je to len reťazec.
Je to len hodnotu.
>> Potom sa úplne hodnotiť to.
Akonáhle je to hotovo, teraz všetci jeho argumenty sú vyhodnotené.
A teraz môžeme urobiť volanie printf.
Jo?
>> DIVÁKOV: Jedna otázka.
Ak máte funkciu void, musí byť Máte spiatočnej bodkočiarku?
>> ROB: Nemusíte návrat bodkočiarku Ak máte funkciu void.
OK.
Takže teraz niektoré haldy veci.
Tak haldy je, ako budeme riešiť s riadením dynamickej pamäte.
A to priamo v rozpore s zásobník, ktorý by sme nazvali automatické
správa pamäte.
>> Takže v zásobníku, nikdy je to naozaj vysporiadať sa s tým, ako lokálne premenné
sú tlačené a vyskočila off všetky Tieto zásobník rámy a všetky tie veci.
Nemusíte sa starať o to.
Je to automatické.
Takže haldy je ručné.
A [nepočuteľný]
je z týchto funkcií malloc a zadarmo.
>> Tak tu je to iný program.
Všetko, čo robíme, je mallocing celé číslo.
Sme ukladanie do hviezdy x.
Samozrejme, že musíme skontrolovať, aby ste zistili, či x je null.
Potom budeme len nastaviť to, čo x ukazuje na 50.
Vytlačiť čo x smeruje k, print x, a potom bez x.
>> Tak, ako je to v skutočnosti bude vyzerať Ak sa pozrieme na našu zásobníka a haldy?
Takže začneme znovu.
Dno zásobníka nášho ako predtým.
Pamätajte si, že ťa haldy priamo oponuje stoh?
Takže budeme mať Vrchol našej haldy tam ***.
>> Takže spodné nášho zásobníka, máme náš stack frame za hlavnú.
Má priestor pre argc, argv, a my Teraz majú lokálne premenné x, ktorá
je int hviezda.
Takže budeme iterovat v rámci tohto programu.
Prvá vec, ktorú máme, je volanie malloc.
>> Takže robíme volania malloc.
Malloc je funkcia.
Bude to mať rámček zásobníka.
Čo sme okolo malloc?
To sa deje ísť dovnútra zo zásobníka rámu.
Máme okolo veľkosti n, čo je 4.
Tak, že je odovzdaný malloc.
>> Čo je malloc robiť?
Je to pre nás chytí nejaký priestor na halde.
Takže sme ísť do haldy.
A ideme chytiť 4 bajty z haldy.
Takže poďme sa len dať, že ľubovoľná adresa.
0x123 Len predstierať, že je riešenie, ktoré je na hromadu.
>> Takže to, čo je vlastne vo vnútri, ktorý oblasť pamäti na adrese Ox123?
Garbage.
Takže sme sa neuloží nič v ňom.
Takže ak vieme, že Môže to byť čokoľvek.
Nemali by ste predpokladať, že je to nula.
To je s najväčšou pravdepodobnosťou nie je nula.
>> Takže teraz malloc vracia.
A čo budeme robiť, keď malloc vráti?
Sme nastaviť, čo sa vráti.
Nastavili sme x sa rovná tomu, čo sa vracia.
Takže to, čo je to vracia?
Je to vracia 0x123, pretože to je adresa bloku pamäti, že sa
jednoducho pridelené v halde.
>> Takže vrátiť 0x123 X je teraz bude nastavený rovná 0x123, ktoré obrazovo,
sme často kresliť ako x majúce skutočný šípka na tomto bloku.
Ale x je práve ukladanie túto adresu.
Takže teraz musíme skontrolovať, či x je null.
To nie je null.
Sme predstierať, že malloc podarilo.
>> Takže teraz hviezda x sa rovná 50.
Takže hviezda pamätá to znamená, prejsť na túto adresu.
Takže 0x123 Ideme do prejsť na túto adresu.
Takže to nás privádza tam.
Čo robíme na tejto adrese?
Sme skladovanie 50.
>> Takže po tomto riadku, že je to, čo veci budú vyzerať.
Takže teraz už to nie je odpadky tam ***.
Teraz vieme, že 50 je v tom, že najmä preto, že adresa
sme ju nastavíte na to.
OK?
Takže teraz budeme tlačiť f.
>> Takže najprv budeme tlačiť hviezdy x.
Takže to, čo je hviezda x?
Opäť platí, že hviezdy x znamená ísť do vec, že x je ukazuje.
Takže x sa ukladanie 0x123 Choď na to.
Dostaneme 50.
Takže vytlačiť f, že.
A to znamená, že to bude tlačiť 50.
A potom, že sa vráti.
>> A potom máme druhý printf.
Sme teraz percent p
Ak ste ho ešte nevideli, to je ako tlačíte ukazovateľ.
Takže máme percent i, percenta f, a všetky z nich už.
Takže percent p, vytlačte ukazovateľ.
>> Takže x je ukazovateľ.
Takže ak budeme tlačiť x sebe, budeme tlačiť to, čo je vlastne vo vnútri
x, ktorý je 0x123 Takže prvý print f sa bude tlačiť 50.
Druhá tlačová f sa deje vytlačiť 0x123 Jo?
>> DIVÁKOV: Myslíte si, používať percent x vytlačiť ukazovateľ?
>> ROB: Takže používaš percent x vytlačiť ukazovateľ?
Takže môžete, ale percento x je len, Všeobecne platí, že pre podobne, ak máte nejaké
číslo a chcete tlačiť to ako hexadecimálne.
To je len, ako to urobiť.
>> Vzhľadom k tomu, percent d by vytlačiť ako desatinné číslo.
To boli dostaneme percent d i je len číslo.
percent p je špecificky na ukazovateli.
>> Takže x je ukazovateľ.
Chceme využiť percent p
Ale percento x mohlo fungovať.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Jo.
Aspoň pre túto výzvu - a tak som nezahŕňal ho sem.
Ale tieto dva argumenty sú nevyhnutne vnútri tohto rámca zásobníka
spolu so všetkými lokálnymi premennými printf sa stane, že bude používať.
A potom ďalšie volanie printf teraz vnútri printf zásobníka rámu
percent p spätné lomítko n a to bez ohľadu na Hodnota x je, čo je 0x123.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Je to niečo vytlačiť že vyzerá takto.
>> DIVÁKOV: [nepočuteľné].
>> ROB: Tak to vytlačí ho do adresného forme.
Vyzerá to, že adresu.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Prečo je to, čo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Prečo je tento ukazovateľ 4 byty?
Takže existuje celá partia z 0 rokov pred to.
Takže je to naozaj 0x0000000123.
Na 64-bitovom systéme, tam by Celá partia viac núl.
Jo?
>> DIVÁKOV: [nepočuteľné].
>> ROB: Takže prvý printf sa bude tlačiť -
>> DIVÁKOV: [nepočuteľné].
>> ROB: Áno, je to chystá k tlači čo x sa ukazuje.
Hviezda hovorí, že to, čo je to to ukazuje.
Chytiť ju.
Takže čo je to ukázal na?
50.
Chytiť ju.
To je to, čo budeme tlačiť.
Vzhľadom k tomu, budúci, sme iba tlač x sebe.
Čo je vnútri f?
0x123.
OK.
>> A potom, konečne, máme zadarmo.
Čo sme okolo oslobodiť?
Sme odovzdávanie x.
V tej dobe som vlastne zobrazené je v zásobníku ráme.
>> Takže sme okolo hodnoty 0x123 oslobodiť.
Takže teraz zadarmo vie, všetko v poriadku, Musím ísť do haldy
a voľné, že pamäť.
Je to už pomocou čo je na adrese 0x123.
>> Takže bez sa chystá na vydanie že z haldy.
Teraz je naša haldy je opäť prázdna.
Nemáme žiadne pamäťové úniky.
Teraz zadarmo vráti.
Všimnite si, že x je stále 0x123.
Ale to už nie je platný pamäti.
Mali by sme už dereferencia x.
Jo?
>> DIVÁKOV: Je return 0 redundantné?
>> ROB: Je returen 0 redundantné?
Áno.
Práve sme sa dať, že tam, pretože máme spiatočnej jeden pre vzduch.
Takže je to ako, jo, umožňuje patrí návrat 0..
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Tak po voľnom x, čo sa stane v prípade, snažíme dereferencia ukazovateľ?
Je možné, že nič nie je v poriadku.
Je možné, že budeme ešte dostať 50.
>> Je to možné, tiež, že pamäť je v súčasnej dobe používa pre niečo iné.
Takže je to nedefinované správanie.
A nedefinovaný niečo znamená sa môže stať.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: No, takže ak priradíte x na niečo iné.
Takže ak tu sme si povedali x sa rovná malloc niečo iné -
veľkosť malloc akcie -
potom, že pôvodný blok pamäti nie je uvoľnené.
A my sme oficiálne stratil.
To je pretečeniu pamäte.
Stratili sme všetky odkazy do tohto bloku pamäte.
Takže neexistuje žiadny spôsob, ako môžeme niekedy oslobodiť ju.
OK, tak potom sa vráti 0 znamená urobiť.
>> Dobre, tak pretečeniu zásobníka.
Čo je to myšlienka tu?
Takže pamätajte, haldy sa deje dole.
Stack sa ísť ***.
Tak toto bol príklad z prednášky, Myslím si, kde hlavné je len tak
volanie tejto funkcie foo, ktorý sa chystá volať seba rekurzívne *** a
znova.
>> Takže zväzku plechov rámy budú pracovať presne rovnaké.
Takže budeme začať s hlavnou as dolným zásobníka rámu.
Potom hlavný bude volať foo, ktorý bude mať rámček zásobníka.
>> Potom foo bude volať foo znova, čo bude mať
ďalšie stack frame.
A potom znova, a znova, a znova, a znova, až kým nakoniec sme sa spustiť
do haldy.
Tak to je, ako sa dostať pretečenie zásobníka.
A v tomto bode, ste seg chybu.
Alebo by ste naozaj SEG chybu pred tento bod, ale jo.
>> DIVÁKOV: Je core dump rovnako ako poruchy seg?
>> ROB: Takže uvidíte segmentáciu chyba jadra dumpingové.
Získate core dump, keď ste seg chybu.
A je to ako skládky všetkých Obsah aktuálneho pamäti tak,
ktoré si môžete vyskúšať a identifikovať Prečo ste seg porušenej.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Takže chyba segmentácia znamená, tam je pretečeniu zásobníka.
Takže nemusí byť.
Porucha segmentácia znamená, že ste dojemné pamäti takým spôsobom,
by ste nemali byť.
Takže jeden spôsob, že sa tak stane je, keď môžete pretečeniu zásobníka, začneme dotýkať
pamäti takým spôsobom, že by sme nemali byť.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Takže vnútri nekonečnej slučke.
Ako, to je ako rekurzívne nekonečna slučka, a tak sme si ďalšie
stack frame zakaždým.
Ale len v pravidelnom nekonečné zatiaľ čo jeden -
dobre, poďme ani tlačiť f -
niečo urobiť.
Čokoľvek.
>> Nebudeme sa dostať ďalšie stack frame.
Sme len tak, aby sa smyčkování *** touto jedinou inštrukcií.
Zásobník sa nezvyšuje.
Je to skutočnosť, že každá rekurzívne Volanie nám dáva rámček zásobníka.
To je dôvod, prečo sme sa pretečeniu zásobníka.
Jo?
>> DIVÁKOV: Takže ak ste povedal, aby sa while a potom [nepočuteľný]?
>> ROB: Takže ak vnútri cyklu while bolo printf, stále by
nie seg poruchu.
Len som nechcel, aby to nebolo tak jednoduché.
To by sa slučka.
Vy by ste si jeden zásobník rám pre printf.
>> Potom printf sa vráti.
Potom by ste znova slučku.
Vy by ste si jeden zásobník rám pre printf.
To by sa vrátiť.
Single stack frame.
Takže si nie ste dostať to nekonečný hromadia zásobník rámy.
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Áno.
Takže toto pretečeniu zásobníka sa stane pretože žiadny z nich
volanie foo sa vracia.
Takže keď sa vrátime, potom by sme začnú strácať zásobníka rámy.
A potom by sme pretečeniu zásobníka.
A to je dôvod, prečo potrebujete základné prípad pre svoje osobné funkcií.
Jo?
>> DIVÁKOV: Je možné veľkosti a zásobník na hromadu rovnaké pre
všetky programy?
>> ROB: Zhruba.
Je možné veľkosť zásobníka a haldy rovnaký pre všetky programy?
Zhruba.
K dispozícii je niekoľko randomizácie do kde začína zásobníka a
kde začína haldy.
Ak sa vám stalo, že máte veľa globálne premenné a veci, možno budete
odniesť z nejakého priestoru pre haldu.
>> Na 64-bitovom systéme, môžete prakticky má nekonečnú pamäť.
Je tu len toľko.
Medzi 32 bitov a 64 bitov, ktoré je významný rozdiel.
>> Budeš sa dostať oveľa viac stack a heap priestor na 64-bit
systém, pretože tam je len viac adresy, ktoré sa môžu použiť.
Ale na individuálnom systéme, bude približne rovnaké množstvo zásobníka
a haldy priestor.
Dobrá.
>> Takže posledná vec, ktorú je kompilácia.
Takže by ste mali poznať tento proces.
K dispozícii sú štyri veľké kroky.
Takže prvý, kto by mal byť ľahko zapamätateľné.
Pre-spracovanie.
To má predponu dopredu v ňom.
Tak to je pred všetkým ostatným.
>> Vec na zapamätanie je hash.
Takže hash definuje a hash obsahuje vo všetkých z nich.
Tí, ktorí sú pre-procesor smernice.
To sú veci, ktoré pre-procesor sa stará.
>> Takže to, čo sa pre-procesor robiť?
Je to naozaj hlúpa vec.
Všetko, čo je schopný ich všetky z nich kopírovanie a strih, a vložiť operácie.
>> Takže hash obsahuje štandardné i0 dot h
Čo je to, že robí?
Je to chytí štandardné i0 dot h súboru a vložiť ho do hornej
všade tam, kde sa hovorí, že hash obsahuje štandardné i0 bodka h
>> A každý hash určiť, že máme vidieť, čo je to robíš?
Jeho kopírovanie hodnotu hash definovaná je definovaný ako a vkladanie, ktoré
všade tam, kde používate hodnoty.
Takže preprocesor práve robí naozaj jednoduchý textový operácie.
To nemá nič inteligentný.
Takže všetko, čo je viac komplikované.
>> Takže teraz, že preprocesor je urobil, sme vlastne zostaviť.
Takže čo Kompilácia znamená?
Teraz bude z kódu C do assembleri.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Jo, sme chytili, že.
Takže kompilácie.
Ideme od c do zostavy.
Tak toto je skutočná zmena jazyka.
Kompilácia znamená prechod z jazyk na vyššiu úroveň
jazyk nižšej úrovne.
>> A c je jazyk vysokej úrovne v porovnaní s montážou.
Čo je montáž?
Jeho pokyny, ktoré sú, pekný moc, robil pre váš procesor.
Ale počítač stále robí nechápem montáž.
To chápe len jednotky a nuly.
Takže ďalším krokom je montáž, ktorá prináša nám z týchto usmernení, ktoré
váš procesor rozumie a v skutočnosti prekladá je, aby
tie jednotky a nuly.
>> Takže C montážou na binárne.
Ale ja nemám ešte spustiteľný súbor.
Takže myslíte, že knižnice CS50.
My sme pre vás pripravili binárne pre tento CS50 knižnica, ktorá má GetString
a vezmi_int a všetko, čo.
>> Ale knižnica CS50 -
samo o sebe - nie je spustiteľný.
To nemá hlavnú funkciu.
Je to len banda binárne ktoré môžete použiť.
Takže prepojenie je, ako sme sa dať dohromady všetky týchto rôznych binárnych súborov
do skutočnej spustiteľného súbore.
Jeden, ktorý môžete zadať bodka lomítko bodku von.
>> Takže to je ako súbor, ktorý ste napísal - nech je váš program -
Ceaser bodka c
Ale teraz to boli zostavené dole na binárne.
Takže Ceaser bodka o
A to je naša CS50 knižnice binárne.
A oni sú kombinované do jedného spustiteľného súboru.
Jo?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Takže prvá patrí, nezabudnite, hash sú v skutočnosti
krok pre-procesor.
Ale to je oddelené.
Ak nepoužívate žiadne funkcie, ktoré sú mimo vašu jedného súboru a potom,
Nie, nemusíte prepojiť nič pretože máte všetko.
>> To znamená, že printf je spojený palcov
Ak ste niekedy použiť printf, to je niečo, , Ktoré musia byť spojené v
pretože si nepísal, že.
A, v skutočnosti, printf je automaticky spojené palcov
Viete, ako na príkazovom riadku alebo v prípade zadáte urobiť, vidíte, že majú
pomlčka l CS50, ktorý má odkaz v knižnici CS50?
Printf, a tak podobne, že sa deje , Ktoré majú byť spojené automaticky.
Akékoľvek ďalšie otázky na čokoľvek?
>> DIVÁKOV: [nepočuteľné]?
>> ROB: Prepojenie?
Máme veľa rôzne binárne súbory.
Toto je kánonický príklad že používame je CS50 knižnica.
Zostavili sme a vzhľadom k vám na binárne pre tento CS50 knižnice.
>> Ak chcete použiť GetString vo svojom programe.
Takže idete a používať GetString.
Ale bez môjho binárneho kódu pre GetString, pri kompilácii kódu
dole, nemôžete vlastne spustiť svoj Program pretože GetString String je
ešte nie celkom definované.
>> Je to len vtedy, keď odkazujú na mojom binárne ktorý obsahuje GetString, že teraz, všetci
Dobre, môžem vlastne vykonať GetString.
Môj súbor je kompletný.
A môžem spustiť to.
Jo?
>> DIVÁKOV: Má prepojenie previesť binárne na spustiteľný?
Takže aj v prípade, že nemáte iné knižnice, nebolo by to byť ešte
potrebné prekladať [Nepočuteľný]?
>> ROB: Tak spustiteľný je stále v binárnom.
Je to len kombinujúci celok banda binárnych súborov.
>> DIVÁKOV: Ďakujem moc.
>> ROB: Žiadny problém.
Nejaké ďalšie otázky?
V opačnom prípade budeme všetko nastavené.
Dobrá.
Vďaka.
>> [APPLAUSE]
>> DIVÁKOV: Ďakujem.
>> ROB: Jo.