>> SPEAKER 1: Ahoj všetci.
Chystáme sa začať.
Myslím si, že ľudia sú stále pokračuje byť filtrovanie.
Ale v záujme času, takže môžeme dostať Vy odtiaľto včas,
ideme na štart.
Takže vitajte na CS50 Kvíz 0 hodnotení.
Pre tých z vás, ktorí si neuvedomil Ešte máte otázku týkajúcu sa stredu.
Woo-hoo.
>> Ak ste nezačali študovať alebo si neuvedomil, že to ešte existuje,
minulé kvízy a všetky informácie o Váš kvíz je na cs50.net/quizzes.
Je tu nejaký celkom dobrá vec tam, Posledných kvízy z posledných 10
rokov, rovnako ako informácie o tento kvíz a témy
ktoré sa bude vzťahovať.
Takže začnime.
>> Takže vy si možno spomenú, prvý deň triedneho David mal tie svetlá.
Takže v podstate všetko, čo ide na pod kapotou počítača je
vykonáva v binárnej.
Binárne znamená, že to, čo znie ako, 0 je a jeden je.
To má dve hodnoty, ktoré môže byť reprezentovaný.
>> Tak ako v prvý deň oddielu keď Dávid sa obrátil na svetlo
žiarovka reprezentovať na, alebo 1, náš počítač chápe ako binárne 0 a je
1 je, zapnúť alebo vypnúť.
Základy binárne.
Každé miesto je zastúpená v základni dva.
Takže si pridať 2 do 0 do 1 až 2 úplne hore.
>> Ak chcete vypočítať, aké sú vaše binárne je decimal, stačí nasledovať túto rovnicu
Typ vec.
Ak máte jeden v niektorom z týchto miest, to vynásobiť čokoľvek
založiť, že je to in, pridajte ju, a dostanete desatinné miesto.
Takže to je to, ako môžete spoľahnúť do 5 v binárnej.
Rovnako ako to, čo sme robili na Posledná snímka, to je to, ako by ste
predstavujú 1 až 5.
>> Podobne, rovnako ako môžete pridávať a odčítanie v desiatkovej sústave alebo založiť 10, alebo
naozaj žiadny základ, na môžete pridať a odčítanie v binárnej.
Presne to, čo by ste čakali, keď ste pridajte dve až, keď sa rovná väčšia
ako 1, nesiete 1, aby bolo 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 kapotou nášho počítača
sa vykonáva v 0 je a 1 je, alebo binárny.
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čiarknutia, pomlčky a
niečo také.
A to, že mapuje na hodnotu ASCII.
ASCII hodnota je len číslo, ktoré možno chápať počítačom.
A rovnako ako vy môžete robiť sčítanie a odčítanie s číslami, môžete to urobiť
je s hodnotami ASCII.
>> Takže v tomto príklade, čo bude tlačiť?
Jo, tak len priestor C space space B 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ť ako
charakter a vytlačí A.
>> Podobne môžete deklarovať to ako char.
A keď si ju vytlačiť pomocou percent C, bude to interpretovať ako
percent D. A rovnako ako si 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 ako môžeme previesť Reťazec 5 do celé číslo 5?
Nejaké nápady?
Jo.
>> Takže ak máme 5 ako reťazec, môžeme odpočítať 0.
A to budeme mať päť.
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äť k prednáške v ktorom sme sa rozprávali o algoritmoch.
Tak ako to vlastne chceme počítač robiť zaujímavé veci?
Vieš, len sčítanie a odčítanie čísla a tlač veci nie je
to vzrušujúce.
Obvykle chceme naše počítače k vykonať nejaký algoritmus.
Niečo trochu zložitejšie než len prosté aritmetiky.
>> Algoritmus je len krok za krokom sady pokynov pre spôsob vykonania
určitý task--
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 môžete počítať ľudí v miestnosti
kde všetci stoja, vy, že vaše číslo na inú osobu, dodať, že
číslo nahor, a jedna osoba sa posadí.
A to zopakovať.
To je jeden druh algoritmu.
Môžeme analyzovať, ako účinne An algoritmus je založený na to spustenie.
Ale budeme hovoriť trochu viac o tom neskôr.
>> Takže všetky algoritmy možno tiež byť zapísaný v pseudokódu.
Pseudokód je len angličtina ako syntaxe 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é.
>> Kúpte si používatelia hádať.
V prípade, že odhad je správny, povedzte im, sú správne, inak povedz im
že to nie je správne.
A pseudokód 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č
Možno pochopenie.
Takže by sme mohli napísať naše pseudokód a interpretovať, že do zdrojového kódu.
>> Zatiaľ zdrojový kód musí dodržiavať do určitej syntax
programovací jazyk.
A tak ďaleko, v CS50, máme Používam väčšinou c.
Takže to môže byť zdrojový kód pre C.
Neskôr v priebehu, budete v noci prišiel do styku s inou programovania
jazyky ako PHP.
Alebo ak dokonca vziať iných tried, tí mohli robiť Java, Python, alebo dokonca OCML.
Ale v našom c programovací jazyk, je to ako by sme mohli písať zdrojový kód pre
pseudokód algoritmu, ktorý Len som opísal skôr.
>> Tak ako sa váš počítač skutočne Rozumieš tomu?
Ako som už hovoril, je to naozaj len chápe núl a jednotiek.
Tak ako to dostať zo zdroja Kód na niečo, čo môže byť
Rozumel ste?
No, máme niečo volal kompilátor.
>> Ak si spomeniete, späť väčšinu svojho psets, mal si nejaký druh programu
napísaný v dot c súbore.
A potom by ste zadať značku.
Takže to, čo je, aby robil?
>> Môžete zadať make kompilovať Program preto someone--
kto napísal svoje p sadu; Pravdepodobne David--
vytvoril make súbor.
A to hovorí, aby vedieť, na spustenie kompilátor, volal rinčať, že bude
potom kompilovať zdrojový kód k objektu kód, ktorý je núl a jednotiek
že váš počítač rozumie.
Ale trochu neskôr, pôjdeme viac do hĺbky asi prekladačov.
>> Tak spomínam pset 0, tam-- áno, máte nejakú otázku?
>> Divákov: [nepočuteľné]?
>> SPEAKER 1: Áno.
Myslím, že v skutočnosti by mala byť on-line.
Jo.
>> Divákov: Je to ako [nepočuteľné]?
>> Reproduktor 1: 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ť v sekcii snímok.
>> SPEAKER 1: Jo, takže ak ste chcel vytiahnite ju hore 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á.
Oh, áno?
>> Divákov: [nepočuteľné]?
>> Reproduktor 1: No, š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 ste mať všetky realizované niečo, pomocou scratch.
A my sme sa naučili niektoré základné programovania 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 je pravdivé alebo nepravdivé, zapnúť alebo vypnúť, a áno alebo nie.
Príkladom jednoduché, veľmi jednoduché, program, ktorý používa Boolean
Výraz sa tu.
>> Tak, aby pre boolovských výrazov na 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 tu máme a alebo nie je rovné menej než alebo sa rovná, alebo väčšia ako
rovná, a menej ako 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 ste si možno spomenú na zelenej lúke a od p určuje, že my
mal podmienok.
Sú to v podstate ako vidličkami, 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 a inde podmienok.
>> Tu je príklad toho, ako môžete použiť.
Vie niekto, aký je rozdiel medzi len pomocou if všetkých
Cesta dole verše if, else, vtedy a ešte v kombinácii?
Áno?
>> Divákov: [nepočuteľné].
>> SPEAKER 1: Presne tak.
Takže ak by som mal, pokiaľ celú cestu dole tento spôsobom, aj keď táto podmienka priznania
pravda, to bude ešte pokračovať testovanie ďalšie dva.
Vzhľadom k tomu, s iným-li, else vyhlásenie, v prípade, že jeden vráti hodnotu true,
ostatné nie sú testované.
Akékoľvek otázky o tom?
V pohode.
>> Takže použiť if-else z else vyhlásenie, ak viete, že je to len možné
byť jeden z týchto prípadov.
Takže vieme, že ak je x menšie ako 0, je to rozhodne nebude
väčšie ako 0.
>> Ďalšie, ďalšie stavebné blok že sme sa dozvedeli, sú slučky.
Máme tri typy slučiek.
U slučky, while, a to while.
A všeobecne, ak si sadnete do 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 opakovať
cez niečo alebo koľkokrát Ak chceme vykonať úlohu.
Používame while ak budeme potrebovať nejaké podmienka, aby to bola pravda, aby v prevádzke.
A používame to pri veľmi podobné zatiaľ čo, ale chceme, aby naši spustenie kódu na
aspoň raz.
>> Takže robiť, keď to, čo je v úlohe bude vždy prebiehať najmenej raz.
Vzhľadom k tomu, s chvíľu ju nemusí spustiť vôbec, ak
podmienka nie je splnená.
Akékoľvek otázky s tým?
>> Takže štruktúra slučky for.
Vy ste všetci videli to.
Môžete inicializovať.
Máte nejaký stavu.
Tak, napríklad, môžeme inicializovať ako aj rovná 0.
i je menšia ako 10.
A aj ++.
Veľmi jednoduchá, že sme urobili.
>> Na slučke while, podobne, máte mať nejaký druh inicializácia,
nejaký stavu, a nejaká aktualizácia.
Takže môžeme realizovať naše pre sláčiky tiež ako while pomocou tohto.
A podobne sa robiť, zatiaľ čo slučky, by sme mohli mať nejakú inicializáciu,
vykonať niečo, aktualizujte ju a skontrolujte stav.
>> Takže teraz funguje.
My sme dali všetko dohromady.
Mohli by sme napísať nejaký druh funkcie.
Spoločné funkcie, ktoré vám môžu 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é môžu byť použité, printf-- printf je function--
Vezmi_int, toupper.
Ale to sa stalo, že bol zavedený pre nás
nejaký knižnice.
Ak ste pamätám, vrátane Táto knižnica CS50.h alebo
Štandardné I / O knižnice.
Áno, otázka?
>> Divákov: Je hlavnou len vlastné, c?
Má to tak nejako [nepočuteľné]?
>> SPEAKER 1: Otázkou je, ak hlavné je vlastný cca.
A áno, všetky funkcie majú hlavnú funkciu.
Je to tak trochu nevyhnutné pre počítač vedieť, kde začať
spustenie kódu.
>> Divákov: Takže nie [nepočuteľné]?
>> SPEAKER 1: Nie
Nejaké ďalšie otázky?
V pohode.
Tak ako môžete využiť funkciu ktorá je napísaná pre vás, môžete tiež
napísať vlastnú funkciu.
To je funkcia, ktorá by sa niekto mohol písali pre výpočet objemu
o q, napríklad.
K dispozícii je návratový typ tu, v tomto prípade int, naše meno funkcie q a naše
Zoznam parametrov.
>> A všimnite si, že budete musieť zapisovať 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álny 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 o tom, čo sa deje.
Takže ak ste vyraziť do funkcie, to by mohlo byť čitateľnejší.
A znovu-schopnosti.
Ak máte kus kódu, ktorý je bytia volal alebo spustiť niekoľkokrát,
namiesto prepisovania, ktoré kódujú 10 krát vo svojej hlavnej funkcie, môžete
chcete ho znova použiť.
A potom zakaždým, keď budete potrebovať, aby kus kódu, volanie funkcie.
>> Takže teraz, keď si spomenieme späť do nuly, sme hovorili o niekoľkých pojmy,
z ktorých jeden je rezanie závitov.
Téma je predstava o násobok sekvencie kódu
vykonávajúci súčasne.
Takže myslíte, že späť do prvého dňa, kedy mal David vy počítať z počtu
ľudia v miestnosti.
>> V podstate to, čo sa deje na všetko je z vás boli
beží oddelené vlákna.
A tie nite prichádzali spoločne dostať nejakú odpoveď.
Podobne, v Scratch, keď máte viac škriatkovia, môžete
mačku a psa.
A oni by boli súčasne vedú svoje vlastné skripty.
To je príklad rezanie závitov.
>> A ten druhý koncept, ktorý bol predstavený v začiatku bola akcia.
A udalosti, kedy viac častí kódu spolu vzájomne komunikujú.
V Scratch, to bolo, keď ste použili riadenie a vysielanie Keď som
Príjem bloky.
>> A tiež, v problémových Sada 4, videli sme trochu udalostí rovnako.
Vy ste mohol použiť Knižnica Gevent.
A bol tam funkcie waitForClick , V ktorom ste čakali
pre používateľov ku kliknutie.
A vaše kliknutie, v tomto prípade by bolo akcie a čakať na kliknutie je váš
obslužnú rutinu udalosti.
>> A tiež v priebehu zobrazovania vašich psets a pracuje 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 úpravy na, v podstate, prechádzať váš 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: Áno, jasné.
Ospravedlňujeme sa, ale otázka bola, či vás 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 keď ju použijete
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 použitie doteraz v kurze sú
Štandardné I / O a CS50.
Aké veci sú zahrnuté v štandardnom I / O knižnice?
>> Jo, zatiaľ sme použili printf.
V CS50, sme použili vezmi_int a GetString.
A dátový typ string je zhodou okolností tiež musia byť deklarované v tomto CS50 knižnici.
Porozprávame si o trochu viac do hĺbky o Ako knižnice fungujú a ako sa
komunikovať so zvyškom vášho kódu.
Ale to sú dva hlavné tie, ktoré sme prišli do kontaktu s tak ďaleko
samozrejme.
>> Typy.
Jedná sa o dobré si uvedomiť, ako veľmi každý druh je zastúpený, alebo ako
počtu bytov každá typu requires--
int, 4 bajtov; char, 1 bajt.
Float je 4 bajty.
Čo je to double?
>> Divákov: [nepočuteľné].
>> SPEAKER 1: Jo, takže plavák ale dvojnásobok veľkosti.
Čo je 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 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 dvojnásobok int.
V pohode.
A potom to, čo je posledný typ?
>> DIVÁKOV: Pointer.
>> SPEAKER 1: Jo, tak sme sa dozvedeli, niečo málo o ukazovatele.
A to bez ohľadu na to, čo je ukazovateľ ukazuje na-- by to mohlo byť char hviezda
alebo int star--
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ú To isté v tomto CS50 spotrebiča.
>> Divákov: Prístroj je úplne zameniteľné.
>> SPEAKER 1: Jo.
Tak dlho, dokiaľ je dvakrát 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 mala prevziať 32 bit.
>> Divákov: Bolo by niečo povedať ako predpokladu
Architektúra ako spotrebiče.
Pre 64 bit, jediné veci, ktoré zmena sa túži a ukazovatele.
Obaja [nepočuteľné].
>> SPEAKER 1: Áno?
>> DIVÁKOV: Otázka.
Takže na jednej z praxe kvízov, požiada o unsigned int.
Tak, ako by to byť stanovený z int [nepočuteľné]?
>> SPEAKER 1: unsigned v je tiež 4 bajty.
Ale to, čo je odlišné o podpísané int a unsigned int?
>> Divákov: [nepočuteľné].
>> Reproduktor 1: Správne.
Jeden môže reprezentovať záporné hodnoty.
Ale ako to urobiť?
>> Divákov: [nepočuteľné].
>> SPEAKER 1: Jo, to ušetrí 1 bit reprezentovať značku.
Podpísala má jeden bit, ktorý predstavuje znak.
A unsigned proste všetkých pozitívnych výsledkov.
>> DIVÁKOV: OK.
Takže vravíte, že double je dvakrát väčšia plaváka?
>> SPEAKER 1: Double je dvakrát veľkosť plaváka, áno.
>> Divákov: Ako ukazovateľ na long long [nepočuteľné]?
>> SPEAKER 1: Takže otázka je, ako sa ukazovateľ na dlhú long--
ako je to len štyri bytov, long long jeho 8 bajtov.
Takže pamätajte, čo je ukazovateľ, v podstate, na veľmi základné hodnoty.
>> Divákov: [nepočuteľné].
>> SPEAKER 1: Jo, tak ukazovateľ je len pamäť.
Takže nezáleží na tom, koľko miesta ktorý pointer ukazuje.
Je len potrebné 4 bajty sledovať na tomto pamäťovom mieste.
Nejaké ďalšie otázky?
V pohode.
>> Takže posledná vec, ktorú som je štandardný výstup.
Mali by ste ich používať často natoľko, že si spomeniete.
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.
Percenta f pre plaváku.
Percenta ld dlho dlho a percent s pre reťazec.
>> Rovnako tak som použil niekoľko z týchto sekvencií escape.
Napríklad spätné lomítko n pre 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 percento d pre?
Percento d je pre ints.
Percent d a percento aj sú rovnaké.
>> Divákov: Aký je rozdiel medzi spätné lomítko n a spätné lomítko r?
>> SPEAKER 1: Takže otázka je, čo je Rozdiel medzi vôľou n a
odpor r?
Myslím si, že spätné lomítko r je--
>> Divákov: Tak spätné lomítko r jednoducho znamená, vracia na začiatok riadku
bez skutočne ísť na nový riadok.
Takže ak tlačíte spätné lomítko r a návrat na začiatok riadku
potom tlačíte viac vecí, môžete prepísať veci, ktoré je už na
[Nepočuteľné].
Vzhľadom k tomu, n v skutočnosti ide do nového linka a ide do [nepočuteľné].
>> SPEAKER 1: No, nejaké ďalšie otázky?
V poriadku.
Chystám sa odovzdať ho Dan, ktorý bude pokračovať.
>> [APPLAUSE]
>> DAN: V poriadku.
Takže budem hovoriť o ďalšej veľmi široký Rad myšlienok z triedy, ktoré sú
zhruba zástupca dvoch týždňov a štart troch týždňov rozjazde
s odlievaním, ktoré je len spôsob, ako liečenie hodnotu určitého typu ako
hodnotu iného typu.
Takže to môžeme robiť s znakov do ints, pláva ints a
dlhé túži zdvojnásobiť.
>> 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ý prichádza, keď ste hádzať
veci, ako je plavák ints.
Tak toto je trochu divný.
Máme plaváka, ktorý je 1.31.
Vynásobíme ju 10000.
A potom sme ju vytlačiť ako int.
Čo robí tento výstup?
10000 krát 1.31.
Takže 13000, je to, že to uhádol?
>> Divákov: Myslím, že je to 10000.
>> DAN: Tak som sa vynásobí 10000 predtým, než som ho casting.
>> DIVÁKOV: Oh.
Nebolo by tam byť jedna 9 a niektoré 0 počet?
>> DAN: Môžete mať nejaké podivné znaky.
Tak jo, to je 1,3 krát 10.000.
Tak to je 13000.
A to navyše weird--
>> Divákov: 13100.
>> DAN: 13100.
Ďakujem, Robe.
A to navyše weirdness--
tento 9,9--
Jednoducho preto, že tento odlievanie skončil zaokrúhlení smerom nadol, kde
to by nemalo mať.
Jo.
>> Divákov: liatie stane po čokoľvek iné?
>> DAN: Takže, pretože som to v tlačenej podobe, ale Znamená to, násobenie pred ním
Znamená to, liatie.
>> Divákov: [nepočuteľné].
>> DAN: Myslím, že by obsadil 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 číslice na určitý počet významných osobností.
Takže keď sme sa vytlačí 8 Sig figy na to float, dostaneme akúsi
škaredý vyzerajúce číslo.
A to preto, že 1,31 nemôžu presne byť zastúpené jednoduché
sily dva v stroji.
Takže to skončí pri najbližšej hádať, ktorá končí
je trochu málo.
Zmysel?
OK.
>> Teraz prešiel sú iný spôsob robí podmienené príkazy, kde všetky
staráme sa len o jednu premennú.
Takže v tomto konkrétnom príklade, 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 od jedného do štyroch.
To je to, čo žiadaš.
>> Takže si urobiť spínač názov premennej.
Potom môžete nastaviť prípadov možné Hodnoty by to mohlo byť.
Takže v prípade, že jeden, hovoria, že je nízka.
A potom zlomiť dostať von stavu spínača, takže
nechcete ísť ďalej.
>> V ďalšom case--
tak tomu dva a prípad tři--
či je to prípad dvoch to len klesne Prvý riadok kódu, ktoré považuje sa
treťom prípade, 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 break-- keď som hodil túto breakaway--
by to vytlačiť nízka, a potom by tlačiť stred, a potom by to zlomiť.
>> Takže prestávky sú dôležitou súčasťou spínače podmienok a
že by tam mala byť.
Všetky prípady, ktoré nie sú výslovne uvedené sú spracované východiskové
prípad v spínači a mali by byť hodené.
>> Publikum: Tak 1, 2, 3, a 4 by n?
>> DAN: Hodnoty, ktoré n môže byť.
Áno.
Jo?
>> Divákov: Takže keď máte že [nepočuteľné]?
>> DAN: by ste vytlačiť nízka, a potom by to vytlačiť strednej a
potom by to zlomiť.
>> Divákov: Prečo by to vytlačiť Stredná Ak [nepočuteľné]?
>> DAN: Takže všetko v prípade, pred prestávka spadá.
Takže prípad jedného tlače pod prípad tým, 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 mať, ž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 si, že by?
Aké ďalšie typy dát môžete prepínať?
>> Divákov: Môžete prepínať pred všetkými dátovými typmi.
Ale to len znamená, že niečo cez znakov a ints a podobné veci, pretože
ak ste prepínanie ukazovatele že nie je naozaj zmysel,
prepínanie zaťaženie, ak je to dokonca nech to to urobíte, pretože s plávajúcou desatinnou čiarkou
presný by ste naozaj chcem to urobiť tak ako tak.
Takže celkom veľa, len ints a znakov a tak podobne.
>> DAN: Jo, to je, keď máte explicitné hodnoty, ktoré viete, myslím, že môže byť
že spínač je vlastne užitočný.
Dobrý?
OK.
>> Rozsah je rozsah, ktorý vyhlásil, variabilný rozširuje.
Takže v tomto malom kuse kódu mám, že by bolo plné chýb.
A dôvod, prečo je vyhlásený som tento int aj v rámci tohto cyklu for.
A potom som sa snažím vyplýva, ž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 párom zložených zátvoriek 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átvorkách, budete
dôjde k chybe z kompilátor.
Jo?
>> Divákov: Tak toto nefunguje?
>> DAN: To nefunguje, áno.
Strings.
String char *.
Sú to presne to isté.
Sú to len ukazovatele na znaky.
A všetky reťazce, ktoré máte by mal skončiť so spätným lomítkom nulové, čo je práve
c konvencie.
>> To je nazývané NULL terminátor.
A NULL--
kapitál N, kapitál U kapitál L, hlavné ja--
nie je to isté ako NULL terminátor.
To je ukazovateľ.
To je znak.
Sú veľmi odlišné.
Pamätaj si to.
To bude na kvíz, pravdepodobne.
Nevidel som kvíz.
Jo?
>> Divákov: Tak NULL je, povedzme, ukazovateľ?
>> DAN: Áno.
>> Divákov: Čo [nepočuteľné]?
>> DAN: Ak je, povedzme, malloc je volaná, keď vás nemajú dostatok pamäti, aby si
bez ohľadu na veľkosť žiadaš, malloc vráti NULL.
Je to v podstate vždy, keď je funkcia mal vrátiť ukazovateľ, môžete
je potrebné skontrolovať pred NULL nasledujúcich dôvodov NULL je celkom good--
to je, tak nejako, hodnota odpadky.
Je to, pokiaľ ide o ukazovatele ísť nula.
>> Kedykoľvek budete volať funkciu, ktorá vracia ukazovateľ.
Budete chcieť skontrolovať, že je Uistite sa, že, že ukazovateľ nie je NULL
pretože NULL je veľmi časté.
Je to akýsi návrat na odpadky.
Takže ak sa niečo sa nedarí, len vrátiť namiesto NULL.
>> Divákov: [nepočuteľné]?
>> DAN: Áno, a to je to.
>> Divákov: [nepočuteľné]?
>> DAN: kúzlo ako to.
To je NULL terminátor.
Je to malé písmená N-U-L-L, ak ste hláskovanie to.
>> Divákov: A ja šiel späť a skúša to.
A ak sa pokúsite dať plávajúcou desatinnou čiarkou hodnota na prepínači, bude to revať na teba
hovorí, vyhlásenie vyžaduje výraz celočíselného 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, L kapitál je skutočný c vec.
To je ukazovateľ NULL a bude byť liečené len ako taký.
Nebudete niekedy skúsiť a kúzlo Znak NULL a neuvidím
iný spôsob, ako toto.
Jo?
>> Divákov: Takže návrat do char max alebo niečo, č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?
>> Hľadisko: Áno.
>> DIVÁKOV: Jo, tak všeobecne termín pre všetky tie veci,
sú overovací hodnoty.
Tak ako návrat int max od vezmi_int a char max z getchar, je to
mal byť rád, v poriadku, ak je tieto veci sa vracajú k nám,
sa niečo pokazilo.
>> U ukazovateľov, len náhodou táto hodnota sentinel, že každý
súhlasí s tým ,.
A to je vec, ktorú sa vrátiť keď sa niečo pokazí.
Takže char max je to, čo sme pomocou predstavujú niečo
ako NULL alebo getchar.
>> Divákov: Takže ak testujete 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 skutočne, ako dĺžka reťazca vie, zastaviť, pretože prechádza
vaše pole znakov do 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 zložených
traky, čo index chceš ísť sa, že sú indexované od nuly, cez
Dĺžka poľa mínus jedna.
>> 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ť, je z tohto poľa.
Tak to je char pole dĺžky šesť, že 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 poľa už.
Takže by ste mohli zadať toto miesto as, povedzme, char, bez ohľadu na názov vášho
pole je prázdne zátvorky rovná kučeravé rovnátka H čiarka čiarka E L L čiarkou č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 získanie vstup od užívateľa ako
Argumenty hlavné.
Hlavné prijíma dva argumenty.
Počet argumentov, ktorý je prešiel pozdĺž príkazového riadka a a
reťazec vektora alebo pole reťazcov zo všetkých argumentov.
>> Takže keď, povedzme, sa nazýva funkcie, ako je bodka z 1 miesto, 2 priestor, tri,
argc by 4.
A argv 0 by bodka von.
Argv1 by jeden.
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 pole je dĺžka argc Plus
jeden z argb, posledný prvok je ukazovateľ NULL.
Je argc plus 1.
Takže v prípade, že som povedal, je to 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 mať hodnotu NULL.
>> A to je NULL pointer.
Áno.
A to preto, že reťazec je char hviezda je ukazovateľ.
Tak musí byť rovnakého typu.
Jo?
>> Divákov: Dve otázky.
Takže človek, aký je rozdiel medzi to a GetString iný ako jeden typ
v užívateľskej motore?
A za druhé, to je uložená v vaša posledná spomienka?
Tak ako, by GetString byť [nepočuteľné]?
>> DAN: Kde je 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 na hlavné a sú vo fronte, alebo naozaj
tesne nad to, čo si myslíte, že ako začiatok zásobníka.
Aká bola druhá časť otázky?
>> Divákov: Tak čo je to [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 to je šikovnejšie pre skripty, pretože vás
stačí odovzdať argumenty k vašej hlavnej funkcie skôr než čakať
pre používateľa v prípade, že nemáte žiadne používateľa.
>> DIVÁKOV: A jo, dostať reťazca by [nepočuteľné].
To by ukladať veci, ktoré potrebujete.
>> DAN: Jo?
>> Divákov: [nepočuteľné]?
>> DAN: Áno, argv 0 je vždy bodka lomítko z volanie funkcie.
Jo?
>> Divákov: [nepočuteľné]?
>> DAN: Áno, každý z argumentov skončila znakom 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, je mi ľúto.
>> 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 riadka 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 ste zavolal funkciu.
Takže mám tendenciu hlasno vylúčiť funkcie z príkazového riadka
argumenty, aj keď je to zahrnuté v argv.
>> DAN: Ale keby to bolo na test--
Jo-- aj keď poviete niečo ako argc rovná 3,
ste v bezpečné postavenie.
Jo?
>> Divákov: [nepočuteľné]?
>> DAN: Myslím, že keby namiesto volania tejto v argc a sláčikové argv 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äť haldy
pretože GetString je char *.
Ukladá pamäť haldy, pretože žiada, aby sa malloc v aktuálnej
realizácia getString.
OK, ďalej.
>> Zabezpečenia.
Takže skutočne bezpečné, môžete spoľahnúť na žiadny jeden a nedovoľujú jeden prístup ku ktorejkoľvek
vaše informácie, čo je dôvod, prečo všetci stavia svoje vlastné stroje,
vlastné operačné systémy, všetky ich Programy od nuly, a samozrejme
nepripájajte žiadne iné zariadenie cez internet.
Takže počítače sú neisté.
V skutočnosti sú.
Musíme veriť ostatným ľuďom.
>> A predstava bezpečnosti je, že ste sa snaží obmedziť množstvo
verím, že budete potrebovať.
A jedným z prostriedkov, môžete to urobiť je cez kryptografiu.
Kryptografia je, v podstate, máme tajomstvo.
>> Niekedy musíme prejsť naše tajomstvo spolu cez, povedzme, internet alebo
ďalších vecí.
A my nechceme ľudí spoznať táto tajomstvo.
Tak sme zašifrovať naše tajomstvo na ceste že dúfame, že nikto nemôže prísť na to.
>> Tak sme used--
cez priebehu tohto class--
veci, ako Caesara a [Nepočuteľné], ktoré sú veľmi oboje, veľmi
nebezpečné 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 my sa nesmie dostať do oveľa viac než to.
>> Ladenie.
GDB je najlepšie.
Chystám sa zdôrazniť to znova.
Použitie GDB celú dobu každý keď budete mať problém.
Príkazy, ktoré sú užitočné v GDB sú zlomiť, ktorý odovzdá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 to je premenná na to
bod vo svojom prevedení.
Ďalšie presunie prevedenie po jednom kroku.
A krok kroky vnútri funkcie v prevedení.
>> Ostatné veci sú beh, čo je, ako ste skutočne spustiť 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 ladiť svoj program.
Nie je to program, ktorý nájde chyby pre vy, ale bolo by to skvelé.
>> A posledný je pre mňa hľadanie.
Takže typov hľadanie, ktoré sme si rozprávali 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, jedna
prvok v čase, kým nenájdete to, čo hľadáte, alebo kým sa nedostanete si
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 prípade konštantný čas, č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, zistiť, či prvok hľadáte
je väčší alebo menší, ako je prvok že ste v stredu.
Je to väčšia, hovoríte, že dno Vášho hľadania priestor je váš
aktuálna poloha, stredná, a reštartovať proces.
Ak je to menšie, vyzeráš hovorí že to-- jo, čo sa deje?
>> Divákov: [nepočuteľné]?
>> DAN: Áno.
Nejaký druh druhu, ktorý sa kedy učil v trieda je poctivá hra pre skúšku.
>> [SMIECH]
>> DAN: A to, že ste nemali aby to pre problémové sady, je to fér
hra pre test.
>> Divákov: Môžeme ísť cez neho, ako na--
>> DAN: to bude preč cez.
>> SPEAKER 2: Skutočný kód [Nepočuteľné] je nastavená 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 pre vykonávanie zlúčiť druh.
Takže nemusíte vykonávať to sa dnes v noci.
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 to.
>> Divákov: A úplne v poriadku problém pre skúšku by
niečo ako tu je zoznam.
Čo to zoznam vyzerať po jeden krok voľby druhu alebo
vloženie triedenie alebo čokoľvek iného.
Jeden plný iterácie zoznamu.
Takže aj keď nechcete skončiť museli Kód pre to, musíte to pochopiť
Stačí vedieť, ako to bude je potrebné 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: Volanie sám.
>> LUCAS: OK, volá sám, hej.
Takže páči tento obrázok, napríklad.
Je to ako na obrázku vnútri obrázku, a tak ďalej.
Tak napríklad, môžete have-- ako Dan že hovoril o binárne vyhľadávanie.
Jedným zo spôsobov, binárne vyhľadávanie rekurzívne je skutočnosť, že ste
sa snaží nájsť číslo.
Takže idete do stredu.
A potom by ste skontrolovať, či čísla tam na ľavej strane a na pravej strane.
>> A potom, keď zistíte, číslo bude na ľavej strane, je to to isté
niečo ako znovu robiť hľadanie, ale len v ľavej časti zoznamu.
Tak to je, ako to vyzerá ako je rekurzívny.
Takže to je dôvod, prečo ste sa rekurzívne riešenie pre zlúčenie druhu.
>> OK, tak tu je jeden príklad.
Takže povedzme, že chcem vybrať všetky čísla od 1 po n.
Môžem si uvedomiť, že súčet n číslo n a navyše 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ý
niečo ako ako súhrn čísel až n mínus 1.
Takže môžem povedať, súčet rovnaké čiastky sa rovná n plus súčet n mínus jedna.
Má to zmysel?
>> A tiež bude mať niečo iné nazýva base-case, čo je to, že
súčet čísel hore na nulu by bol nula.
Takže akonáhle som sa k číslu nula, som prestať počítať.
Má to zmysel?
>> Tak 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 som najprv skontrolovať, či je n menšia alebo rovná nule.
Takže ak je to menší alebo rovný nule, I vrátiť sa na nulu, čo je náš základný scenár.
Inak môžem len vrátiť n Plus 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 hromadu svojho programu, to je to, čo to vyzerá.
>> Po prvé, máme hlavnú funkciu.
A potom hlavné funkcie volal súčet 2.
A potom suma 2 sa chystá povedať, oh, sum 2 sa rovná 2 plus súčet jedného.
Tak som sa pridať sumu 1 do zásobníka.
A súčet 1 bude volať súčet 0, čo bude tiež byť pridaný
do zásobníka.
A potom sa každý z týchto tie, ktoré sú na druhú musieť vrátiť
ako tie ostatné môžu pokračovať.
>> Tak napríklad, tu, suma 0, Najprv sa chystá vrátiť 0.
A potom zvoľte čiastku 1.
Potom suma 1 bude vráti 1 súčtu 2.
A konečne, súčet 2 sa deje vrátiť sa 3 na hlavnej.
Má to zmysel?
>> Je to naozaj dôležité, aby pochopili, ako zásobník funguje 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, ako.
Tak, napríklad, máme veľa veci v skutočnosti, v našom živote, ktoré
sú radené.
Napríklad, slovníky.
>> Je veľmi dôležité, aby všetky slová v nejakom poradí, ktoré sme
prístup ľahko.
Takže to je to, čo hovorí.
Môžete vyhľadávať efektívnejšie.
Premýšľajte o tom, ako ťažké to bude mať slovník, v ktorom 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ť svoje 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ľovi, budete vidieť
ľudia, ktorí pravdepodobne nemajú ani Pamätám si, že si priateľov.
A to preto, že Facebook druhov vaši priatelia založené na tom, ako
blízko ste k nim.
>> Takže organizovanie dát.
Tiež Pokemon.
Takže vidíte, že všetkých Pokémonov majú čísla.
A to je ako ľahko 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 triediť.
Výber radenia sa chystá vybrať Najmenší netriedený hodnota zo zoznamu každého
čas v každom opakovaní.
Je to niečo ako druh, ktorý robíte vo vašej hlave, keď sa snažíte, aby
zoradiť zoznam po ruke.
>> V podstate všetko, čo urobiť, je sa pozriete pre najmenším počtom.
Môžete dať do triedeného zoznamu.
A potom sa pozriete na ďalšie najmenšie číslo.
A potom sa v tom budeš pokračovať že a tak ďalej.
>> Takže výber druh je v podstate si vyberte zakaždým najmenší
netriedeného hodnota.
Dajte na konci radené súčasťou zoznamu.
A to robiť.
Takže poďme sa rýchlo pozrieť, čo to vyzerá.
Tak tu je radené a netriedený zoznam.
>> Takže radené zoznamu, je spočiatku prázdny.
A potom budem výber Najmenšie číslo tu, čo je o 2.
Tak som sa na číslo 2 a dal som v prednej časti zoznamu.
A potom som sa pozrieť na ďalšie najmenší prvok, ktorý je 3.
Tak som ju na konci 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ť na koniec,
v podstate, vymieňať dve hodnoty.
OK?
A potom ten posledný, ktorý ste práve ešte jeden prvok.
Takže už je zoradený.
>> OK, takže vloženie triediť.
Vloženie druh budete mať tiež že vec z toho, že triedené a
netriedený zoznam.
Jediná vec je, že zakaždým, keď Pridávate prvok na radené
list, stačí vybrať prvok, ktorý je v prednej časti netriedeného zoznamu.
A potom budete nájsť to, čo pozícia by mala byť v zotriedené
súčasťou zoznamu.
>> Pozrime sa, čo to je, takže to dáva väčší zmysel.
Takže najprv, napríklad, snažím sa vložiť číslo tri v
triedený súčasťou zoznamu.
Takže zoznam nemá nič.
Tak som si len dať číslo 3.
>> Teraz chcem pridať číslo 5 na triedený súčasťou zoznamu.
Tak som sa pozrieť na čísla 5.
Všimol som si, že je väčší ako 3.
Takže viem, že to musí byť po 3.
Tak som dal 3 a 5.
>> Potom chcem vložiť číslo dva.
Všimol som si, že číslo 2 je v skutočnosti posledná potom aj 3 a 5.
Takže som vlastne dať to všetko spôsob, ako na začiatku zoznamu.
Tak som sa, druh, posunúť všetky prvky v triedenom zozname, takže môžem
vytvoriť priestor pre číslo 2.
>> Potom som vidieť čí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 mala 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 bude do-- hovoríme bublina
druh, pretože sa prejsť list-- je to vlastne lepšie, keď som len ukázať
sa vám páči tohle--
a budete porovnávať susediace čísla.
A vy budete vymieňať svoje pozície v prípade, že nie ste
v správnom poradí.
>> Takže v podstate, čo sa deje na stať, je tu napríklad,
Máte-8 a 6.
Viete, že triedený objednávka bude v skutočnosti 6 a 5, nie?
Takže sa chystáte vymeniť objednávky.
Potom vidím, 8 a 4 tu.
A ja som to isté.
Znovu som sa vymeniť.
A konečne, 2 a 8.
Tiež som ich vymeniť.
>> Hovorí sa tomu 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, udržuje ju vymeniť a presunutím 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 je usporiadaný.
Takže v Bubble Sort, sme v podstate udržať prechádza v zozname a vymieňať
veci, ako som si všimla, že som to neurobil každý swap robiť to opakovanie, ktoré
Znamená to, že zoznam už je zoradený.
Zmysel?
>> Poďme hovoriť trochu o prevádzke.
Tak si chlapci pamätať Big O, Omega, a Theta?
Jo?
OK, čo je Big O, v prvom rade?
>> Divákov: [nepočuteľné].
>> LUCAS: Jo, je to len v najhoršom prípade runtime, čo práve znamená, že je
koľko očakávate program aby sa do behu.
Rovnako ako v oblasti of--
v tomto case-- 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 veľký Ø 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 som k tomu, že vec, n-krát.
A pre každý z týchto časov, musím do n swapy, pretože musím porovnať
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 triedenia je tiež n námestie pretože pre každú iteráciu, musím
pozrite sa na každé jednotlivé súčasti v zozname.
A potom nájsť najmenší, čo znamená, že budem musieť
prehliadnuť n prvkov.
A čo musím urobiť, že N-krát, pretože Musím vybrať všetky n prvkov.
>> Vloženie druh je tiež n námestie preto, že najhorší scenár
byť jedno, musím vložiť n čísla, že?
Tak už viem, že budem mať n iterácií.
Ale pre každý z týchto čísel, keď som mal pozrieť sa na všetky čísla v
radené zoznam a dať to všetko tak, ako 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ší scenár.
Takže je to ako v mnohých časov pre triedenie, najlepší scenár je
keď je zoznam už zoradené.
Takže si naozaj nemajú nič robiť.
Bubble Sort má najlepšie scenár n.
Neviete prečo?
>> Divákov: [nepočuteľné].
>> LUCAS: Áno, ak budete mať prehľad o či sú údaje pomer nejaké swapy alebo
nie, ak máte niečo ako nastavený na platí v prípade, že bola iterácie, ak
Zoznam už je zoradený, v podstate, čo sa stane je, že budem
skúste vymeniť každé dva susedné prvky.
Budem vidieť, že nie sú tam žiadne swapy.
A ja som sa vrátiť hneď.
>> Takže to znamená, že som musel prejsť zoznam naraz.
Tak to je n preto, že vyzerám na n prvkov.
Prečo výberom Triediť n námestí?
>> Jo, a to aj v prípade, že zoznam je radený, pre každá iterácia výber druhu, I
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 snaží sa ich vložiť, vidím, že sa
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 znova.
>> Divákov: [nepočuteľné].
>> LUCAS: Presne tak.
Takže vidíte, že len výber uložené v Zlúčiť druh má thetas.
A to preto, že máte len theta ak obidva Big O a Omega sú rovnaké.
OK.
A konečne, zlúčiť druh je v log n.
>> A potom, keď Dan hovoril, Merge sort je niečo ako rovnakým spôsobom, ako
tie binárne vyhľadávanie.
Tak sa dostanete na zoznam.
A vy budete znížiť na polovicu.
A potom sa rezať v menších polovice.
A potom je zlúčiť.
Vy ste si uvedomiť, že, že jo?
OK, ako sa hovorí.
>> OK, ukazovatele.
Takže to, čo je ukazovateľ?
>> Divákov: [nepočuteľné].
>> LUCAS: adresa.
OK.
Viem, že David ukazuje veľa videá Binkym a veci smerujúce
navzájom.
Ale ja by som si myslel, ukazovateľov ako obyčajnú adresu.
Takže je to premenná, ktorá sa deje uložiť adresu.
>> Takže je to práve táto špeciálna premenná , Že je dlhý štyri bajty.
Pamätajte si, že ukazovateľ na čokoľvek je vždy dlhý štyri bajty pre našu 32-bit
Stroj tak v prípade zariadení.
A to len má miesto premenné vnútri neho.
>> OK, takže je to spomienka, v podstate.
Takže každý blok pamäte, v skutočnosti má štítok, ktorý je adresa
Slott pamäti.
Takže to znamená, že môžem mať ukazovateľ ukazujúci na
niektoré z týchto adries.
Takže dôvod, prečo budeme používať ukazovatele je keď budem musieť pamätať umiestnenie
, Že konkrétna premenná pamäť.
>> A vy ste si uvedomiť, že jeden z tých prípadov bolo, keď mám funkciu
či mám skutočne chcú, aby ste výmena za reálnych čísel, ja vlastne
majú poslať ukazovateľ.
Nie je variabilný.
Ešte ste si uvedomiť, že?
Rozdiel between--
ako sa volá?
Volanie hodnotou a volanie s odkazom, že jo?
>> OK, jo.
Tak zavolaj hodnotou.
Keď pošlete premennú funkciu ste práve vysiela hodnotu.
Takže ste vlastne odosielanie kópie premenné.
A váš program je to úplne jedno o v prípade, že rovnaká premenná skutočne
vytvorí kópiu.
>> A volá odkaz znamená, že Ja som vlastne zaslaním kópie
Ukazovateľ na tejto premennej.
Takže to znamená, že pošlem umiestnenie tejto premennej.
Takže mám pocit, umiestnenie premenná, keď volám funkcie
s ukazovateľmi, som schopný skutočne Zmena dátumu, ktorá bola v hlavnom.
Zmysel?
>> Aj keď je ukazovateľ kopírovania, ukazovateľ má stále reálnu adresu
premenná, ktorá chcem zmeniť.
Zmysel?
>> Tak vytváranie ukazovateľov.
Pamätajte si, že ukazovateľ vždy typ, ktorý to ukazuje
, A potom sa hviezdy.
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 na 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 hrať x.
Viem, že vytvorí ukazovateľ na x.
Znamená to tiež vyhlásiť x na 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, že n hviezda x, som hovorí, hej, v pamäti, budem
získať jeden z týchto troch polí.
A ja poviem, že bude x, čo je
bude ukazovateľ.
A niečo zaujímavé o ukazovatele je to, že hovoríme, že majú
4 bajty pre 32-bitové počítače.
A dôvod, prečo to je 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 počítači sa líšia.
>> Takže Odkazovanie a Získavanie.
K dispozícii sú dva subjekty, ktoré Mali by ste pamätať.
Prvý z nich je ampersand.
Druhým je hviezda.
Nenechajte sa zmiasť tým, že hviezdy a to STAR, pretože nezabudnite, že v
tento prípad, budete musieť n hviezdu.
>> Je to ako celú vec dohromady.
Neexistuje n Space Star.
Takže to znamená, že je to typ.
Pamätajte si, že keď máte premenná hviezda, ty si
hovorí o type.
>> Keď máte len hviezdy 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, ak máte tam.
Takže hovorím svojim študentom, že keď máte hviezda, mal by si myslíte, ž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 adresa.
>> Takže ak mám premennú A-- rád, poďme povedať, že som urobil int rovná 3--
keď chcem nájsť adresu, ktorá variabilná pamäť, môžem len robiť
ampersand.
Takže je to adresa.
Zmysel?
>> Tak 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 dal čí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 päť.
>> Takže to, čo je táto položka robíš? n hviezda pa rovná ampersand a.
Takže v prvom rade, n hviezda pa.
Čo to robí?
>> Divákov: [nepočuteľné].
>> LUCAS: Jo, takže n hviezda pa, prvý, deklaruje ukazovateľ s názvom pa.
A potom je to priradením hodnoty že ukazovateľ byť adresa.
Tak ampersand.
Potom, keď to urobím hviezdu PB, čo je to hviezda pb?
>> Oh, ospravedlňujem sa.
To je tiež chýba. n hviezda pb.
Myslím hviezda ks.
Je mi to tak ľúto.
Je to to isté.
Ale teraz som v pohode ar vytvorí ukazovateľ na B ​​a potom ukazovateľ na C.
Jo?
>> Divákov: [nepočuteľné]?
>> LUCAS: Áno.
Takže ak idete do pamäti a prejdite k 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.
K dispozícii je ukladanie a adresu do určitej premennej.
Ešte niečo?
Nejaké ďalšie otázky?
OK.
>> Takže ukazovatele a polia.
Pamätajte si, že keď som si int pole 3, v podstate to, čo robím, je, že som, druh
o, vyhlásil v ukazovateľom.
Takže pole je niečo ako ukazovateľ na konkrétne miesto v pamäti, v ktorej som
pridelené tri sloty pre celé čísla.
Má to zmysel?
>> Takže keď som si int pole 3, čo som tom, v podstate, vytvára tri
sloty na pamäť.
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 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
Veká jedna, čo znamená len chodím do miesto, že to ukazuje na.
A potom sa naviac 1 značky me posun o jednu pozíciu.
Tak som na túto pozíciu, v skutočnosti, a dal číslo dva.
>> A potom, konečne, keď som si poľa a navyše 2, idem tam, kde
polohovacie Array adrese.
A potom som sa presťahovať do blokov pamäte.
A potom som dal číslo tri tady.
Jo?
>> Divákov: Takže hviezda poľa je jednoducho hovorí úplne prvý bod.
A môžete pridať jeden, len preto, že Sme naozaj len
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, jedna, výpočtová programátori radšej začať
počítané od 0.
Dva preto, že keď robíte polia 0, je to to isté, ako robí polia
plus 0, čo znamená, že idem do tento postoj, 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 robí
tento alebo robiť malloc.
Jeden z rozdielov je to, že int array 3 je vytvorenie
poľa na stacku.
A keď sa mi to malloc to, vytvára na halde.
Má to zmysel?
>> Takže ako malloc vlastne funguje?
Tak prečo ešte musieť použiť malloc?
Váš kompilátor druh postáv si všetko premenné, ktoré ste deklarované.
A 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é
vopred.
Nie je potrebné vedieť, akú hodnotu budete dať do nich.
Ale je potrebné vedieť, ako koľko pamäte budete potrebovať.
>> Ale teraz povedzme, že, napríklad, budete vytvárať polia alebo pri
Reťazec, ktorý užívate od užívateľa.
Neviete, ako dlho reťazec bude, napríklad.
Takže neviete presne, koľko blokov pamäti pridelíte, že jo?
>> Takže to naozaj nie je zmysel pre môžete 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 je potreba 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 pri prideľovaní
Doba trvania behu programu.
>> Takže v podstate, keď to urobíte malloc, čo robíte je prideľovanie na pamäti
runtime, čo znamená, že ste rozhodovanie o tom, právo v tomto okamihu, že vás
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 hromada 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 prideľovanie pamäte.
Tak to bude o pridelení pamäť na halde.
A to bude vracať ukazovateľ na kde bol, že pridelené pamäte na adrese.
>> Takže keď do--
pre example-- tu
n hviezda ukazovateľ.
A potom sa ukazovateľ rovná malloc Veľkosť palca krát 10.
Som vytvoriť ukazovateľ.
A potom som priraďovanie, že ukazovateľ hodnota ukazovateľa, ktoré malloc
dáva mi to.
>> Takže sa pýtam malloc môžete prideliť priestor pre 10 celých čísel.
To je to, čo hovorí.
A malloc mi vracia ukazovateľ na toto miesto.
Zmysel?
OK.
Aj A GetString je v podstate robí volať malloc, takže si môžete prideliť
pamäte za behu.
>> Vždy nezabudnite skontrolovať NULL pretože malloc sa chystá vrátiť NULL
ak nemožno alokovať pamäť.
Povedzme, že budete žiadať o smiešny množstvo pamäti.
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 je to, môžete byť dereferencing ukazovateľ a
spôsobuje nežiadúce chyby.
A konečne, nezabudnite vaše voľnej pamäte.
>> Malloc vytvára pamäť haldy.
A vy budete musieť 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 online.
Už ste ho nahrali ešte?
>> LUCAS: Myslím si, že Dave je to nahrať čoskoro.
>> DAVE: Bude to vedieť.
>> LUCAS: Bude to on-line.
>> Divákov: To záleží.
>> LUCAS: To sa deje?
OK.
Jo?
>> Divákov: [nepočuteľné]?
>> LUCAS: Áno, mali by ste uvoľniť všetky pamäť, ktorá je vložená do haldy.
>> Divákov: [nepočuteľné]?
>> LUCAS: Áno.
Kedykoľvek máte kultúry malloc, mali by ste mať kultúru zadarmo
Po zastavení používania tejto premennej.
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 MIC.
>> OK, takže 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 druhej.
A tiež si spomenúť, čo vlastne ide v každom zásobníku ráme sa bude
miestnej premenné našich funkcií, argumenty, ktoré sú odovzdané do našej
funkcie, spolu s niekoľkými iné veci, ktoré nemáte naozaj
treba obávať.
>> Tak tu je príklad programu, kde oznámenia, hlavné je printfing návrat
Hodnota foo 4.
foo sa práve chystá k návratu Hodnota bar 4 čiarkou 6.
A bar bude nastaviť niektoré miestne Premenná n rovné 4 krát 6.
A potom sa vrátiť n.
>> Takže poďme sa pozrieť na zásobníku v priebehu Skutočná iterácia tohto programu.
Takže tam je spodná časť nášho stacku.
Nezabudnite, že zásobník rastie.
Tak v dolnej časti našej stohu, sme majú zásobníka rámec pre hlavné.
Keď sa program spustí, hlavný vždy bude v
Spodná časť nášho stacku.
>> A to, čo je vo vnútri nášho stack frame za hlavnú?
Takže aj keď neexistujú miestne premenné na hlavnej, ako som povedal predtým,
sme argc a RGV zaberajú miesto vnútri hlavného rámu zásobníka.
Takže hlavné je teraz chystá volanie funkcie foo.
A to znamená, že foo bude si svoj vlastný zásobník rám.
>> Takže teraz sme vo vnútri 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 parameter Foo.
>> Takže teraz foo bude volať bar.
Čo je bar bude mať vo vnútri jeho "zásobníka rámu?
Je x rovnajúcu sa 4 y sa rovná šiestimi.
A to nie je všetko, že budeme mať v zásobníku rámci nasledujúcich dôvodov bar
má tiež lokálne premenné n.
A n budeme rovná 24.
>> Takže teraz bar sa chystá k návratu n.
Takže tyč 24 sa vracia do stack frame foo.
A pretože bar je teraz vracia, že znamená, že sa objavujú zásobníka rám
na bare von zo zásobníka.
Takže všetko, pamäť, ktorá bar bol použitie je teraz z kôpky.
>> Teraz foo bude tiež vrátiť 24 na hlavnej.
Takže teraz, že foo sa vracia, pamäť že foo použil vo svojej '
stack frame je tiež preč.
A teraz, hlavné bude volať 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 v jeho 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 to robí.
To sa vráti.
Konečne, 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.
Argumenty sú to, čo v skutočnosti odovzdať ako tie parametre.
Takže, keď som zavolať foo o 4, 4 je argument som odovzdaním.
A parameter n, vnútri foo, má na hodnotu 4
od 4 bol argument.
>> Divákov: [nepočuteľné]?
>> ROB: n je lokálne premennú do baru.
n je ešte miestna foo, ale Je to parameter foo.
Nie je to lokálna premenná.
Jo?
>> Divákov: [nepočuteľné]?
>> ROB: foo práve volá bar a návrate na akomkoľ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 foo nazývaný pred printf?
>> ROB: Prečo foo volaná pred printf?
Takže som mohol mať, namiesto toho urobiť niečo ako int x rovná foo z 4
a potom vytlačiť x.
Miesto, ale v kombinácii som funkciu volania do printf argument.
>> Ale všimnite si, že nemôžeme v skutočnosti vykonať volanie printf, kým sa
zistiť, čo foo z 4 je.
Takže budeme hodnotiť to.
A len raz, že to urobil sa deje vrátiť a zhodnotiť 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.
Ktoré sa nechytilo viac ako viac priechodov.
Tak to by malo byť int bar a int foo pretože oba tieto
sa vracia celé čísla.
Void je len vtedy, ak to nebude vrátiť aktuálnej hodnoty.
Jo?
>> Divákov: Ak by ste mali linku vyššie návrat [nepočuteľné]?
>> ROB: čiara nad návratom?
>> Hľadisko: Áno.
Ako keď ste printf a [nepočuteľné] by to vytlačiť dvakrát?
>> ROB: Takže vnútri foo?
Keby sme mali printf tu?
>> Hľadisko: Áno.
>> ROB: Takže ak sme mali printf právo tu by to tlačiť raz.
Vzhľadom k tomu, voláme foo raz pravdu tú, potom budeme hit printf.
Potom zavoláme bar.
A potom foo vráti.
A to je všetko.
Vieme len, že sa vyskytnú 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 aby to c sa chystá vykonať tieto veci je, ako budeme môcť
volanie funkcie, všetky argumenty funkciu musí
úplne vyhodnotené.
Takže je to úplne hodnotená?
Áno, je to len reťazec.
Je to len hodnota.
>> Potom musíme úplne hodnotiť to.
Akonáhle je to hotovo, teraz všetci jeho argumenty sú vyhodnotené.
A teraz môžeme volania printf.
Jo?
>> Divákov: Jedna otázka.
Ak máte funkciu void, musí Máte spiatočnej bodkočiarka?
>> ROB: Nemáte návrat bodkočiarka ak máte funkciu void.
OK.
Takže teraz nejaké haldy veci.
Tak haldy je, ako budeme riešiť s dynamickou správou pamäti.
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 naozaj vysporiadať s tým, ako lokálnych premenných
sú tlačené a vyskočila vypnúť 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é]
pochádza z týchto funkcií malloc a zadarmo.
>> Tak tu je ďalší program.
Všetko, čo robíte, je mallocing číslo.
Sme ukladanie do hviezdy x.
Samozrejme, že musíme skontrolovať, aby zistil, či x je null.
Potom budeme len nastaviť to, čo x ukazuje na 50.
Vytlačiť čo x smeruje k, print x, a potom voľný x.
>> Tak, ako sa to vlastne bude vyzerať Ak sa pozrieme na našu zásobníka a haldy?
Takže začneme znova.
Spodná časť našej zásobníka ako predtým.
Pamätajte si, že ťa haldy priamo stavia stoh?
Takže budeme mať Vrchol našej haldy tam.
>> Takže dolnej časti nášho zásobníka, máme náš stack frame pre hlavné.
Má priestor pre argc, argv a my majú teraz miestnej premennú x, ktorá
je int hviezda.
Takže budeme iterovat v rámci tohto programu.
Prvá vec, ktorú máme, je volania malloc.
>> Takže robíme volania malloc.
Malloc je funkcia.
Je to dostane zásobníka rám.
Čo budeme prechádzať k malloc?
To bude ísť dovnútra zo zásobníka rámu.
Máme okolo veľkosti n, čo je o 4.
Tak, že je odovzdaný malloc.
>> Čo malloc robiť?
Je to pre nás chytí nejaký priestor na halde.
Tak budeme chodiť na haldy.
A ideme chytiť 4 bajtov z haldy.
Takže poďme sa len tak, že ľubovoľnú adresu.
0x123 Len predstierať, že je adresu, ktorá je na halde.
>> Takže to, čo je vlastne vo vnútri toho oblasť pamäte na adrese Ox123?
Garbage.
Takže sme sa neuloží nič v ňom.
Takže ak vieme, je Môže to byť čokoľvek.
Nemali by ste predpokladať, že je to nula.
Je to s najväčšou pravdepodobnosťou nie je nula.
>> Takže teraz malloc vráti.
A čo budeme robiť, keď sa vráti malloc?
Vydali sme, čo sa vráti.
Vydali sme sa x rovná tomu, čo sa vracia.
Takže to, čo sa to vracia?
Je to návrate 0x123, pretože to je adresa bloku pamäti, že to
len pridelené v halde.
>> Tak sa vrátiť 0x123 x je teraz bude nastavený rovná 0x123, ktoré obrazovo,
sme často kresliť ako x majúce skutočný šípka ukazuje k tomuto 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 tejto línii, to je to, čo veci budú vyzerať.
Takže teraz už to nie je odpadky tam hore.
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 hviezda x znamená ísť do vec, ktorá x je ukazuje.
Takže x je ukladanie 0x123 Choď na to.
Dostaneme 50.
Takže vytlačiť f to.
A to znamená, že to bude tlačiť 50.
A potom, že sa vráti.
>> A potom máme druhý printf.
Teraz sme percent v.
Ak ste ho ešte nevideli, to je ako vytlačiť ukazovateľ.
Takže máme percent i, percent 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 bude tlačiť 50.
Druhá tlačová f sa deje vytlačiť 0x123 Jo?
>> Divákov: Používate 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
číslo a chcete tlačiť to ako hexadecimálne.
To je, ako to urobiť.
>> Vzhľadom k tomu, by percent d vytlačiť ako desatinné číslo.
To boli dostaneme percent d. i je len číslo.
percent p je špecificky pre ukazovatele.
>> Takže x je ukazovateľ.
Chceme využiť percent str.
Ale percento x by mohlo fungovať.
Jo?
>> Divákov: [nepočuteľné]?
>> ROB: Jo.
Aspoň pre tento call--, tak som nezahŕňali to tu.
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 volania printf teraz vnútri printf stack frame je
percent p spätné lomítko n a to bez ohľadu na hodnotu x, čo je 0x123.
Jo?
>> Divákov: [nepočuteľné]?
>> ROB: To bude niečo vytlačiť že vyzerá takto.
>> Divákov: [nepočuteľné].
>> ROB: Takže to vytlačí ho v adresnom formulári.
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 bajty?
Takže existuje celá partia z 0 rokov pred týmto.
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 bude print--
>> Divákov: [nepočuteľné].
>> ROB: Áno, to bude tlačiť čo x ukazuje.
Hviezda hovorí, že to, čo je to čo ukazuje.
Chytiť ho.
Takže to, čo sa to ukazuje na?
50.
Chytiť ho.
To je to, čo budeme tlačiť.
Vzhľadom k tomu, ďalší, že sme len tlač x samo o sebe.
Čo je vo vnútri f?
0x123.
OK.
>> A potom, konečne, máme voľný.
Čo sme okolo oslobodiť?
Sme okolo 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 hromady
a voľné, že pamäť.
Je to už používate, čo je na adrese 0x123.
>> Takže bez sa chystá na vydanie ktoré z haldy.
Teraz je naša haldy je opäť prázdny.
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.
My už dereferencia x.
Jo?
>> Divákov: Je návrat 0 redundantné?
>> ROB: Je returen 0 nadbytočný?
Áno.
Práve sme sa dať to tam, pretože máme vrátiť jednu pre vzduch.
Takže je to ako, jo, umožňuje patrí návrat 0.
Jo?
>> Divákov: [nepočuteľné]?
>> ROB: Takže po voľných x, čo sa stane v prípade, snažíme dereferencia ukazovateľ?
Je možné, že sa nič pokazí.
Je možné, že budeme ešte dostať 50.
>> Je to možné, aj to, že táto pamäť je v súčasnej dobe používa pre niečo iné.
Takže je to nedefinované chovanie.
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 je rovná malloc niečo else--
malloc veľkosť event--
potom, že pôvodný blok pamäti nie je uvoľnené.
A my sme oficiálne stratil.
To je pretekanie pamäte.
Stratili sme všetky odkazy v tomto bloku pamäti.
Takže nie je žiadny spôsob, ako môžeme niekedy oslobodiť ju.
OK, tak potom sa vráti 0 znamená urobiť.
>> Dobre, takže pretečenie zásobníka.
Čo je myšlienka tu?
Takže pamätajte, že haldy klesá.
Stack stúpa.
Tak toto bol príklad z prednášky, Myslím, že tam, kde hlavné je len tak
volať túto funkciu foo, ktorý sa deje volať seba rekurzívne znova a
znova.
>> Takže zásobník rámy budú pracujú úplne rovnako.
Takže budeme začať s hlavným ako spodná rámca zásobníka.
Potom hlavný bude volať foo, ktorý dostane zásobníka rám.
>> Potom foo bude volať foo opäť, ktorý sa dostane
ďalšie stack frame.
A potom znova a znova, a znova, a znovu, kým nakoniec sme sa spustiť
do haldy.
Tak to je, ako sa dostať pretečeniu zásobníka.
A v tomto okamihu seg chybu.
Alebo by ste naozaj seg chyba pred tento bod, ale jo.
>> Divákov: Je core dump rovnako ako poruchy seg?
>> ROB: Takže uvidíte segmentáciu Porucha core dumpingové.
Získate core dump keď ste seg chybu.
A je to ako výpise všetkých obsah aktuálnej pamäte, takže
ktoré si môžete vyskúšať a identifikovať prečo ste seg vyčítané.
Jo?
>> Divákov: [nepočuteľné]?
>> ROB: Takže porucha segmentácie prostriedky tam je pretečeniu zásobníka.
Takže nemusí byť.
Porucha segmentácia znamená, že ste dojemné pamäti takým spôsobom,
nemali by ste byť.
Takže jeden spôsob, že sa tak stane, ak je môžete stack overflow, začneme dotýkať
pamäti tak, že by sme nemali byť.
Jo?
>> Divákov: [nepočuteľné]?
>> ROB: Takže vnútri nekonečnej slučke.
Ako, je to ako rekurzívny nekonečna slučky, a tak sme si ďalšie
stack frame zakaždým.
Ale vnútri pravidelný nekonečný, kým one--
dobre, nech to nie je ani tlačiť F--
niečo urobiť.
To je fuk.
>> Nebudeme sa dostať ďalšie stack frame.
Sme len tak, aby smyčkování nad touto jedinou inštrukcií.
Zásobník sa nezvyšuje.
Je to skutočnosť, že každý rekurzívne hovor nám dáva zásobníka rám.
To je dôvod, prečo sme sa pretečeniu zásobníka.
Jo?
>> Divákov: Takže ak ste povedal, aby si while a potom [nepočuteľné]?
>> ROB: Takže ak vnútri while tam bol printf, stále by
nie seg chyba.
Len som nechcel pliesť veci.
Bolo by slučka.
Vy by ste si jeden zásobník rám pre printf.
>> Potom printf 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 nie ste dostať to nekonečný hromadia zásobníka rámy.
>> Divákov: [nepočuteľné]?
>> ROB: Áno.
Takže to pretečeniu zásobníka dôjde pretože žiadny z nich
volanie foo sa vracajú.
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é funkcie.
Jo?
>> Divákov: Je možné veľkosti a zásobník na hromadu rovnaké pre
všetky programy?
>> ROB: Zhruba.
Je potenciálna veľkosť zásobníka a haldy rovnaké pre všetky programy?
Zhruba.
Existujú určité randomizácie do kde začína zásobník a
kde začína haldy.
Ak sa vám stalo, že máte veľa globálne premenné a veci, môžete
odniesť z nejakého priestoru pre vaše hromadu.
>> Na 64-bitovom systéme, môžete prakticky nekonečnú pamäť.
Je tu len toľko.
Medzi 32 bitov a 64 bitov, že je významný rozdiel.
>> Budeš sa dostať veľa viac stack a heap miesto na 64-bit
systém, pretože tam je len viac adries, ktoré sa môžu použiť.
Ale na individuálnom systéme, bude zhruba rovnaké množstvo stohu
a haldy priestor.
V poriadku.
>> 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ý by mal byť ľahko zapamätateľné.
Pre-processing.
To má predponu pre 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 týchto.
Tí, ktorí sú pre-procesor smernice.
To sú veci, ktoré sa pre-procesor sa postará o.
>> Takže čo to pre-procesor robiť?
Je to naozaj hlúposť.
Všetko, čo je schopný ich všetky z nich kopírovanie a strih a vkladanie operácie.
>> Takže hash obsahuje štandardné i0 dot hodín.
Čo je to robí?
Je to chytil štandardné I0 dot h súbor 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 videli, čo sa to robí?
Jeho kopírovanie hodnoty tohto hash definovanej je definovaný ako a vkladanie, ktoré
všade tam, kde používate hodnotu.
Takže preprocesor práve robí naozaj operácie na základe jednoduchý text.
Nerobí nič chytrého.
Takže všetko, čo je zložitejšie.
>> Takže teraz, že preprocesor je Hotovo, sme vlastne zostaviť.
Takže čo zostavovanie 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 sa znamená ísť od vyššej jazyk na úrovni
nižšiu úroveň jazyka.
>> A c je vysoká jazyková úroveň v porovnaní s montážou.
Čo je to montáž?
Jeho pokynmi, ktoré sú, dosť moc, robil pre váš procesor.
Ale váš počítač stále 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 pokynov, ktoré
váš procesor rozumie a v skutočnosti prevádza ich, aby
tie jednotky a nuly.
>> Takže C montážou na binárne.
Ale 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 Táto CS50 knižnica, ktorá má getString
a vezmi_int a tak.
>> Ale CS50 library--
va itself-- 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ý súbor.
Jeden, ktorý môžete zadať bodka lomítko bodku von.
>> Takže to je ako súbor, ktorý ste písal, - bez ohľadu na váš program je--
Ceaser dot c.
Ale teraz to bol zostavený dole na binárne.
Tak Ceaser bodka o.
A toto je náš 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í, pamätajte, 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ť čokoľvek pretože máte všetko.
>> To znamená, že printf je spojený v.
Ak ste niekedy použiť printf, to je niečo, , Že musí byť spojené v
pretože si to nenapísal.
A, v skutočnosti, printf je automaticky spojené.
Viete, ako na príkazovom riadku, alebo ak Môžete zadať, aby, je vidieť, že majú
pomlčka l CS50, ktorý má odkaz v knižnici CS50?
Printf, a tak podobne, že sa deje byť spojené automaticky.
Nejaké ďalšie otázky týkajúce sa niečo?
>> 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 podávať na binárne tohto CS50 knižnice.
>> Ak chcete použiť getString vo vašom 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
Zatiaľ nie je úplne definované.
>> Je to len pri prepojení v mojom binárnej ktorý obsahuje getString, že teraz všetko
Dobre, môžem vlastne spustiť getString.
Môj súbor je kompletný.
A môžem spustiť to.
Jo?
>> Divákov: Má prepájanie previesť binárne spustiteľný?
Takže aj keď nemáte iný knižnice, nebolo by to stále
potrebné prekladať [Nepočuteľné]?
>> ROB: Takže spustiteľný je stále v binárnom formáte.
Je to len kombinujúci celok banda binárnych súborov.
>> DIVÁKOV: Ďakujem moc.
>> ROB: Žiadny problém.
Nejaké ďalšie otázky?
Inak sme všetko nastavené.
V poriadku.
Vďaka.
>> [APPLAUSE]
>> DIVÁKOV: Ďakujem.
>> ROB: Jo.