[Powered by Google Translate] [2. týždeň, pokračovanie]
[David J. Malan, Harvard University]
[To je CS50. - CS50.TV]
Dobrá. To je CS50, a to je koniec 2. týždeň.
Ak očakávate, že hlad po tejto dobe zajtra,
viem, že budeme zvolávať ako malé skupiny zajtra, vo štvrtok, 13:15.
Tam je to URL tu, ak chcete RSVP.
Priestor je obmedzený, preto prosím ospravedlňte, ak bol formulár vyplnený až v čase, keď vyplníte na to.
Ďalšie URL, ale, že by mohlo byť zaujímavé je to.
V takmer za mesiac, kurz sa bude k dispozícii
všetky všeobecnejšie cez EDX, cez ktoré ľudia na internete budú môcť sledovať spolu,
zapojiť sa do kurzu pomerne aktívne, v skutočnosti.
Budú používať CS50 Appliance a CS50 Diskutovať
a väčšina z rôznych softvérových nástrojov, ktoré sme už používali tento semester.
A jednou z iniciatív by sme chceli, aby sa na ako experiment v tomto roku
je vidieť, koľko obsahu môžeme preložiť
do iných hovorené a písané jazyky.
Takže ak by ste mohli mať záujem o účasť v tomto projekte
kedy budeme poskytovať anglické prepisy a titulky pre kurz je prednáškach
a šortky a semináre a profily a podobne,
ak hovoríte plynulo alebo písať plynně nejaký iný jazyk,
radi by sme vtiahnuť vás do tohto projektu, kedy budete mať na jednom alebo viacerých videí,
previesť ich do jazyka poznáte celkom dobre.
>> Ak chcete dať vám pocit rozhranie, tam je to web-based užívateľské rozhranie
že budeme používať, že vytvorí v podstate užívateľské rozhranie, ako je tento.
Toto bolo mi učil niektoré Halloween pred,
a na pravej strane tam v čiernom vedľa týchto časových pečiatok,
uvidíte rôzne veci, ktoré vyšli z mojich úst, že deň,
a potom pod ním budete môcť previesť do nejakého iného jazyka
presne to, čo je mapovanie medzi, v tomto prípade, angličtina a, povedzme, španielsky.
Takže je to vlastne veľmi užívateľsky príjemný nástroj.
Môžete pretáčať vpred veľmi rýchlo pomocou klávesových skratiek.
Takže ak by ste chceli zúčastniť tohto experimentu a mať vaše slová vidieť a čítať
by potenciálne tisíce ľudí tam, prosím, neváhajte sa zúčastniť.
Jedno slovo o mačiatko od pondelka.
Lesť sme poslali príliš desivé správy, si uvedomiť, že ako úradné hodiny naznačujú
a ako častí naznačujú, konštrukcia predmetu je veľmi
k študenti spolupracovať a hovoriť do práce cez problémové súbory
a problémy spoločne, a naozaj sa riadok práve prichádza do,
znovu, mal prácu, ktorú nakoniec odoslať byť vaše vlastné.
A tak celkom úprimne, v úradných hodinách, že je to úplne normálne,
je to úplne očakávať ani, bude chatovanie s nejakým priateľom vedľa vás.
>> Ak on alebo ona sa stretáva s nejakým témou a ste radi,
"No, dobre, dovoľte mi, aby som vám pohľad niektorých riadok kódu, ktorý som napísal," to je v poriadku,
že sa stane, a to je veľmi priaznivé, myslím, s procesom učenia.
Ak je linka dostane prešiel je, keď hlava je trochu naklonená sem na príliš veľa sekúnd
alebo min, ktoré naozaj boli práve odblokovanie príležitosť pre svojho priateľa,
a iste, kedy sa veci vymieňajú prostredníctvom e-mailu a Dropbox a podobne,
tam taky je čiara.
Takže všetkými prostriedkami cítiť pohodlne a cíti sa vyzývajú, aby chatovať s priateľmi
a spolužiaci o psets a viac a len si uvedomiť, že to, čo ste nakoniec predloží
by mala byť skutočne produktom vašej tvorby a nie niekto iný.
A tak jeden z domény špecifických problémov pre pset2,
ktorý príde neskoro zajtra večer, je ponoriť sa do sveta kryptografie,
ktorá je umenie šifrovanie alebo kódovanie informácie,
a to nakoniec týka svete bezpečnosti.
Teraz, bezpečnosť pre väčšinu z nás prichádza v podobe pomerne svetských mechanizmov.
Každý z nás má používateľské mená a heslá,
a každý z nás má veľmi zlé používateľské mená a heslá, s najväčšou pravdepodobnosťou.
>> Ak je heslo rovnaké na niekoľkých webových stránkach, že to asi nie je najlepší nápad,
ako budeme diskutovať na semester konci.
Ak heslo je napísané na lepiacej poznámku - nie je vtip - na vašom monitore,
To tiež nie je nevyhnutne najlepší dizajn, ale celkom bežným javom.
A ak si nie ste s použitím kryptografie na šifrovanie hesiel,
sú obzvlášť zraniteľné.
Takže ak si myslíte, že ste bol výborný múdra majúci skrytú dokument programu Word
niekde na pevnom disku, ktorý má všetky vaše heslá
ale je to v priečinku, ktorá nikto to bude vyzerať v, že príliš nie je moc bezpečné mechanizmus.
A tak to, čo pset2 predstaví je toto umenie kryptografie
a miešať informácie tak, že veci ako heslá sú bezpečnejšie.
Kontext je, že s nezabezpečenými údajov
prichádza príležitosť na šifrovanie ho a škriabať ho.
A tak to, napríklad, je príklad šifrované správe.
To vlastne hovorí, že niečo v angličtine, ale to zjavne nie je celkom zrejmé.
A my prídeme kruh dnes šprýmař oddelene, čo to tajný odkaz tu.
Ale v reálnom svete počítačov, veci sa ani nepozrel, ako by mohli byť anglické vety.
Napríklad, to je to, čo môžete nájsť na štandardného Linux alebo Mac alebo počítač so systémom UNIX
v súbore, ktorý bol kedysi nazývaný súbor s heslami.
>> V súčasnej dobe je to už sa sťahoval do iných miest.
Ale keď sa pozriete na správnom mieste v systéme, uvidíte nielen svoje užívateľské meno
alebo iných ľudí na systéme, ale uvidíte šifrované verzii svoje heslo.
Naozaj, slovo krypta sa naznačuje, že nasledujúce veci sú šifrované,
a táto séria zdanlivo náhodných písmen a znakov a čísiel a tak ďalej
dá dešifrovať iba všeobecne poznať nejaké tajomstvo -
Tajné slovo, tajné číslo -
a tak naozaj, umenie kryptografia v konečnom dôsledku sa scvrkáva veriť nejakého druhu
a vedel niečo, čo niekto iný nemá.
Takže budeme skúmať to v trochu podrobnejšie dnes v PSet prísť.
A teraz slovo na Pass / Fail.
Zvlášť keď niektorí z vás sa ponorila do pset1, spotrebiče,
a úplne nový svet pre seba, uvedomiť si, že frustrácia a zmätok
a len technické problémy sú pomerne možno očakávať,
najmä s prvým Pset, kde je to len toľko nové,
len zoznámenie s ls a cd a všetky tieto tajomné príkazy
a nové prostredie, a to je oddelená od skutočného materiálu a programovanie sám.
Takže si uvedomiť, že aj tam sú určite úradné hodiny, ktoré existujú ako podporné štruktúry.
>> Sekcia začať tento rok v nedeľu.
Ale čo je najdôležitejšie, ak máte pocit, proste, že to nie je svet pre teba,
si uvedomiť, že je to naozaj len nejakú dobu trvať.
A bol to nie pre túto príležitosť pred rokmi pre mňa vezme triedy vyhovuje / nevyhovuje,
úprimne, nikdy by som si dokonca nastaviť nohu v triede.
A môžete zmeniť až do, povedzme, piaty pondelok kurzu,
takže ak ste na okraji teraz si uvedomiť, že skôr ako hlava do niektorých iných vôd dohromady,
si určite považovať len zmenou na prijatie / odmietnutie.
Opäť platí, že to nie je naozaj to kultúra tu na Harvarde branie vecí vyhovuje / nevyhovuje
pretože všetci naozaj chce dosiahnuť lepšie výsledky, alebo,
ale úprimne povedané, je to skvelý spôsob, ako sa snaží niečo
ktoré nemusia byť oboznámení s vami, a vy skončíte robiť, vo väčšine prípadov, celkom dobre,
možno veľa k svojmu prekvapenie.
A v Konkrétnejšie, čo si myslím, vyhovel / nevyhovel všeobecne robí,
najmä ak ste si mohli skúsenosti s pset0,
keď dáte v 10 hodín, 15 hodín, 25 hodín do nejakého PSet
a ty si jednoducho búchanie hlavou proti múru a je to čím ďalej Super neskoro v noci
ale vy ste vzali PSet 90% cesty a vy jednoducho nemôžete prísť na jednu vec,
vyhovel / nevyhovel naozaj berie zmiernilo triedy, ako je táto,
kde si môžete nejako šťastne hovorí: "Dobre, ja viem, že to nie je dokonalé,
ale pracoval som prdel na to, som celkom spokojný s tým, kde to skončilo, "
a že bude spĺňať očakávania vyhovuje / nevyhovuje.
Takže sa majte na pamäti, že. Dobrá.
>> Takže tí z vás, ktorí sa usilovne snažia využiť Harvardskú univerzitu Wi-Fi,
viem, že je tu CS50 SSID, Wi-Fi pripojenie, vznášajúce sa okolo
že by ste mohli mať väčšie šťastie pre.
Je to trochu paradoxné, že heslo pre to, ak by ste chceli skúsiť pripojiť k tomuto
pre lepšiu rýchlosti - a dajte nám vedieť, pokiaľ to nie je lepšie - je 12345, celú cestu až do 8
pretože 8 je bezpečnejšie ako 5.
Takže ak potrebujete Wi-Fi hesla, pripojiť sa k CS50 bezdrôtovo tu, 12345678,
a príspevok na CS50 Diskutovať ak máte stále prerušované problémy s pripojením,
a necháme právomoci, ktoré budú poznať pre tento priestor. Dobrá.
Tak rýchly teaser, najmä pre tých z vás, ktorí sú ventilátor chlapcov a dievčat všetkých vecí Apple.
To, čo som vyhrabal z niekoľko rokov späť bola tento súbor tu, iUnlock.c,
len trochu, aby konkrétnejšie a zložitejšie
niektoré z viac základných programov v jazyku C sme písali.
Tak som otvoril tento súbor, iUnlock.c. Je k dispozícii na stránke prednášky pre dnešok.
Na ľavej strane sa zobrazí dlhý zoznam funkcií.
Takže ten chlapík, ktorý napísal tento spísal mnoho funkcií, viac ako len hlavná.
Použil veľa knižníc tu, a ak začneme rolovanie,
čo to vlastne je, je úplne prvá, verím, crack na pôvodnú iPhone.
>> Ak by ste chceli, aby útek z väzenia pôvodnej iPhone, čo znamená, že untether to od AT & T
a skutočne nainštalovať špeciálny softvér na to a robiť veci, ktoré Apple nechcel, aby ľudia urobili,
niekto vzal čas, aby zistili, ako presne by mohol zneužiť softvérové ​​chyby,
chyby, chyby v softvéri, Apple, a tak sa narodil iUnlock.c--
, Že ak ju zaobstaral do svojho počítača a nainštalovať ho na iPhone
, Ktorý bol pripojený k počítaču prostredníctvom, povedzme, kábla USB,
To by vám správca alebo užívateľ root oprávnenia na vašom iPhone
a nechať si urobiť skoro čokoľvek chcete.
A tak tam bolo to fascinujúce hra na mačku a myš
medzi Apple a zvyškom sveta, najmä pokiaľ ide, rovnako ako mnoho firiem,
v snahe zabezpečiť svoje veci stanovuje, takže môžete robiť len s tým, čo majú v úmysle.
Ale vďaka ľuďom, ako je tento a porozumenie nízkoúrovňových detailov -
a v tomto prípade C programovanie - a mnoho známych konštrukcií
že sme začali hrať s, ste schopní skutočne využívajú hardvér
spôsobom uznáte za vhodné, a nie nutne nejaký právnickej osoby.
Tak napríklad, nemám tušenie, čo to všetko robí,
ale getVersion znie celkom jednoduché,
a vyzerá to, že je to funkcia, ktorá táto osoba napísala.
To trvá nejakú integer ako argument, nič nevracia,
ale zdá sa, slučky pre sláčiky tu a ak podmienka, ak stav prestávky,
a nejako súvisí s číslami verzií, pokiaľ sme sa posunúť nadol,
aj keď veľa z týchto kľúčových slov sa bude nové.
A je tu veľa funkcií v tú sme nikdy nevideli a možno nikdy neuvidíš
v priebehu semestra.
>> Na konci dňa, to sa riadi rovnakými pravidlami a logiku, že sme hrali s tým ďaleko.
Tak toto je príliš starý na to bezva váš iPhone 3s alebo 4s alebo 5s čoskoro tieto dni,
ale viem, že je to všetko moc pochádza z tohto sveta, že sme sa ponorila do.
Poďme sa pozrieť na trochu jednoduchý príklad:
tento, len preto, aby si ohriať nejakú syntaxou a tiež niektoré ďalšie údaje typ
že sme hovorili o ale naozaj nevidel v C.
To je súbor s názvom positive1.c, a za pripomienky hore,
to len požaduje, aby užívateľ zaistiť kladné číslo.
Takže je to príklad do-while, čo je pekné programov užívateľských interaktívne
kde je potrebné oznámiť užívateľovi robiť niečo,
a ak nespolupracujú ste kričať na ne, alebo odmietnuť ich vstup.
Vec v bode: budem robiť linky 19 až 24
tak dlho, kým užívateľ mi nedala kladné číslo.
Tento detail tu na riadku 18, prečo som určil n nad touto celou konštrukcia cyklu
oproti hneď vedľa riadku 22, kde som vlastne jedno, dostať n? Jo.
[Študent] Rozsah. >> Jo, tak to otázka rozsahu.
A v Laicky povedané, čo sa rozsahu týka?
Jo. >> [Nepočuteľné Študent odpoveď] >> Môžeš hovoriť trochu hlasnejšie?
[Študent] Kde môžete pristupovať k tejto premennej. >> Perfect.
Kde môžete získať prístup k danej premennej.
A všeobecne, pravidlo bolo doteraz, že rozsah pôsobnosti niektorých premenné
je definovaná najnovších zložených zátvoriek, ktoré ste videli.
>> A tak v tomto prípade, keď som urobil chybu deklarovať n na linke 22, to by linka fungovať.
Ja by som si int, a ja by som dal to do tej premennej n v riadku 22,
ale riadok kódu by teraz netuším, čo hovorím? >> [Študent] 25.
[Malan] 25, a to dopadá 24 aj preto, že v tomto prípade to padá mimo zložených zátvoriek.
Takže len trochu na obtiaž, ale veľmi ľahko vyriešiť tým, že jednoducho vyhlásil premenná
mimo funkciu samotnej.
Uvidíme ešte dnes môžete ísť ešte o krok ďalej
a môžete dokonca získať trochu lenivý.
A to nie je možné odporučiť všeobecne, ale mohli ste dokonca leniví
a dať premennú globálne, aby som tak povedal, a nie vo vnútri funkcie, nie vo vnútri slučky,
ale v samotnom súbore, mimo všetky funkcie, ktoré ste napísal, ako som to urobil tu na linke 15.
Toto je všeobecne odsudzovaná, ale uvedomiť je to riešenie niekedy ďalšie problémy,
ako budeme nakoniec vidieť.
Takže teraz necháme to takto, ale uvidíme, či môžeme prepísať toto
len začať vyjadrovať sami seba trochu inak.
Tento program, len aby bolo jasno, je positive1.
Nechaj ma ísť napred tu a vo svojom terminálovom okne, aby positive1, Enter.
Vybudovať v poriadku. Chystám sa spustiť positive1, stlačte klávesu Enter.
Žiadam, aby ste mi celé kladné číslo. Poviem -1. To nefungovalo.
0, 99. Zdá sa, že funguje.
Možno nie najprísnejšie test, ale aspoň je to pekné sanity check
že sme na správnej ceste.
>> Takže teraz ma nechaj ísť dopredu a otvorte verzii 2 tohto,
a čo je odlišné už?
Vykonáva sa to isté, ale to, čo skáče tak, ako je zreteľne iný tentoraz?
Tento bool zelene. To je zvýraznená zelene, to kľúčové slovo známe ako bool, ktorý je dátového typu.
To nie je to, postavený v roku pre všetky verzie C.
Musíte zahrnúť konkrétne knižnicu.
V našom prípade, som zahrnul CS50 knižnicu tak, že máme prístup k bool.
Ale v riadku 18, sa zdá, že majú logickú hodnotu tu nazýva vďačný.
Mohol som volal to niečo, ale ja som to nazval vďačný
len druh vysvetliť nejaký sémantický význam.
Tak spočiatku na linke 18, nie som zrejme vďačný
pretože Boolean hodnota vďačný je inicializovaný na hodnotu false v riadku 18.
A potom sa zdá, to, čo som tu urobil v riadkoch 21 až 23
je, že som to jednoducho prepísať môj logiku.
Takže nie funkčne odlišná, ale v riadku 22 teraz či int používateľ poskytol
je väčšie ako 0, potom som jednoducho zmeniť hodnotu vďačný true.
A prečo som to urobil? Vzhľadom k tomu, v súlade 25, zrejme budem kontrolovať stav.
Do tejto slučky, zatiaľ čo vďačná je false.
Tak som navrhol ako alternatívu k verzii 1
pretože je to aspoň trochu viac intuitívne možno, že je to trochu viac uzemnený v angličtine.
Takže urobte nasledovné, keď si nie ste vďační, alebo keď vďačný je false.
A aj tentoraz som zrejme nezaujíma spomenúť, čo užívateľ napísal v
pretože oznámenie nie je premenná n, takže vlastne, malá biela lož tam.
>> Funkčne je program trochu iný, akonáhle sa dostaneme na dno toho
Pretože nie som si spomenul, čo n je.
Ale ja som chcel ukázať aj tu, že aj keď sme videli GetInt
a GetString sa používa na pravej strane rovná sa tak ďaleko
tak, že si pamätáme hodnotu, technicky, to nie je nevyhnutne nutné.
Ak z nejakého dôvodu jednoducho nezaujíma uložiť hodnotu,
si len chcete skontrolovať hodnotu, zistíte, že môžeme jednoducho napísať toto ako GetInt,
open parenie, close párenie.
Táto funkcia bude vracať hodnotu, ako sme hovorili.
Bude to vám späť int.
A tak ak ste psychicky myslíte že sa to stáva,
keď som zadajte 99, GetInt vráti číslo 99,
a tak koncepčne, je to ako by môj kód bol v skutočnosti to.
Takže ak 99 je naozaj väčší ako 0, potom vďačný stáva pravdou,
potom sa zoradia 25 uvedomí ooh, už sme to urobili, lebo som teraz vďačná,
a je v súlade 26, sme jednoducho povedať: "Vďaka za pozitívne celé číslo!"
čo sa to stalo, že je.
Teraz sa poďme urobiť mierny syntaktickú cukor tu, aby som tak povedal.
Poďme sa pozrieť, či sa nám podarí vyčistiť tento riadok 25 s touto treťou a poslednou variante v positive3.
>> Všimnite si, jediný rozdiel je, čo riadok kódu? >> [Študent] 25. >> [Malan] Jo, 25.
A sme naozaj videli túto trik ešte nie, ale my sme to vidieť výkričník v pondelok,
ktorý označuje, čo? >> [Študent] Not. Nie je >> alebo negácie.
Tak sa boolovská a otočiť jeho hodnotu.
Pravda sa stáva false, false sa stáva pravdou.
Takže to, navrhujem, je ešte trochu viac intuitívne spôsob, ako písať kód
pretože som stále ešte inicializovať vďačný false, stále to nasledujúce,
Nastavil som vďačný na hodnotu true, keď príde čas,
ale teraz môžete naozaj len preložiť tento kód slovne zľava doprava,
while (vděčná!), pretože bang alebo výkričník označuje pojem nie je,
takže aj keď nie je vďačná.
Takže znova, sme nezaviedli žiadne nové koncepty na sebe.
Hovorili sme o Booleans späť, keď sme hrali s Scratch,
ale uvedomiť, teraz môžeme len začať písať náš kód v mnohých rôznymi spôsobmi.
Takže najmä v pset1 ak ste trochu snaží prísť na to, ako písať nejaký program,
Diskusné ste šťastie, pretože tam môže byť ľubovoľný počet riešení
že sa môže stať na.
Napríklad, je to len 3 ani pre najjednoduchšie programov. Dobrá.
A teraz odvoláva na pondelok sme opustili na túto nôtu s návratových hodnôt.
Takže prvýkrát sme napísali program, ktorý nie je len mať hlavné;
má tiež svoju vlastnú funkciu, ktorá som napísal tu.
Takže v súlade 31 až 34 som vykonala kocky funkciu.
Nie je to zložité. Je to len * a * v tomto prípade.
Ale čo je dôležité, na tom je, že som pri vstupe vo forme
a ja sa vraciam výstup v podobe **.
Takže teraz mám možnosť, rovnako ako som sa prinf osamotený,
volanie tejto funkcie volaním kocky funkcie.
>> A kocky funkcie má nejaký vstup, a kocky vráti funkcia nejaký výstup.
Naopak, printf len niečo urobil.
To sa nič nevracia, že sme záležalo, aj keď, ako zrušiť to vráti hodnotu;
stačí zvyčajne ignorovať.
Printf len niečo urobil. To malo vedľajší účinok tlače na obrazovke.
Naopak tu, máme kocky funkciu, ktorá skutočne vráti niečo.
Takže pre tých, ktorí poznajú toto, je to pomerne jednoduché nápad.
Ale pre tých menej oboznámení s touto myšlienkou odovzdávanie na vstupoch a dostať späť výstupy,
Skúsme len niečo super jednoduchý.
Je niekto pohodlný prichádza na pódium krátko?
Musíte byť pohodlné s kamerou na vás rovnako. Jo? Dobre.
Ako sa voláte? >> [Študent] Ken. >> Ken. Dobrá. Ken, ísť hore.
Ken bude funkcia druhov tu.
Poďme ďalej a urobiť to. Poďme si trochu fantázie.
Rád Vás vidím. Vitajte na stredu záujmu. Dobrá.
Ideme na toto tlačidlo tady. Dobrá.
Tak tu máte moderný tabuľu,
a čo som ich hlavné funkcie, napríklad,
a ja nemám iPad v ruke.
>> Nemám naozaj spomenúť, ako sa - No, nemôžem povedať, že.
Ja naozaj nemám dobrý rukopis,
a tak preto chcem tlačiť niečo na obrazovke pre mňa.
Som bol hlavný program, a ja budem musieť povedať to
písomne ​​v mojom kuracím začiatku a potom odovzdá vám vstup.
Takže hlúpe hoci toto cvičenie je, pojem funkcií a volanie funkcie
a vrátenie funkciu naozaj scvrkáva na to.
Ja som hlavné, som práve napísal printf, quote-koniec citátu niečo na obrazovke,
Som spustenie tohto programu, a akonáhle printf volaná,
trvá jeden argument, alebo jeden parameter niekedy medzi úvodzovkami.
Tu je to, že argument. Ja odovzdaním do Ken.
Je to čierna skrinka písomnej určitý počet rokov ago
, Ktorý zrejme vie, ako tlačiť veci na obrazovke.
Tak vykonať.
To nie je zlé. Very good.
Takže teraz Ken sa vykonáva spustením. Vie potrebné Podaj mi niečo späť?
Nie, že sme videli doteraz.
Opäť platí, že printf sa skutočne vráti číslo, ale budeme ignorovať, že pre túto chvíľu
pretože sme nikdy používal to. Tak to je to pre Kena.
A tak teraz hlavné preberá kontrolu programu znova
preto, že riadok kódu, printf, sa vykonáva spustením.
A ideme o našej ceste, ktorou sa vykonávajú bez ohľadu na iné linky sú tam.
Takže teraz skúsme trochu iný príklad.
Tentoraz tu poďme sa najprv vymazať obrazovku, a tentoraz budeme robiť Cubing funkciu,
ale tentoraz som očakávať, že výstupné hodnoty.
>> Tak poďme do toho a urobiť to.
Teraz mám riadok kódu, ktorý hovorí, že x dostane kocku x.
Riadok kódu, stiahnutie, vyzerá takto: x = kocka (x);
Tak ako sa to bude fungovať? Poďme ďalej a dá vám bielu obrazovku znova.
Chystám sa napísať teraz hodnotu x,
ktoré v tejto chvíli sa stane, že je, povedzme, 2, aby to jednoduché.
Napísal som na kus papiera hodnota 2, čo je moja hodnota x.
Podal som ju Ken. >> A ja len napísať odpoveď? Jo >>, poďme stačí napísať odpoveď.
Dobre. A teraz sa musí vrátiť mi niečo. Perfect. Pekný SEGUE.
Takže teraz podá mi hodnotu 8 v tomto prípade, a čo s tým mám robiť?
Vlastne - uvidíme, si toto právo. Čo mám robiť s tým?
Teraz budem brať túto hodnotu a skutočne ukladať ho v rovnakých bitov v pamäti.
Ale nevšimol som trochu zápasí tu.
Som trochu zmätený, pretože kam som vlastne písať hodnotu x,
pretože to, čo som práve urobil, je fyzicky ručne Ken kus papiera, ktorý mal hodnotu 2,
ktorý bol x, a naozaj, to je presne to, čo sa stalo.
Tak to dopadá, že pri volaní funkcie a odovzdáte v argumente
ako hello, world alebo predáte argument ako 2,
všeobecne, ste odovzdaním kópie tohto argumentu.
A tak rovnako ako som napísal číslo 2 tu a podal ho Ken,
že musí znamenať, že som ešte kópiu hodnoty 2 niekde
pretože to naozaj, teraz, keď som sa dostal späť hodnotu 8, musím sa vrátiť do RAM
a skutočne zapísať 8, kde som kedysi mal číslo 2.
Takže vizuálne, zapamätať si túto predstavu odovzdaním, doslova, kópiu hodnoty.
>> Ken robí to jeho vec, podá mi niečo - v tomto prípade hodnotu ako 8 -
a potom som musel urobiť niečo s touto hodnotou, ak chcem, aby to okolo.
Takže toto všetko vráti sa až príliš dobre, než dlhý.
Mockrát vám ďakujem za túto demo tu, Kena. [Potlesk]
Veľmi dobre.
Poďme sa pozrieť, ako to nakoniec sa vzťahuje k niektorej z volania funkcií, ktoré sme už tu.
Nechaj ma ísť napred a priviesť nás späť k Cubing napríklad tu.
Všimnite si, že ak chceme, aby skutočne začať užívať to ďalej,
budeme musieť byť si vedomý skutočnosti, že číslo x, ktorá je momentálne prešiel v tu
sa líši od toho, čo je skutočne odovzdaný do funkcie.
Takže znovu, je toto heslo by kópia sa stane celkom German za chvíľu.
Poďme sa pozrieť na niečo, čo nie je úplne správne pracovať ešte.
Chystám sa ísť dopredu a otvorte tretiny buggy príklad, ktorý je chybný povahy,
a je to tzv buggy3 a implementuje vymieňať funkciu.
Tu máme hlavnú funkciu, ktorá x a y ľubovoľne inicializovaný 1 a 2, resp.
Mohli by sme použiť GetInt, ale my jednoducho potrebujeme jednoduché cvičenia,
takže je to pevne ako 1 a 2.
V riadkoch 21 a 22, my zrejme vytlačiť X a Y, 1 na riadok.
Potom na linke 23, tvrdím ja vymieňať tieto hodnoty, bodka, bodka, bodka.
Aj zdanlivo zavolať funkciu v súlade 24 tzv swap, ktorý trvá 2 argumenty.
Je to úplne dôveryhodne pre funkcie, aby sa 2 argumenty. Videli sme printf to už.
>> Takže výmena zrejme trvá x a y, a ako už názov napovedá,
Dúfam, že to bude vymeniť tieto 2 hodnoty.
Tak som tvrdiť, on-line 25 "vymenil!" a ja dotlač x a y
za predpokladu, že som naozaj bol vymenil.
Ale keď som vlastne tento program spustiť - dovoľte mi, aby som otvoriť okno terminálu,
dovoľte mi, aby som buggy3 - ako už názov napovedá, je to neskončí dobre
pretože keď som Enter, zistíte, že x je 1, y je 2,
a napriek tomu na konci programu, sú stále ešte v skutočnosti, rovnaký.
Takže na základe preukázania práve s Kenom, čo sa vlastne deje?
Poďme sa ponoriť do tohto swapu funkcie. Je to super krátky. Je to len pár riadkov kódu dlho.
Ale čo je to zásadný problém založený na jednoduchom príbehu povedal sem s Kenom?
Prečo je výmena chybné?
[Študent] Ste ukladanie na kópiu, nie premenné.
Presne tak. Sme ukladanie na kópiu, nie je premenná sám.
Inými slovami, swap zrejme trvá 2 argumenty, int,
a to ľubovoľne nazýva a a b,
a tu som prešiel v X a Y, ktoré sú príslušne 1 a 2,
ale ja nie doslova okolo x, ja nie doslova prechádzať v y,
Ja som okolo kópiu X a kópie y.
Je to skoro, ako by si skopírovať a vložiť do swapu
hodnoty, ktoré chcete, aby skutočne manipulovať.
Takže ak je to ten prípad, kedy som sa štart programu vykonávajúci riadok 35 potom 36,
keď som si na riadku 37, v tomto bode v príbehu, čo je hodnota?
V tomto bode príbehu, linka 37, aká je hodnota v tomto bode? >> [Študent] 1.
[Malan] To by malo byť len 1, vpravo, pretože x je odovzdaná ako prvý argument,
a táto funkcia jednoducho svojvoľne volá svoju prvú argument je.
Podobne je y druhý argument, a to je len svojvoľne volá druhý argument b
>> Táto dichotómia je vlastne celkom jednoduché vysvetlenie. Premýšľajte o tom.
Nikto z nás sa stretol osobu, ktorá napísal printf,
tak isto, on alebo ona nemá tušenie, čo naše premenné o 30 rokov neskôr sa chystáte byť nazývaný.
Takže tam musí byť rozdiel medzi tým, čo hovoríte premenné vo funkciách píšete
a čo hovoríte premenné vo funkciách voláte alebo pomocou.
Takže inými slovami, napísal som svoje premenné ako x a y,
ale ak napísal niekto iný odkladací funkciu, on alebo ona určite nebude vedieť,
čo moje premenné sa bude nazývaný,
takže si uvedomiť, že to je dôvod, prečo ste túto dualitu mien.
Technicky, som mohol robiť to náhodou,
ale stále by byť predávané ako kópia.
Bolo by to čisto náhoda, esteticky prípade, že osoba, ktorá napísala swapu
použil rovnaké názvy.
Takže v tomto bode príbehu, linka 37, je 1, b = 2, a teraz mám postupovať, aby swap.
Najprv mi dovoľte, aby som vlastne robiť to oveľa jednoduchšie.
Ja neviem, čo tie 3 riadky kódu robia.
Dovoľte mi, aby som to: b =, = b; urobil.
Prečo je tento zlomený, logicky?
Je to druh intuitívne vec, nie?
Tak sa stáva b a b stáva,
ale problém je, že akonáhle linka 37 vykonáva, čo je hodnota a b?
Rovnaký, 1, pretože ste clobbered, aby som tak povedal, ste zmenili b rovnať.
Takže akonáhle linka 37 vykonal, to je skvelé, máte teraz 2 kópie číslom 1
Vnútri tejto funkcie, takže potom, keď povieš v súlade 38 = b,
ste trochu skrutkované, pretože ste práve priradenie 1-1.
Ste trochu stratila hodnotu, ktorú záležalo.
Takže v pôvodnej verzii tohto, zistíte, čo som urobil.
Som miesto toho mala tretina riadok kódu, ktorý vyzeral ako toto.
Prehlasujem, dočasnú premennú.
>> Tmp je veľmi všeobecný názov pre dočasné premenné, a to int
preto, že musí zodpovedať tomu, čo chcem urobiť kópiu.
Aj uložiť kópiu vnútri tmp, tak raz linka 37 je vykonaný,
hodnota je - rýchla príčetnosť kontrola - 1, hodnota b je 2,
a hodnota tmp je tiež 1.
Takže teraz som spustiť linku 38.
Akonáhle linka 38 vykoná, má na hodnotu b A b je 2, takže je teraz 2.
Takže v tomto bode príbehu, je 2, b je 2, a tmp je 1,
takže teraz logicky, môžeme len PLOP TMP je hodnota do B a sme hotoví.
Takže sme vyriešili tento problém.
Bohužiaľ, keď som spustiť tento program v tejto podobe, to robí nie vlastne zameniť žiadne hodnoty.
Ale aby bolo jasno, prečo?
Opravil som logický problém z pred chvíľou,
ale zase, keď som spustiť tento program, x a y sa nemení
do konca programového poprave.
[Nepočuteľné Študent komentár] >> sme vrátili nič, tak je to pravda.
Ale ukazuje sa, že je tu trochu problém, pretože tu doteraz,
Jediné, čo sme boli schopní sa vrátiť, je jedna vec, a to je obmedzenie C.
Môžete vrátiť iba skutočne jednu hodnotu, v tom prípade som trochu trčať
pretože som sa mohol vrátiť novú hodnotu x alebo by som mohol vrátiť novú hodnotu y,
ale ja chcem obaja staré.
Takže návratu nie je jednoduché riešenie tu.
Ale problém zásadne je dôvod, prečo? Čo sme vlastne vymenili?
[Študent] a, b >> A b
Ale aj b sú kópie x a y, čo znamená, že sme práve urobili všetky tieto práce,
sme trávili práve 3 minút hovoriť o virtuálnej funkciu a všetky 3 týchto premenných,
a to je skvelé, úplne správny izoláciu,
ale A a B je rozsah len je v týchto líniách tu.
>> Tak ako pre sláčiky, ak ste deklarovať integer aj vnútri slučky for,
podobne, ak ste sa prehlasuje, a b vnútri funkcie, ktoré ste napísal,
sú platné iba vo vnútri tejto funkcie, čo znamená, že akonáhle swap je vykonané spustenie
a pôjdeme r 24 až líniu 25, x a y sa nemení vôbec.
Práve ste zbytočne veľa času vymieňať kópie premenných.
Tak to dopadá, že riešenie je to vlastne non-zrejmé.
To nie je úplne dostačujúce pre návrat hodnoty, pretože sa môžeme vrátiť iba 1 hodnotu,
a ja naozaj chcem vymeniť oba X a Y súčasne dobe,
takže budeme musieť vrátiť k tomu.
Ale teraz si uvedomiť, že táto otázka zásadne odvodený od skutočnosti, že a a b sú kópie
a sú vo svojom vlastnom rozsahu.
Skúsme vyriešiť tento nejakým spôsobom.
Dovoľte mi, aby som skutočne prejdite sem a otvoriť, povedzme, štvrtina variantu tohto, buggy4.
Čo treba toto?
To je podobný, ale jednoduchšie problém pozrieť sa na predtým, než sme sa stab na jeho vyriešenie.
Tento program sa nazýva prírastok, a to zrejme inicializuje celé číslo x na 1 v riadku 18.
Aj potom tvrdí, x je 1, potom som si tvrdiť, "Zvyšovanie ..."
Potom som zavolať prírastok, ale potom v riadkoch 22 a 23, tvrdím, že to bolo zvýšené,
Tvrdím x je teraz, čo to je - 2, pravdepodobne - ale tento program je buggy.
V čom je problém?
Jo. >> [Nepočuteľné Študent odpoveď] >> Presne tak.
Takže x bol vyhlásený, samozrejme, na riadku 18.
To je vnútri zložených zátvoriek hlavné je.
Takže jednoduchá odpoveď je, že zatiaľ čo x existuje tu,
neexistuje v súlade 32, takže tento program vlastne sa ani zostaviť.
Kompilátor keď sa snažím zostavovaní tento kód bude na mňa kričať
o nejakej nelegálnej identifikátora alebo niečo v tom zmysle. V skutočnosti, skúsme to.
To je, aby buggy4. Tu to je.
Použitie nedeklarovaný identifikátor "x" v súlade 32.
A skutočne, buďme konkrétnejší tu dnes tak, že je to užitočné
v úradných hodinách aj doma.
>> Všimnite si, že je to trochu záhadne písomná.
Ale skutočnosť, že zvonenie je na nás kričali, riekol buggy4.c: 32:5, je v skutočnosti užitočné.
To znamená, že je chyba na riadku 32 na znaku 5.
Takže 1, 2, 3, 4, 5. To je, v skutočnosti, kde je problém.
A tiež, taky, majte na pamäti, úradné hodiny a doma, budem mať šťastie tu.
Mám jednu chybu. Bude to pomerne ľahko opraviť.
Ale ak sa dostanete celú obrazovku plnú ohromujúcich chybových správ,
znovu si uvedomiť, že najspodnejšej jeden by mohol byť len prejavom vrchný jedného.
Takže vždy naháňať svoje chyby zhora nadol
pretože tam môže byť len reťaz sedmokráska efekt
že navrhuje máte tak viac problémov, ako ste vlastne robiť.
Tak ako by sme mohli opraviť, ak je mojím cieľom zvýšiť x? >> [Študent] Urobiť x globálne.
Dobre, takže môžeme x globálne.
Poďme sa na zástupcu, ktorého som varoval už skôr, ale sakra, my jednoducho potrebujeme rýchlu opravu,
takže povedzme, že int x tu. To robí x globálne.
Takže teraz hlavné má k nemu prístup a prírastok k nemu má prístup,
a tak nechaj ma ísť napred a skompilovať to teraz.
Urobte buggy4, Enter. Zdá sa, že zostavenie teraz.
Poďme bežať buggy4. A zdá sa, že skutočne funguje.
To je jedna z tých vecí, ktoré je robia, čo hovorím, nie ako ja,
ako som práve urobil tu, pretože všeobecne
naše programy sa dostaneme oveľa zaujímavejšie a oveľa dlhšie, než to,
a ak vaše riešenie životných problémov je len dať všetky premenné v hornej časti súboru,
veľmi rýchlo sa programy sa strašne ťažké riadiť.
To je ťažšie vymyslieť nové názvy premenných,
je stále ťažšie pochopiť, čo je premenná robí to, čo,
a tak všeobecne, to nie je dobré riešenie.
Takže ideme na to lepšie.
Nechceme používať globálnu premennú tu.
>> Ja chcem zvýšiť x, takže som mohol, samozrejme -
na konci dňa, to je trochu hlúpe príbehu pretože práve to -
ale keď som nevedel o tom prevádzkovateľa, alebo som nesmel zmeniť v main sám,
ako inak by som mohol implementovať Ken tu tentoraz nie je kocka, ale môžete zvyšovať?
Ako môžem zmeniť túto vec tu? Jo.
[Študent] Pass v x a potom sa vrátiť [nepočuteľné] >> Dobre, dobre.
Tak prečo by som prejsť v X a potom sa skôr než ju vráti
prečo nie ja jednoducho vrátiť x + 1.
Pár ďalších vecí, musieť zmeniť tu. Som na správnej ceste.
Čo ešte musím trik? Niekto iný. Jo.
[Nepočuteľné Študent odpoveď]
Potrebujem zmeniť návratový typ prírastku, pretože to nie je neplatné.
Void nič neznamená sa vrátil, ale teraz jasne, že je,
tak to musí zmeniť - >> [študent] int.
int musí byť v súlade s tým, čo som vlastne vracia.
Teraz niečo iné je stále buggy tu. Jo.
[Nepočuteľné Študent odpoveď] >> [Malan] Tak som potrebné zvýšiť x?
[Nepočuteľné Študent odpoveď] >> [Malan] Aha, tak musím prejsť x.
Tak som potrebné urobiť tu. >> [Nepočuteľné Študent komentár]
[Malan] Tak prototyp, musím to zmeniť tu.
Tak to má stať int, to sa musí stať -
hmm, som skutočne chybu tu. Poďme opraviť tento prvý.
Čo by to vlastne byť? Je to byť int niečo.
Mohlo by to byť x, ale úprimne povedané, ak začnete volať všetky svoje premenné x,
to dostane menej a menej jasné, ktorý je ktorý.
>> Takže povedzme, ľubovoľne vybrať iný konvencie pre moje pomocné funkcie,
funkcie píšem. Nazveme to, alebo by sme mohli nazvať -
Hovorme tomu číslo ešte jasnejšie.
Tak som sa musel vrátiť, čo je číslo plus 1,
a teraz musím zmeniť 1 ďalšia vec, tu a ešte jedna vec tu.
Čo mám zmeniť na riadku 21 ako prvý? >> [Nepočuteľné Študent odpoveď]
[Malan] Mám priradiť ju k x. Nemôžem len tak zavolať prírastok (x).
Musím si pamätať odpoveď zmenou hodnoty x na ľavej strane.
A aj keď x je teraz na ľavej a pravej, že je úplne v poriadku
pretože pravá strana sa vykoná, prvý potom dostane zvalil do ľavého vec -
x v tomto prípade.
A potom konečne, je to ľahké opraviť teraz.
To by malo len odpovedať, čo je dole, int číslo.
Takže celá partia zmien pre naozaj stupídny funkcie
ale zástupca z vecí, ktoré budeme stále chcú robiť.
Tak, aby buggy4. Ja som podelal niekde.
Ach, môj Bože. Päť chýb v 6-line programu.
Takže to, čo sa deje na linke 18, znak 5?
Tak som si určil, že tento, int.
Poďme sa pozrieť,. Existuje celá partia ďalších chýb.
Ach, môj Bože - 19, 18, 21 - ale opäť, povedzme, vymazať obrazovku, Control L tu,
a znovu zvoniť.
Takže 5 problémov je vlastne len, že 1.
Tak teraz poďme bežať buggy4, Enter. Páni, je x bol zvýšený správne.
Dobrá. Akékoľvek otázky na to, ako zvýšiť počty? Jo.
[Nepočuteľné Študent otázka] >> Dobrá otázka.
Ako to, že som si len zmeniť x na číslo a program bude ihneď vedieť?
>> Opäť, myslite na to, ako túto abstrakciu.
Takže keď som hlavnej a Ken je prírastok, úprimne povedané, je mi jedno, čo Ken volá jeho iPad.
Nezaujíma ma, čo hovorí niečo, čo má čo do činenia s jeho vykonávaním tejto funkcie.
Toto je implementačné detail, že som, hlavné, nemusíte sa starať o
A tak jednoducho mení dôsledne ju vnútri funkcie - číslo sem a číslo tu -
je všetko, to trvá tak dlho, ako som prekompilovať.
Je to niečo ako keď si myslíte, že o tom mnohí z nás, tých z vás, vodičských preukazov
ktorí riadia, alebo ak ste dokonca riadený v aute,
väčšina z nás nemá potuchy, ako auto funguje pod kapotou.
A doslova, keď otvoríte kapotu, väčšina z nás - vrátane mňa -
sa nebude naozaj vedieť, čo sa pozeráme na,
niečo ako sa môžete cítiť s vecami, ako je toto teraz.
Ale my naozaj nemáme starať, ako auto funguje,
nemáme sa starať, čo všetko z tyčí a piestov a káblov vo vnútri vozidla
vlastne robia.
Takže niečo ako to, čo hovoríte piestu nezáleží tu v tomto prípade. Rovnaký nápad.
Jo. >> [Nepočuteľné Študent otázka]
Ak existuje viac použití variabilného chvíľu xa pred,
vy, programátor, by museli zmeniť je všade.
Alebo by ste mohli doslova robiť Súbor, Ponuka, a potom Nájsť, Nahradiť - niečo také -
ale budete musieť urobiť týchto zmien sami.
Musíte byť v súlade. >> [Študent] Ak existuje viac premenných [nepočuteľné]
Najmä, aby ako tu, keby to bola int iné číslo? >> [Študent] Správne.
[Malan] Jo. Objednajte záleží, keď voláte funkciu.
>> Takže ak by som sa volať prírastok tu niečo niečo čiarka,
je tu priame mapovanie.
Prvá premenná, ako sa to volá, je vyrobený kópiu prvého argumentu sem.
Prepáčte. To by nemalo byť zátvorka.
Druhý argument sa zoradia s druhým. Takže poradí, áno, záleží. Dobrá.
Prepáčte. Vzal som dlhú cestu, aby sa tam dostať. Ďalšie otázky? Dobrá.
Tak uvidíme, či nemôžeme namaľovať obraz o tom, čo sa vlastne deje
pod pokrievku, aby som tak povedal.
To je obdĺžnik, ktorý by mohol predstavovať pamäte počítača.
Aj keď nemáte tušenie, ako pamäť funguje a ako funguje RAM,
aspoň predpokladať, že máte kytice z nej v týchto dňoch.
Máš megabajtov to, máte gigabajty toho,
a my vieme, týždeň od 0, že byte je práve to, čo? >> [Študent] 8 bitov.
8 bitov, nie? Takže 8 nuly a 1.
Takže ak váš počítač má koncert RAM, 2 giga RAM v týchto dňoch,
máte miliárd 2000000000 bajtov pamäte alebo približne 8 miliárd alebo 16 miliárd bitov
vo vnútri počítača.
Na rozdiel od malého Chmýřitý napríklad Willy, to nie je magnetické častice obvykle už.
Stále väčšej miere - v notebookoch najmenej - to je SSD disky, SSD
že práve nemajú žiadne pohyblivé časti. Je to všetko elektronické. Je to všetko elektriny založené.
Takže myslíte, že z tohto obdĺžnika, ako len zastupujúci 1 alebo 2 GB pamäte, ktoré máte.
>> Takže je to kus pamäte.
Svet počítačovej vede nejako rozdelený off
kúsky pamäti robiť rôzne veci.
Napríklad, ak je to vášho počítača RAM, ako navrhol obdĺžnika,
ukazuje sa, že podľa konvencie, v hornej časti pamäte RAM, aby som tak povedal,
je všeobecne to, čo sa nazýva textový segment.
Tí sú 0s a 1s, ktoré ste zostavili.
Takže keď sme sa pozrel pod pokrievku, čo a.out je,
všetky tieto 0s a 1s, pri spustení programu,
tie 0s a 1s sú načítané z vášho pevného disku do niečoho s názvom RAM,
a v RAM to dali na vrchole.
Medzitým, budete mať iné veci: inicializovať dát, inicializáciu dát.
Tieto 2 riadky pamäti odkazujú na globálne premenné, ktoré nie sú často používajú
ale niekedy, keď to urobíte, skončí tam rovnako.
Potom je tu niektoré ďalšie veci: premenné prostredie, ktoré nebudeme tráviť toľko času na,
ale potom 2 dôležité veci, ktoré sa vrátia v priebehu semestra,
zásobník a halda.
Takže väčšina pamäte počítača je vyhradený pri spustení programu
pre takzvaný balíček, a niečo, čo nazýva haldy.
Nebudeme hovoriť o haldy dnes, ale budeme hovoriť o zásobníka.
Zásobník je určený na vykúzliť vizuálne z jedálne zásobníkov haly jedlo v Mather dome
alebo tam, kde sa stalo, že tam, kde jedáleň pracovníci čistiť každý deň,
oni vyskladať až od podlahy nahor,
a podobne, v pamäti, že je to myšlienka na niečo na zásobníku,
uvedenie niečo na stacku, uvedenie niečo na zásobníku.
A čo máme na mysli toto?
>> Poďme zväčšiť iba na dolnej polovici obrázku, pamäte RAM vášho počítača,
navrhnúť nasledujúce.
Ukazuje sa, že pri spustení programu, ako je a.out alebo Hello -
bez ohľadu na program, je to, že ste napísali -
znovu, 0s a 1s tie sú načítané z vášho pevného disku, ktorý je dlhodobé skladovanie,
zostane tam, aj keď zatiahnite za konektor, vloženého do pamäte RAM.
RAM je rýchlejší ako pevné disky - je to menšie, než pevné disky -
ale to je miesto, kde žijú programy, zatiaľ čo vy používate je.
Takže ste dvakrát kliknite na program, na Mac alebo PC, je načítaná z pevného disku do operačnej pamäte RAM.
Akonáhle je načítaný do RAM, 0s a 1s go na ceste hore,
tzv texte segment, ale potom, akonáhle váš program v skutočnosti spustí,
hlavná funkcia je volaná, a hlavné, ako sme videli, často lokálne premenné,
a to má ints a reťazce a pripaľuje a podobne.
Takže ak váš program, ktorý ste napísali, alebo program, ktorý ste poklepanie
používa niektoré premenné vnútri of main,
skončí na dne svojho stacku pamäti, aby som tak povedal.
Konkrétnejšie, čo to vlastne znamená?
To jednoducho znamená, že ak sme sa chystali počet bajtov pamäte RAM v počítači,
si všimnúť, že to môže byť bajt číslo 0, môže to byť byte číslo 1, 2, 3, 4, 5, 6,
celú cestu až 2 miliardy by sa celú cestu tam hore.
Takže inými slovami, keď hovoríme o pamäti RAM alebo pamäte, pokiaľ ide o bytoch,
Znamená to, že sa niekto rozhodol, čo očíslovať každý z týchto blokov pamäte.
Takže keď budete potrebovať 32 bitov na int alebo budete potrebovať 8 bitov pre char,
kde sa im skončí v pamäti?
>> Koncepčne, jednoducho skončí na konci tejto veci zvanej zásobník.
Ale čo je zaujímavé, teraz je, keď hlavné volá funkcie -
Predpokladám, že funkciu nazvanú foo, len ľubovoľný názov -
čo sa stane, je hlavné je v dolnej časti tohto zásobníka pamäte;
foo teraz je kladený na vrchole hlavnej pamäte.
Takže nejaké lokálne premenné, ktoré foo má skončiť druh pojmovo vyššia než v hlavnom.
Ak foo volá inú funkciu nazvanú bar, tieto premenné skončí tu.
Ak bar volá niečo iné, tu, tu, tu.
Takže to, čo je na tom zaujímavé spustenie programu je to, že ako volať funkcie
a keďže tieto funkcie volať funkcie a ako tieto funkcie volať funkcie,
si vybudovať tento balík funkcií v pamäti.
A len raz za funkcie vráti sa môžete začať sa, že pamäť vrátiť.
Takže jedným z najjednoduchších spôsobov, ako beží z pamäte v počítačovom programe
je písať funkcie, ktoré sa nikdy nevráti.
Tak napríklad, poďme preukázať až sa úmyselne buggy programu.
Nechaj ma ísť napred a nenechám # include ,
int main (void),
a budem robiť, keď (2> 1), ktorý pravdepodobne nebude nikdy meniť na nás,
a nechaj ma ísť napred teraz a robiť printf.
Vlastne, že to bude menej vizuálne zaujímavé. Poďme to.
Pre int i = 0; i> 0 - poďme urobiť rovnakú chybu - i + +.
A nech to nie je printf tu. Poďme praktizovať to, čo som kázal.
Poďme mať metódu tu, void refrén, a povieme int i,
a potom som chcel povedať printf - nie, poďme urobiť to zaujímavejšie.
Poďme vlastne nevytlačí vôbec nič. Povedzme to: chorus (i).
Dobrá. Tak to je buggy pretože prečo?
Ja som to vymyslela, ako som ísť, pretože program nie je vlastne robiť niečo zaujímavé.
>> Ale to nie je cieľom.
Cieľom je napísať program, ktorého hlavnou funkciou je čo robí, očividne?
Zavolajte sám. A skutočne, nepotrebujeme slučku.
Poďme ešte zjednodušiť tým, len tak, aby sme nestratili zo zreteľa naozaj základné chybu.
Hlavné vyzýva zbor spievať nejaký refrén,
potom som urobil niečo hlúpe, a mal som refrén refrén volania
pretože som predpokladal, niekto iný sa bude implementovať možná,
a teraz to nebude zostavovať ešte. Musím urobiť, čo?
Potrebujem prototyp, nezabudnite.
Tak som potrebné mať tu void chór (int i);
Takže teraz keď idem tu - v skutočnosti, poďme použite väčšie okno.
Poďme ďalej a urobiť zbor.
Použitie nelegálnej identifikátor i
Oh, to bolo hlúpe. Nepotrebujeme argument. Jednoducho to.
Želám si, aby sme začali týmto spôsobom. Bolo by to oveľa jednoduchšie program písať.
Tam. Teraz poďme na moju terminálovom okne, spustite rinčať, a ideme na to.
To bol naozaj rýchly.
Čo sa vlastne práve stalo, keď?
No, teraz budem pridávať tlačovú linku, takže môžeme vidieť.
Dovoľte mi, aby som printf ("Som tu") - žiadne premenné. Necháme to takto.
Dovoľte mi, aby som znovu spustiť make. Dovoľte mi, aby som znova spustite refrén.
A ... no. Len tak ďalej.
Ako stranou, prečo sa nezrútil?
Segmentation fault stalo super rýchly predtým.
[Nepočuteľné Študent odpoveď] >> Presne tak. Tak to trvá dobu tlače, že jo?
Je to len má viac práce na počítači v rámci.
A je to tu: Segmentation fault.
>> Tak zistíte, ako rýchlo programy beží.
Ak si nie ste tlače nič, super rýchly.
Ale my stále túto Segmentation fault, pretože to, čo sa deje?
Ak si myslíte, že o tom, ako je váš počítač pamäť stanovený,
to sa stane byť hlavnou, ale tu poďme nazývať refrén, a hovorme tejto chór.
A teraz keď to urobím svoje estetiku právo, je to len povedať chorus, chorus, chorus,
chorus, chorus, chorus, chorus, do najmenších podrobností, a nakoniec, čo sa bude diať?
Ak veľký obrázok, doslova, je to, čo sa práve deje koncepčne?
V zásobníku prekročení haldy.
Alebo ešte horšie, stačí prekročení všetko, vrátane textového segmentu,
ktorý je 0 a 1, ktoré predstavujú svoj program.
Stručne povedané, je to proste super, super zlý.
Váš program sa vymkla kontrole.
Používate spôsobom viac pamäte, ako ste zamýšľali
všetko kvôli hlúpe chyby v tomto prípade,
alebo v tomto prípade veľmi zámerne vykonáva funkcie volať seba.
Teraz, to nie je tak zlé.
Funkcia volania sa vlastne má veľkú silu, keď ju použijete správne.
Osobne som nepoužil správne tu.
Takže to nie je zase tak zlé, ale fakt, že som vlastne nikdy prestať volať sám
je základná slabina tu tohto programu.
Tak kam ideme s tým všetkým? Čo sa vlastne deje?
Keď hovorím prírastok funkcie, ako sme robili v tých príkladoch,
Mám hodnotu ako 1, že som sa prejsť dovnútra
Aj odovzdať kópiu čísla 1, tak sa stane nasledujúce.
Poďme do prírastku príklade, ten chlap tamto.
Tu je to, čo sa vlastne deje.
Keď som sa zavolať prírastok a ja odovzdať x, obrazovo, čo sa deje tu, je to.
>> Ak budem mať hodnotu 1 uloženú tu a ja som vlastne volať prírastok,
ktorá sa teraz nazýva zbor - iPad hádže ma tu.
Hovorme tejto prírastok, a my nevieme, čo to ďalšie funkcie bude.
Takže čo sa vlastne deje, je tu niekde v hlavnej mám kus pamäte
, Ktorý je ukladanie číslo 1.
Keď hovorím, prírastok, ja som s použitím iného kus pamäte,
ale teraz mám kópiu 1.
Keď som zvýšte túto hodnotu, to sa stáva 2,
ale čo sa stane potom, akonáhle prírastku vráti?
Táto pamäť len dostane odovzdaný späť do operačného systému,
čo znamená, že všetko, čo ste urobil, je nič užitočného.
1, ktorá bola pôvodne obsiahnutá v main je stále v skutočnosti neexistujú.
Tak kam pôjdeme s tým?
Ukazuje sa, že v pamäti máte túto back-to-back postupnosť bajtov
ktoré si môžete dať veci do, a ukázalo sa, že sme už videli niečo
ktorá zahŕňa uvedenie veci späť k sebe k sebe dozadu.
Čo je reťazec založený na týždeň 1 a teraz týždeň 2?
Je to len zbierka postáv.
Tak to dopadá, rovnako ako si môžete dať čísla v pamäti,
podobne si môžete dať znaky v pamäti.
A akonáhle začneme putting znaky v pamäti chrbtom k sebe k sebe na chrbát,
ukazuje sa, že s najjednoduchšie veci, ako na vedenie alebo slučky while,
môžeme určiť iteráciou zľava doprava cez znaky v reťazci
a začať masírovať do rôznych postáv úplne -
sa môže stať b, mohol b stať c -
takže nakoniec môžeme mať anglickú vetu, ktorá skutočne dáva zmysel
a previesť každý z týchto listov jeden po druhom
pešo cez našej pamäti počítača zľava doprava skutočne zašifrovať.
Takže poďme sa náš päťminútovú prestávku tu,
a až sa vrátime, začneme tento proces zakódovania informácií.
>> Dobrá.
Než sme sa ponoriť do nejakého crypto a tieto veci tzv pole,
dovoľte mi, aby som pauza pre prípadné otázky, pretože mám pocit, že som naozaj trochu zmätené
niektoré z týchto tém. Takže poďme opraviť hneď, či môžeme.
Práve sme hovorili o návratových hodnôt, sme hovorili o argumenty,
a hovorili sme o tomto pojme, ktorý sa vrátime v najbližších týždňoch,
nahliadnutie pamäte ako celú partiou týchto skladané zásobníkov, aby som tak povedal,
zdola nahor, tak, že každý zásobník, ktorý sa dal na stack
predstavuje funkciu, ktorá je v súčasnej dobe s názvom.
Nejaké otázky?
Dovoľte mi, aby som na niečo spýtať tu.
Dovoľte mi, aby som zjednodušiť to späť k tomu, čo bolo predtým, než niektoré z našich predchádzajúcich Q & A.
Skutočnosť, že prírastok má otvorené zátvorky, int číslo, uzavretá zátvorka -
čo int číslo predstavuje?
[Študent] argument. >> Argument. Dobre. Ale čo je to argument?
[Nepočuteľné Študent odpoveď] >> Čo je to? >> [Študent] Niečo, čo vám prejsť dovnútra
Dobre, tak niečo, čo vám prejsť dovnútra a všeobecnejšie, je to len vstup.
Ak ste písali funkciu a túto funkciu je zmysel života
je to niečo trochu iného každom použití ju,
potom by jediný možný spôsob, ako k tomu môže dôjsť skutočne sa zdá byť, aby to so vstupom
tak, že to môže urobiť niečo s tým vstupom zakaždým.
>> Takže budete musieť zadať dve veci, keď funkcia má vstup.
Musíte zadať meno, ktoré chcete, aby k tomuto vstupu
čisto pre svoje vlastné pohodlie, takže môžete odkazovať sa na to
vo funkcii, že vy sami píšete, ako som tu v súlade 32.
Ale tiež je potrebné zadať jej typ, pretože C je programovací jazyk
že len vyžaduje, že ak chcete premennú, budete musieť povedať počítači, čo dátový typ je,
z veľkej časti tak, že to vie, koľko bitov sa prideliť pre uvedené premenné
pretože by to mohlo byť 6 - sorry, to nebude 6.
To môže byť 16, môže to byť 8, môže to byť 32, a to aj 64,
ale počítač potrebuje vedieť.
Teraz int na ľavej strane predstavuje to, čo naopak?
[Nepočuteľné Študent odpoveď] >> Čo je to? >> [Študent] Typ funkcie.
Typ funkcie, a konkrétnejšie, typ svojej produkcie. Právo.
Takže vzhľadom k tomu, vec v zátvorke predstavuje jeho vklad, ak existujú,
vec vľavo predstavuje jeho výstupu.
A v tomto prípade, prírastok zrejme vráti int,
a tak int je návratový typ tejto funkcie.
Čo to znamená vrátiť?
Doslova, môžete použiť kľúčové slovo návrat a potom, ak ste, čo ste vracia
vpravo kľúčového slova je celé číslo,
potom je to skutočne v súlade s tým, čo sme sľúbili.
Dalo by sa to urobiť niečo také - ahoj, svet - pretože to je reťazec.
>> Je zrejmé, že sa nejedná o celé číslo.
Takže v skratke, záťaž je naozaj na nás, programátor, byť konkrétny
na to, čo sa vraciame a potom vlastne ísť o vrátení.
Kontext tu teraz je, že počítače pamäť je gigabyte, 2 GB -
čokoľvek - možno je to viac, možno je to menej,
ale počítač považuje to, že majú rôzne oddiely.
Niečo ide tam, niečo ide tam,
rôzne veci ide v stredu, a dnes sme jednoducho začať rozprávať príbeh,
ale vrátime k tomuto v priebehu času.
Pre túto chvíľu, len kúsok pamäte naozaj záleží, je text segmentu
preto, že práve predstavuje 0s a 1s, že zvonenie je na výstupe.
Takže pri spustení príkazu na klávesnici, ako a.out
alebo poklepaním na ikonu na Mac OS alebo Windows,
Váš program je nabitý z pevného disku do pamäte RAM
a to zvalil na vrchole RAM počítača, aby som tak povedal.
Medzitým, ako váš program spustí a hlavné volaná
v programe, ktorý písal alebo program Microsoft alebo Apple napísal,
ktorýkoľvek z jej lokálnych premenných skončí tam dole na dne pamäti vášho počítača.
Ale ak hlavné vyzýva ďalšie funkcie, ktoré samo o sebe má premenné alebo argumenty, ktoré skončili nad ním.
A ak táto funkcia volá niečo, oni skončia nad ním, nad ním, nad ním.
>> A iba raz funkcií sa vykonáva spustením sa zásobník zásobníkov, aby som tak povedal,
začať sa dostať nižšie a nižšie.
A to je to, čo potom, v kocke, vysvetľuje, prečo pri volaní kocku
alebo volajte prírastok, ste odovzdaním kópie hodnoty.
A čo to znamená, obrazovo je to, že ste doslova písanie číslo 1
v inej časti pamäte, meniace sa, že 1-2 v prípade prírastku
alebo na 8 v prípade kocky a potom hádzanie, že pamäť preč
akonáhle prírastku alebo vráti kocky funkcie. Otázka.
[Študent] Kde sú globálne premenné uložené?
Globálne premenné sú uložené v tom, čo sa v súčasnej dobe nazýva inicializovať dáta alebo neinicializovaný dát,
Rozdiel je, ak máte globálne premennú a priradiť ju okamžite hodnotu
s znakom rovnosti, že skončí na vrchole tam,
a ak si len povedať, int x, bez hodnoty, skončí o niečo nižšia v pamäti RAM
jednoducho konvencií.
Ďalšie otázky? Dobrá.
Takže tento obrázok vráti, ako sme si silnejší
s tým, čo môžeme robiť s počítačom,
ale teraz, poďme sa krátko intro na kryptografiu,
špecifický typ kryptografie, ktorá nie je vyriešiť všetky problémy sveta
ale vyriešiť niektoré z nich.
V tomto prípade tu máme niečo, čo nazýva tajný kľúč kryptografie.
Secret-kľúčové kryptografia, ako už názov napovedá, pochádza jeho zabezpečenia z tajomstiev.
>> Napríklad, ak ste boli späť na základnej škole a ste míňali malú tajnú milostný list
na chlapca alebo dievča ste drvili na, ak by ste chceli prejsť, aby na vedomie prostredníctvom publika,
pravdepodobne by sa napísať taký poznámku v angličtine alebo aký je váš rodný jazyk je.
Skôr, môžete zašifrovať, alebo môžete len poslať textovú správu v týchto dňoch.
Ale možno v skutočnosti odovzdať im odkaz v celej triede.
A k tomu bezpečne takým spôsobom, aby vaši priatelia a učiteľ
Neviem, čo píšete, môžete prísť s pomerne jednoduchým algoritmom,
mladý, že ste mohol byť, len ťahanice slová.
Takže namiesto písania môžete písať b,
miesto b môžete písať C,
miesto c môžete napísať d, a tak ďalej.
Alebo by ste mohli prísť s sofistikovanejšie preklade
listov do rôznych písmen.
Ale úlovok je chlapec alebo dievča, ktoré posielate na vedomie
potrebuje niečo vedieť, čo je to, čo, samozrejme? >> [Študent] Co posielate.
Aký je váš tajomstvo je, rovnako ako to, čo je, že mapovanie medzi tieto a B a C je a d's.
Je to len pridáva 1 pre každý z listov ísť z bodu A do B, B na C?
Je to zložitejšie, ako to?
>> Takže vy a vaša rozdrviť potrebujete mať túto tajnú informáciu,
ale je tu trochu catch-22 tu.
Ak je to vôbec prvýkrát, posielate milostný list prostredníctvom triedy,
Ako je to, že chlapec alebo dievča bude vedieť, čo je tajomstvo ešte je?
Takže tajný šifrovací kľúč nie je vyriešiť všetky problémy sveta,
a je to vlastne vzťah, tu sa vrátime k na semester konci.
Podobne sa väčšina z nás nevie niekto, že pracuje, napríklad na Amazon.com,
a napriek tomu mnohí z nás pravdepodobne kúpil veci na Amazon.com,
a my sme sa učili predpokladať, že tieto e-commerce transakcie sú bezpečné.
URL pravdepodobne hovorí https, je to možno hlúpa ikona visiaceho zámku niekde,
tam je nejaký druh kryptografie zabezpečenie informácií o kreditnej karte
medzi vami a Amazon.com.
A napriek tomu, ak kryptografie znamená vedieť, nejaké tajomstvo,
a napriek tomu som nikoho nepoznám na Amazon, a ja som rozhodne nie sú usporiadané akékoľvek tajomstvo
s niekým na Amazon, ako je môj počítač, alebo môj prehliadač robiť toto?
Ukazuje sa, že je to iné typy kryptografie celkom, že tento problém vyriešiť.
Ale pre dnešok, budeme sústrediť na jednoduchá
kde si môžete zariadiť v predstihu vedieť nejaké tajomstvo,
ako 1 alebo nejaké mapovanie medzi tieto a b je.
A proces kryptografie všeobecne zahŕňa to.
Máte nejaký obyčajný text, je znázornené tu na ľavej strane,
ho spustiť cez nejaký druh algoritmu alebo postupu pre šifrovanie ho -
Možno, že to len stane b, b stáva c -
a potom skončiť s ciphertext.
Medzitým, akonáhle váš rozdrviť dostane túto tajnú poznámku,
on alebo ona má potom dešifrovať to tým, že všeobecne zmeny tohto algoritmu
tak, ako sa dostať späť obyčajný text.
Tam sú fyzické inkarnácie tohto.
>> Napríklad, to je malé tajomstvo dekodér krúžok,
a to je krúžok v tom zmysle, že sú dva vytočí tu.
Na vonkajšej okraji tejto veci, je tu písmená A až Z,
aj keď to v náhodnom poradí,
a na vnútornej strane, je to vlastne niektoré čísla
tak, že sa tento prsteň môžete druh obrátiť zvonku, ale nie v
aby sa zoradia čísla s písmenami.
Z filmu s názvom Vianočný príbeh, budete vidieť, že malý Ralphie
bol tak dychtivý zistiť, čo Little Orphan Annie tajný odkaz bol pre neho
ktoré boli odovzdané, myslím, vo forme číselných správ na obilnín krabici
a vy ste museli zhromažďovať všetky tie malé karty, ktoré boli dodané v krabici obilnín,
ste mali na e-mail je v, museli ste sa vrátiť tajný dekodér krúžok
takže si môžete konečne zistiť, čo je mapovanie medzi písmenami a číslicami
alebo písmená a písmená.
Ako v počítači môžeme ísť o zavádzanie alebo zastupujúce takéto veci?
Potrebujeme spôsob, ako vyjadriť seba trochu pružnejšie
ako naše premenné, doteraz dovolené.
Sme mali Ints, sme mali znaky, mali sme plaváky a dvojlôžkových a niekoľkými ďalšími,
ale tie sú jednotlivé kusy pamäte, ktoré nie sú naozaj nám umožňujú vyjadriť veci
ako slov a viet a fráz.
Naozaj, sme len také veci, reťazce,
ale sľubujeme, že je to naozaj len zjednodušenie v CS50 knižnici
že sme v úmysle šupkou späť.
A tak poďme začať robiť, že tu.
Nechaj ma ísť ďalej a otvoriť súbor -
Všetky tieto súbory sú k dispozícii, ako obvykle, online - tzv array.c
vyriešiť problém nesúvisí s reťazcami, ale že maľuje obrázok tu
o tom, ako by sme mohli použiť niečo ako pole.
>> Pole je dátový typ.
Je to typ premennej druhov, ktorý má viac menších dátových typov vnútri nej
chrbtom k sebe k sebe dozadu.
Tak napríklad, ak by sme chceli napísať malý program, ktorý vám dáva váš kvíz priemer
do kurzu ako 50, ktorý má 2 vypočúva,
môžete veľmi ľahko napísať tento program založený aj na niektoré z minulého týždňa materiálu
pomocou GetInt a pár premenných: int quiz1, int quiz2.
A je to celkom jednoduché.
Možno je to 10, 20 riadky kódu max vykonávať program
že žiada užívateľa o 2 kvízov skóre a potom vypočíta ich priemer
pridaním dohromady, delenie 2, a potom tlač výsledkov.
By sme pravdepodobne mohli urobiť celkom ľahko sa po nejakom počte minút.
Ale problém je, že predpokladám, že 50 mal 3 kvízy alebo 4.
Predpokladajme, že ste chceli použiť rovnaký program pre triedu, ktorá mala týždenný kvízy.
Premýšľajte o triedy, ktorá sa raz týždenne kvízy.
Ak je 16 alebo tak týždňov v semestri, teraz máte 16 premenných:
int quiz1, int quiz2, int quiz3, int quiz4.
Akonáhle začnete vidieť túto redundanciu, tento kopírovanie a vkladanie kódu,
by mala začať, aby sa vám, aby tu bolo lepšie spôsob.
A našťastie, pretože z polí je. Takže ideme na to.
Po prvé, dovoľte mi predstaviť veľmi jednoduchú vec, že ​​sme sa nepoužíva tak ďaleko,
ale uvidíte to občas v kóde.
>> To je to, čo sa všeobecne nazýva konštanta.
Takže je to konštanta v tom zmysle, že táto hodnota nikdy sa mení.
Ľudská konvencie pri vytváraní konštantný
ich používajú všetky veľké písmená len preto, že to naozaj vyniká v kóde,
a špeciálne kľúčové slovo, ktoré používate v C je # define.
Takže hovoríme # define, potom medzeru, potom slovo, ktoré chcete použiť pre konštantné meno
a potom je hodnota konštanty.
Všimnite si, že sa líši od priradenia niečo premenné.
Nie je znamienko rovnosti, nie je bodkočiarka.
To je to, čo je všeobecne známe ako preprocesoru smernice,
ale o tom až inokedy.
Pre túto chvíľu, to vytvára nemenný hodnotu s názvom kvízy
ktorého skutočná číselná hodnota je 2.
Takže kdekoľvek vidíte kvízy, kvízy, kvízy v tomto súbore,
že je to len číslo 2.
Keď sa pozriem na hlavnú teraz, poďme sa pozrieť, ako to funguje.
Najprv to vyzerá trochu záhadný, ale je to všetko veci od týždňa 1.
Požiadajte užívateľa, pre stupne. Ako to urobíme?
V riadku 22 - to je naozaj šťavnaté časť - Prehlasujem, plavák
ale nie len jediný plavák. Som prehlasuje, skôr pole s plávajúcou desatinnou čiarkou.
Že premenná bude nazývaný stupňa, ako vyplýva tu,
ale jediný kus novej syntax potom sú tieto hranaté zátvorky.
Skutočnosť, že som povedal, float stupňa a potom otvorte konzolu a potom rad -
výpovednej lehoty, ak je to konštanta je to rovnako ako sme to urobili -
to znamená, "Hey počítač, daj mi 2 plaváky a poďme spoločne nazývajú stupňa."
>> Toto je v kontraste k oveľa nudnejšie procesu, ako je toto: float grade1;
plávať grade2, a tak ďalej.
Takže poľa nám umožňuje realizovať túto myšlienku, ale oveľa menej ledabolo,
takým spôsobom, že môžeme napísať 1 riadok kódu miesto, povedať, 16 pre 16 týždňov semestra.
Nechcel som, aby hard-kód 2, pretože ak si myslíte, že o tom teraz logicky,
Predpokladám, že budúci rok CS50 zmeny 3 kvízy miesto
a mal som číslo 2 tu, mal som číslo 2 tu,
Mal som číslo 2 tu, číslo 2 tu.
To sa stáva veľmi únavné a veľmi ľahko pokaziť
a náhodne zmeniť hodnotu 1 až 3, a prichádza inú hodnotu 2.
Takže budem miesto abstraktné toto preč a použiť táto konštanta, ktorá,
ako už názov napovedá, sa nikdy nezmení.
A teraz bez ohľadu na to, či máme rôzne kvízy Tento rok alebo budúci rok,
Musím sa zmeniť v jednom mieste sa tu na vrchol.
Takže to je všetko, konštanta je.
Medzitým, nová pojmovým znakom je to, že z poľa.
Takže hranaté zátvorky mi toľko plaváky a ma nechá spoločne nazývajú stupňa tu.
Takže teraz sa pozrieme, čo budem robiť.
Tu v súlade 24 je začiatok slučky for.
>> To je naozaj nič vymysleného. Je to len pomocou kvízov miesto hard-kódované číslo.
Ale nič intelektuálne inak, tam z minulého týždňa.
To je len printf, takže printf ("Kvíz #% d% d:")
pretože ja len chcem vytlačiť daj mi kvíz číslo 1 z 2 a potom 2 z 2.
Tak toto je čisto estetického vec.
Ale zaujímavá časť je teraz v súlade 27.
Aby bolo možné vyplniť v jednom z dvoch zástupných symbolov s desatinnou hodnotou,
môžete znovu použiť hranaté zátvorky.
V tomto prípade, ja som s použitím aj preto, že to pre sláčiky začala s i rovná, akú hodnotu, zrejme?
[Študent] 0. >> [Malan] 0.
Tak na prvý iterácii tohto slučky, je to, ako som napísal v kóde,
ale na druhej iterácii tohto slučky, je to, ako som napísal vo svojom kóde.
Ale fakt, že som pomocou premennej je perfektný, pretože, ako už názov napovedá,
je to rôzne jej hodnotu na každej iterácii,
tak som vyplnenie tohto poľa jeden bod v čase.
Čo to pole vyzerá?
Dôvod, prečo som čerpal super jednoduchý obdĺžnik na obrazovke ešte pred Práve z tohto dôvodu.
Pole je len kus pamäte nasleduje ďalší kus pamäte
nasleduje ďalší kus pamäte, a tak ďalej.
Takže ak má pole je veľkosti 2 v tomto prípade tu, všetko, čo bude robiť
zadaním v mojich kvízov skóre ako tu - som 100 na toto a potom som dostal 99 na tento jeden -
potom táto pamäť nemusí byť použitý aj preto, že som sa len opýtal počítač
pre pole o veľkosti 2.
Tieto štvorce sú stále tam, že jo?
Stále máte 2 GB pamäte RAM, aj keď ste len otázkou na 2 plaváky.
Takže myšlienka polí je, že počítač jednoducho vezme kus pamäte
a potom rozdeľuje menšie kusy chrbtom k sebe k sebe dozadu.
A tak to je všetko, pole je.
>> Je to súvislá kus pamäte vnútri, ktoré si môžete dať veci.
To sa deje do tej doby predsa len trochu nudný aritmetiku.
Keby som prejdite tu, to je miesto, kde som sa potom určiť iteráciou cez pole.
Aj prichádzajú s súčtu všetkých hodnôt v poli,
a potom som používať koleso funkcie tu skutočne urobiť súčet deleno kvízy.
Ale dovoľte mi, aby som mávať ruku na to ako akýsi dosť aritmetiky pre teraz.
Ale všetko, čo robí pre mňa nakoniec je výpočet priemeru.
Takže prvý kvíz a druhý kvíz deleno 2 a potom tlač to ako int.
Ale poďme teraz prechod na iný príklad s názvom string1,
ktorý maľuje podobný obraz, ale pomocou reťazca.
Nechaj ma ísť napred a zjednodušiť tým, len na chvíľu.
Odpustite odsadenie pre teraz.
Oznámenie v súlade 19 tohto príkladu, mám reťazec od užívateľa.
Všimnime si ale to, čo som robil ďalší v radoch 22 vpred.
Ja som vlastne iterácie od i do - a to je nový trik - strlen, dĺžka reťazca.
To je funkcia, ktorá prichádza s C, že ak odovzdať reťazec,
to vám povie, koľko znakov v tomto reťazci. To je všetko.
A skutočnosť, že je to strlen miesto reťazca dĺžky je len preto, že je to stručnejší.
Pred tridsiatimi rokmi, sa páčila písať veci ako stručne, ako je to možné,
takže sme stále tento dohovor tu.
i + + znamená len zvyšovať aj v každej iterácii.
A teraz si toho všimnúť, čo je naozaj zaujímavé.
V súlade 24, hovorím, "Počítači, daj mi charakter, 8 bitov, a nazývať to c"
Ale čo je to na pravej strane hovorí?
V angličtine, čo to predstavuje?
[Študent] Prvý znak v poli.
Presne tak. Daj mi prvý znak v poli.
Alebo všeobecnejšie, daj mi-tej znak v poli.
A uvedomiť si, že je to dôležité dnes, ako počítačoví vedci,
sme vlastne počítať od 0.
>> Nemáte priestor na voľnú úvahu, teraz začať robiť to.
Teraz sa majú správať v súlade s počítačom očakávania a počítať z 0
pretože [0] bude prvý znak v reťazci,
[1] bude druhý, [2] bude tretí a tak ďalej.
Takže tento program, keď som ho skompilovať to je opäť string1, takže sa string1,
a teraz som bežať string1 v mojom terminálovom okne.
Je to čakanie na vstup, takže budem písať v Dávidovi, Enter,
a teraz sa vytlačí Dávidovi všetko na rôznych tratiach, pretože súpis toho, čo robím.
Ja tlače jeden znak v čase.
Nebudeme zachádzať do detailov dnes na to, ale som zmazal pred chvíľou tejto kontroly tu.
Ukazuje sa, že v prípade, že používateľ sa nechová, nepriateľský, alebo len zmätený,
môžete skutočne nedávajú reťazec obšírnejšie.
Ak stlačíte zlé tlačidlo na klávesnici, môžete dať žiadnu reťazec vôbec,
alebo ak ste škodlivý, môžete skúsiť vložiť do spoločnosti GIGABYTE, to stojí eseje
vyplniť tento reťazec, a v prípade, že počítač beží z pamäti,
ukazuje sa, že budeme dostať späť túto špeciálnu hodnotu s názvom NULL.
Takže teraz, len viem, že tam je to špeciálna hodnota zvaná NULL
že nám umožní skontrolovať, kedy sme z pamäte, okrem iného.
Ale keď otvorím sa teraz řetězec2, všimnete jeden rozdiel tu.
Všimnite si, jeden rozdiel tu s string2.
S string2, to pre sláčiky je trochu iný.
>> Dovoľte mi, aby som odstrániť NULL, takže môžeme hovoriť o tých niekedy inokedy.
Aký je rozdiel asi pre sláčiky tentokrát?
Môžem sa vrátiť k predchádzajúcemu príkladu.
Tak to je verzia 2, toto je verzia 1. 1, 2.
1, 2.
The strlen volanie je kde?
Je to v prvej časti slučky for.
Akékoľvek myšlienky, prečo to robím? Jo.
[Študent] Takže sa nemusíte volať funkcie zakaždým.
[Malan] Takže nemáme volanie funkcie zakaždým. Presne tak.
Spomeňte si na slučiek, ktoré sú super jednoduchý
akonáhle trochu pochopili, že to je inicializácia, podmienka, a aktualizácie.
Problémom je, že tento stav sa deje na každej iterácii slučky.
A tak v tomto príklade tu, čo je zlé na tom, že tento je moja podmienka?
[Študent] Voláš strlen.
[Malan] Voláš strlen znovu a znovu a znovu.
Ale potom, čo som napísal v Dávidovi, dĺžka tohto reťazca je 5,
a to nebude meniť na každej iterácii slučky
pretože reťazec je stále D - v-i-d.
Tak to je náznak, čo sa deje, aby sa stal čoraz dôležitejšie myšlienka
známy ako konštrukčný rozhodnutie, kde práve nedávajú počítač robiť zbytočnú prácu.
>> Rovnako ako plížiť náhľad pset2, pset2 v štandardnej edícii
bude výzvou, aby ste skutočne realizovať určitý počet šifier,
niektoré číslo šifrovacie algoritmy, takže je možné ako šifrovanie
a dešifrovať tajné správy veľa ako jednej Ralphie tam dekódovať.
V hackerské vydanie pset2, budeme ísť trochu ďalej.
Budeme vám odovzdá súbor od skutočného počítačového systému
, Ktorý obsahuje veľa užívateľských mien a skutočných zašifrovaných hesiel,
a výzvou pre hackera vydanie bude bezva týchto hesiel
a zistiť, čo kryptografie alebo čo tajné bola použitá skutočne generovanie týchto hesiel.
A ak budeme to urobiť pomocou novej funkcie tu o C
že ti dám len demo známy ako argumenty príkazového riadku.
Ukazuje sa, ako si niektorí z vás možno videli v oddiele alebo v učebniciach,
Hlavným nemusí vždy byť neplatné v zátvorkách.
Ukazuje sa, že hlavnou môže tiež byť písaný ako to, s dvoma argumentmi,
argc a ArGV, kde argc je počet slov
ktoré zadáte po programe menom na príkazovom riadku
a ArGV je skutočná slová.
A ako hranaté zátvorky tam naznačujú, ArGV je zrejme poľa.
Je to bude reťazec za reťazec po reťazec v pamäti.
>> Takže to, čo budeme môcť robiť počnúc PSet 2 je niečo ako toto.
Ak urobím argv1, čo je príklad vrátime do pondelka, a spustite ho,
Všimnite si, že to nevyzerá na nič zatiaľ.
Je to len vytlačí jeho vlastné meno.
Ale keď poviem zbohom triedy, všimnite si, že tento program zrejme opakuje
nad každým zo slov, ktoré boli zadané na príkazovom riadku.
A prostriedky, ktoré získame prístup k slovách, ktoré užívateľ zadal na príkazovom riadku
je zmenou Hlavným východiskom tento víkend od int main (void) int main (argc, ArGV)
a tak sa narodí argumenty príkazového riadku.
A akonáhle sa dostanete naozaj sofistikovaný na to, budete môcť písať naozaj Tripp programy
ako tento tu, ktorý ide nad rámec
niektoré funkcie, že sme urobili tak ďaleko, ale všetko celkom silný.
>> Takže necháme to s tým na obrazovke, a uvidíme sa v pondelok.
>> [CS50.TV]