[Powered by Google Translate] [Týždeň 4]
[David J. Malan] [Harvard University]
[To je CS50.] [CS50.TV]
>> Dobre, to je CS50, a to je začiatok 4. týždni
a to je jeden z najpomalšie možných algoritmov triedenia.
Ktorý z nich je to, že sme práve videli tam?
To bolo bublina radenie, aby veľké O (n ^ 2) + súčet,
a naozaj nie sme jediní, kto v tomto svete zrejme vedia,
čo bublina sort alebo jeho hrací čas.
Naozaj, to bol rozhovor s Ericom Schmidtom z Google
a bývalý senátor Barack Obama len pred niekoľkými rokmi.
>> Teraz, senátor, si tu na Google,
a som rád, že predsedníctvo ako pohovoru.
Teraz, je ťažké dostať prácu ako prezident, a ty ideš cez nástrahami teraz.
Je tiež ťažké získať prácu na Google.
Máme otázky, a žiadame naše kandidátov otázky,
a toto je od Larry Schwimmer.
Vy myslíte, že si robím srandu? Je to priamo tu.
Aká je najúčinnejší spôsob, ako triediť milión 32-bit celé číslo?
[Smiech]
No-
Je mi to ľúto. >> Nie, nie, nie, nie.
Myslím, že bublina druh bude zlý spôsob, ako ísť.
>> Poď, ktorý mu povedal, toto?
Minulý týždeň sme pripomenúť si pauzu od kódu, aspoň na jeden deň,
a začal so zameraním na niektoré vyššej úrovni myšlienok a riešení problémov všeobecne
v rámci vyhľadávania a radenie,
a sme zaviedli niečo, čo sme nemali Slap tento názov minulý týždeň,
ale asymptotickej notácie, Big O, Big Omega,
a niekedy Big Theta zápis, a tie boli jednoduchý spôsob
popísať čas behu algoritmov,
ako dlho to trvá, než algoritmus spustiť.
>> A vy si možno spomenú, že si hovoril o dobe chodu z hľadiska veľkosti
vstupu, ktorý sme zvyčajne nazývame n, bez ohľadu na problém môže byť,
, Kde n je počet osôb v miestnosti,
počet stránok v telefónnom zozname, a začali sme písať veci
ako O (n ^ 2) alebo O (n), alebo O (n log n),
a to aj keď matematika nebola úplne fungovať tak dokonale
a to bolo n ² - n / 2 alebo niečo také
by sme namiesto toho len zahodiť niektoré z nižších rádov,
a motivácia je, že naozaj chceme
druh objektívneho spôsobu hodnotenia
výkon programov alebo vykonávania algoritmov
že na konci dňa nemá nič spoločné, napríklad,
s rýchlosti vášho počítača dnes.
>> Napríklad, ak sa rozhodnete bubliny triedenie,
alebo sa rozhodnete zlúčiť radenia alebo výber druhu na dnešnom počítači,
2 GHz počítač, a spustiť ho,
a to trvá určitý počet sekúnd, budúci rok je tu 3 GHz
alebo 4 GHz počítač, a tie by sa potom tvrdiť, že "Wow, môj algoritmus
je teraz dvakrát tak rýchlo, "keď v skutočnosti to zjavne nie je tento prípad.
Je to len hardvér dostal rýchlejšie, ale váš počítač
nie je, a tak sme naozaj chcete vyhodiť veci, ako je
násobky 2 alebo násobky 3, pokiaľ ide o opis
ako rýchlo alebo ako pomaly algoritmus je a naozaj sústrediť len
na n alebo nejaký faktor tejto zmluvy,
časť výkonu jeho ako v prípade druhov z minulého týždňa.
A pripomínajú, že s pomocou druhu korešpondencie
sme boli schopní urobiť oveľa lepšie, než bublina radiť a výberu zoradiť
a dokonca aj vkladanie sort.
>> Máme sa na n log n, a znova,
Pripomínam, že log n všeobecne sa odkazuje na niečo, čo rastie
pomalšie potom n, tak n log n doteraz bola dobrá
pretože to bolo menšie, než ² n
Ale k dosiahnutiu n log n s radiť zlučovacie
čo bolo základné zárodok myšlienky, že sme museli využiť
že sme tiež zadlužuje späť v týždni 0?
Ako sme riešiť problém radenie chytro s radiť zlučovacie?
Aký bol kľúčový vhľad, snáď?
Každý, kto vôbec.
Dobre, poďme o krok späť.
Popíšte zlúčiť druh vlastnými slovami.
Ako to funguje?
Dobre, budeme veslovať staré týždenných 0.
Dobre, jo.
[Nepočuteľné-študent]
Dobre, dobre, tak sme sa rozdelili pole čísel do 2 kusy.
Sme zoradené každý z týchto kusov, a potom sme zlúčili je,
a my sme videli túto myšlienku pred branie problém, ktorý je takto veľký
a sekanie je, ako sa na problém, ktorý je to veľké alebo to veľké.
>> Pripomeňme telefónneho zoznamu príklad.
Spomeňte si na vlastný algoritmus počítanie od týždne,
tak zlúčiť radiť bol zhrnutý v tomto pseudokódu tu.
Keď ste rovnako n prvkov, najprv to bol zdravý rozum skontrolovať.
Ak n <2, potom nerobia vôbec nič
pretože ak n <2, potom n je zrejme 0 alebo 1,
a tak ak je to buď 0 alebo 1 nič vyriešiť.
To je všetko.
Váš zoznam je už triviálne zoradený.
Ale inak, ak máte 2 alebo viac prvkov ísť dopredu a rozdeliť ich
do 2 polovice, ľavú a pravú.
Zoradiť každej z týchto polovíc, a potom zlúčiť zoradené polovice.
Ale problém je, že na prvý pohľad to pocit, ako by sme to plaviť.
To je kruhová definícia v tom, že ak som vás požiadal, aby ste zoradiť tieto n prvkov
a vy mi hovoríte, "Dobre, fajn, budeme triediť tie n / 2 a tie n / 2 prvkov,"
potom moja ďalšia otázka bude "Fajn, ako si zotrieďiť n / 2 prvkov?"
>> Ale pretože štruktúry tohto programu,
pretože tam je tento základný prípad, aby som tak povedal,
tento osobitný prípad, ktorý hovorí, že ak je n <nejakú pevnú hodnotu, ako je 2 návrate ihneď.
Neodpovedajte s rovnakým kruhovú odpoveď.
Tento proces, bude tento cyklová nakoniec skončí.
Keď sa ťa spýtam "Ako tieto n prvky," a vy hovoríte, "Fine, triediť tieto n / 2,"
potom povieš: "Dobre, trochu to n / 4, n / 8, n/16,"
nakoniec budete deliť dosť veľký počet
že budete mať len 1 prvok doľava, na ktorom mieste si môžete povedať,
"Tu, tu je zoradená jeden prvok."
Potom lesk tohto algoritmu tu je odvodená od skutočnosti
, Že akonáhle budete mať všetky tieto jednotlivo triedené zoznamy,
z ktorých všetky sú veľkosti 1, čo sa zdá byť zbytočné,
akonáhle začnete zlúčenie a zlúčenie
si vybudovať konečne ako Rob robil vo videu konečne sú zoradené zoznam.
>> Ale táto myšlienka siaha ďaleko za hranice triedenie.
Tam je tento nápad zakotvený v tomto programe známeho ako rekurzia,
nápad, ktorým ste program,
a vyriešiť nejaký problém si hovoríš,
alebo dať do súvislosti programovacích jazykov, ktoré sú funkcie,
a za účelom vyriešenie problému, môžete funkcie hovoríš
znova a znova a znova, ale funkcia
nemožno volať sami nekonečne veľakrát.
Nakoniec budete musieť dna, aby som tak povedal,
a máte nejaké pevne základnú podmienku, ktorá hovorí, že
V tomto bode prestať hovoriť si tak, aby celý proces
Nakoniec sa v skutočnosti zastaviť.
Čo to vlastne znamená, aby recurse?
>> Poďme sa pozrieť, či môžeme urobiť jednoduchý, triviálne príklad, povedzme,
3 osoby so mnou tu na javisku, keď niekto je pohodlné.
1, poď hore, 2 a 3.
Ak 3 chcieť prísť sem.
Ak chcete postaviť hneď vedľa mňa tu v rade, predpokladám, že problém na dosah ruky
je veľmi triviálne spočítať počet ľudí, ktorí sú tu.
Ale úprimne povedané, som unavená zo všetkých týchto počítanie príkladov.
To bude nejaký čas trvať, 1, 2, a bodka, bodka, bodka.
Bude to trvať večne.
Ja by som radšej punt tento problém úplne pomocou-Ako sa voláte?
Sara. >> Sara, v poriadku.
Kelly. >> Kelly a?
>> Willy. >> Willy, Sara, Kelly, a Willy.
Práve teraz som sa pýtal niekto
koľko ľudí je na tejto scéne, a ja nemám potuchy.
To je naozaj dlhý zoznam, a tak namiesto toho budem robiť tento trik.
Idem sa spýtať osobu vedľa mňa robiť väčšinu práce,
a akonáhle sa vykonáva robí väčšinu práce
Budem robiť čo najmenšie množstvo práce je možné, a stačí pridať 1
na akúkoľvek jej odpoveď je, tak je to tu.
Bol som požiadaný, koľko ľudí je na javisku.
Koľko ľudí je na javisku vľavo z vás?
Ľavá mne? >> Dobre, ale nebudú podvádzať.
To je dobre, to je pravda, ale ak chceme pokračovať v tejto logiky
predpokladajme, že si podobne chcete punt tento problém na ľavej strane vás,
takže skôr než odpovede priamo do toho pustite a len prejsť do mínusu.
Ach, koľko ľudí je na ľavej strane ma?
Ako mnoho ľudí sú umiestnené na ľavej?
1.
[Smiech]
Dobre, tak 0, takže to, čo teraz Willy urobil
je, že ste sa vrátil vašu odpoveď týmto smerom hovorí 0.
Teraz, čo by ste mali robiť? >> 1.
Dobre, takže ty si 1, takže si povedal, "Dobre, budem pridávať 1
na akúkoľvek Willyho gróf, "tak 1 + 0.
Teraz ste 1 tak, aby vaša odpoveď na pravej strane je teraz-
1. >> A ja by som byť 2.
Dobré, takže berieš predchádzajúca odpoveď 1,
pridanie minimálne množstvo práce, ktorú chcete urobiť, čo je +1.
Teraz máte 2, a potom mi podať ktorej hodnota?
3, myslím, prepáč, 2.
Dobré.
>> No, mali sme 0 vľavo.
Potom sme mali 1, a potom pridáme 2,
a teraz si podal mi číslo 2,
a tak som povedal, v poriadku, 1, 3.
Tam je naozaj 3 ľudia stojaci vedľa mňa na tejto scéne,
takže môžeme zrejme urobil veľmi lineárne,
veľmi v móde zrejmé, ale čo sme naozaj?
Vzali sme si problém veľkosti 3 pôvodne.
Potom sme roztriedili do problému veľkosti 2,
potom problém veľkosti 1, a nakoniec referenčné prípad
Bolo to naozaj, oh, tam nikto nie je,
na ktorom mieste Willy vrátil účinne pevne odpoveď niekoľkokrát,
a druhý bol potom bublala hore, bublala nahor, bublala up,
a potom pridaním do tohto jedného dodatočného 1
Vytvorili sme túto základnú myšlienku rekurzie.
>> Teraz, v tomto prípade je to naozaj vyriešiť problém
akékoľvek účinnejšie ako sme videli doteraz.
Ale premýšľať o algoritmoch sme urobili na javisku tak ďaleko.
Mali sme 8 kusov papiera na tabuľu,
na videu, kedy Sean hľadal číslo 7, a čo urobil naozaj?
No, on to neurobil nejaký druh rozdeľuj a panuj.
Neurobil akékoľvek rekurzie.
Skôr to práve urobil tento lineárny algoritmus.
Ale keď sme zaviedli myšlienku zoradené čísel na javisku žiť minulý týždeň
potom sme mali tento inštinkt ísť do stredu,
na ktorom mieste sme mali menší zoznam veľkosti 4 alebo inom zozname veľkosti 4,
a potom sme mali presne rovnaký problém, tak sme opakovali, opakoval, opakoval.
Inými slovami, recursed.
Ďakujem moc sa do nášho 3 dobrovoľníkov tu pre demonštráciu rekurzia s nami.
>> Poďme sa pozrieť, či nemôžeme to teraz trochu konkrétnejšie,
rieši problém, ktorý sme opäť mohli robiť celkom ľahko,
ale budeme používať ako odrazový mostík k realizácii tohto základnú myšlienku.
Ak chcem spočítať súčty veľa čísel,
napríklad, ak si prejsť v počte 3,
Chcem vám hodnotu sigma 3,
takže súčet 3 + 2 + 1 + 0.
Chcem sa dostať späť odpoveď 6,
takže budeme vykonávať túto sigma funkciu, to zhrnutie funkcie
že opäť berie na vstupe, a potom vráti zhrnutie
z tohto počtu celú cestu až na 0.
Mohli by sme to pekné jednoducho, že?
Mohli by sme to urobiť s nejakým druhom slučky štruktúry,
tak nechajte ma ísť dopredu a dostať to začalo.
>> Zahrnúť stdio.h.
Dovoľte mi, aby som sa sám do hlavnej pracovať s tady.
Poďme uložiť ako sigma.c.
Potom som ísť sem, a budem deklarovať int n,
a ja budem robiť nasledujúce, zatiaľ čo používateľ nespolupracuje.
Kým používateľ mi nedala kladné číslo
nechaj ma ísť napred a prinútili je pre n = GetInt,
a dovoľte mi, aby som im nejaké inštrukcie o tom, čo robiť,
takže printf ("Positive integer prosím").
Len niečo relatívne jednoduchého, ako to tak, že v čase, keď sme narazili riadok 14
teraz máme kladné číslo pravdepodobne v n
>> Teraz sa poďme urobiť niečo s tým.
Nechaj ma ísť dopredu a počítať súčty, takže int sum = sigma (n).
Sigma je len zhrnutie, takže som len písať to v milovník spôsobom.
Budeme jednoducho hovoriť sigma tam.
To je suma, a teraz idem vytlačiť výsledok,
printf ("Súčet je% d \ n", sum).
A potom sa vrátim 0 pre správnu mieru.
Urobili sme všetko, čo tento program vyžaduje okrem zaujímavej časti,
ktorý je skutočne realizovať sigma funkciu.
>> Nechajte ma ísť sem dole až na dno, a dovoľte mi, aby som určil funkciu sigma.
Má to vziať premennú, ktorá je typu integer,
a aké dáta typu nechcem vrátiť pravdepodobne z sigma?
Int, pretože chcem, aby to tak, aby zodpovedala moje očakávania na linke 15.
V tú nechajte ma ísť dopredu a vykonanie tohto
v celkom priamočiaro.
>> Poďme ďalej a povedať, int sum = 0,
a teraz idem mať málo pre sláčiky tu
že sa to povedať niečo také,
for (int i = 0; I <= číslo; i + +) súčet + = i
A potom budem vracať sumu.
Som mohol robiť to v mnohých spôsobmi.
Mohol som použil while.
Mohol som preskočil pomocou súčtu premenné, či som naozaj chcel,
ale v krátkej, len musíme funkciu, že keď som nemal flákať prehlasuje súčet je 0.
Potom sa opakuje z 0 na hore cez čísla,
a na každej iterácii je dodáva, že aktuálnu hodnotu súčtu a vráti súčet.
>> Teraz je tu mierne optimalizácia tu.
To je pravdepodobne zbytočná krok, ale budiž. To je v poriadku pre túto chvíľu.
Sme ich aspoň dôkladné a bude 0 celú cestu hore.
Nie je príliš tvrdý a veľmi jednoduché,
ale ukazuje sa, že s touto funkciou sigma máme rovnakú možnosť
ako sme to urobili tu na javisku.
Na javisku sme práve počítal, koľko ľudí bolo vedľa mňa,
ale ak by sme chceli spočítať 3 + 2 + 1
na až do 0 by sme mohli podobne punt na funkciu
že budem namiesto toho popisovať ako rekurzívne.
Tu poďme sa rýchlo zdravý rozum skontrolovať a uistite sa, že som to neurobil flákať.
>> Viem, že je tu aspoň jedna vec v tomto programe, ktoré som urobil zle.
Keď som narazila zadajte budem sa dostať akýkoľvek druh na mňa jačať?
Čo budem sa kričal na o?
Jo, zabudol som prototyp, takže som pomocou funkcie nazýva sigma on-line 15,
ale to nie je vyhlásený až riadku 22, tak som možno aktívne ísť sem
a vyhlásiť prototyp, a poviem int sigma (int number), a to je všetko.
Je vykonávaná na dne.
>> Alebo iný spôsob, ako by som mohol vyriešiť tento problém,
Mohol by som funkciu presunúť tam, čo nie je zlé,
ale aspoň, keď sú vaše programy začnú sa dostať dlho, úprimne povedané,
Myslím, že je to nejaké hodnoty vždy s hlavným hore
takže v čitateľovi môže otvoriť súbor a potom okamžite vidieť
čo program robí, bez toho aby museli hľadať cez neho
hľadá pre túto hlavnú funkciu.
Poďme dole do môjho okna terminálu tu, skúste robiť sigma sigma robiť,
a ja som podelal tady taky.
Implicitné vyhlásenie o funkcie GetInt znamená, že som zabudol na to, čo iné?
[Nepočuteľné-študent]
Dobré, tak zrejme častý omyl, takže poďme dať tejto udalosti tu,
cs50.h, a teraz sa vráťme k môjmu terminálovom okne.
>> Budem vymazať obrazovku, a ja znova spustite, aby sigma.
Zdá sa, že sa zostavujú. Dovoľte mi, aby som teraz spustiť sigma.
Budem zadajte číslo 3, a ja som si 6, takže nie je prísne kontroly,
ale aspoň sa zdá, že bude pracovať na prvý pohľad, ale teraz poďme to rip seba,
a poďme skutočne využívajú myšlienku rekurzia, znovu,
vo veľmi jednoduchom kontexte tak, aby za pár týždňov
keď začneme skúmať milovník dátových štruktúr, ako pole
máme ďalší nástroj v toolkit, s ktorým sa
manipulovať tieto dátové štruktúry ako uvidíme.
To je iteratívny prístup, slučka prístup založený.
>> Dovoľte mi, aby som namiesto toho teraz urobiť.
Dovoľte mi, aby som namiesto toho povedal, že súčtom počtov
dole k 0 je naozaj to isté ako
Číslo + sigma (číslo - 1).
Inými slovami, rovnako ako na stupne Aj punted pre každý z ľudí vedľa mňa,
a podľa poradia držal plaviť až sme konečne svojho dna na Willyho,
kto mal vrátiť pevne odpoveď ako 0.
Tu sme podobne plaviť na sigma
rovnakú funkciu ako bol pôvodne nazývaný, ale kľúčový vhľad tu
je to, že nie sme volať sigma identicky.
Sme neprechádza v n
Sme jednoznačne prechádza v rade - 1,
tak o niečo menší problém, o niečo menší problém.
>> Bohužiaľ, to nie je tak úplne riešenie doteraz, a ako sme sa opraviť
Čo by mohlo byť skákať tak, ako zrejmé, na niektoré z vás
nechaj ma ísť napred a znova robiť.
Zdá sa, že zostaviť v poriadku.
Dovoľte mi, aby som znovu spustiť sigma s 6.
Jejda, dovoľte mi, aby som znova spustite sigma s 6.
Videli sme to predtým, hoci náhodne poslednej dobe tiež.
Prečo som si tento tajomnú Segmentation fault? Jo.
[Nepočuteľné-študent]
Nie je base-case, a konkrétnejšie, čo sa asi stalo?
To je príznakom aké správanie?
Povedz to trochu hlasnejšie.
[Nepočuteľné-študent]
Je to nekonečná slučka efektívne, a problém s nekonečnými slučkami
keď zahŕňajú rekurziu v tomto prípade, funkcia volať seba,
čo sa stane zakaždým, keď zavolať funkciu?
No, myslím, že späť k tomu, ako je stanovené pamäte v počítači.
Povedali sme, že je to kus pamäte tzv stack, ktorý je na dne,
a zakaždým, keď budete volať funkcie trochu viac pamäte dostane dal
na tzv zásobníka obsahujúceho túto funkciu je lokálne premenné alebo parametre,
takže ak sigma volá sigma sigma volaní volanie sigma
vyzýva sigma, kde tento príbeh skončí?
>> No, to nakoniec prekročení celková čiastka
pamäti, že máte k dispozícii k počítaču.
Môžete obsadiť segment, ktorý ste mal zostať vo vnútri,
a získajte tento Segmentation fault, core dumpingové,
a čo core dumpingové znamená, že teraz máte súbor s názvom core
čo je súbor obsahujúci núl a jedničiek
že skutočne v budúcnosti bude diagnosticky užitočné.
Ak to nie je zrejmé na vás, kde sa vaša chyba je
môžete skutočne urobiť trochu forenznej analýzy, aby som tak povedal,
na tento súbor core dump, ktorá je opäť len celá partia núl a jedničiek
ktoré v podstate predstavuje stav vášho programu do pamäti
v okamihu, keď sa zrútil týmto spôsobom.
>> Oprava je, že nemôžeme len tak slepo vrátiť sigma,
číslo + Sigma trochu menší problém.
Musíme mať nejaký základné veci tu,
a čo by referenčný prípad, pravdepodobne?
[Nepočuteľné-študent]
Dobre, tak dlho, kým je číslo kladné by sme sa mali skutočne vráti to,
alebo inak povedané, ak je číslo, povedzme, <= k 0
Vieš čo, ja pôjdem napred a vrátiť 0,
podobne ako Willy urobil, a iný, budem pokračovať
a vrátiť to, takže to nie je, že oveľa kratšia
ako iteratívny verzie, ktoré sme šľahačkou ako prvý pomocou slučky for,
ale všimnite si, že je to druh elegancie k nej.
Namiesto návrate nejaké číslo a prevedenie všetkých týchto matematiku
a pridaním veci s lokálnymi premennými
ste miesto toho povedal: "Dobre, ak je to super jednoduchý problém,
ako je číslo <0, dovoľte mi, aby som sa hneď vrátiť 0. "
>> Nebudeme sa obťažovať podporu záporné čísla,
takže budem pevný kód hodnotu 0.
Ale inak, realizovať túto myšlienku sčítania
všetky z týchto čísel dohromady môžete účinne vziať malý kúsok
z problému, rovnako ako sme to urobili tu na javisku,
potom pramice zvyšok problému na ďalšie osoby,
, Ale v tomto prípade, že ďalšia osoba sami.
Je to rovnako pomenované funkcie.
Len prejsť to menšie a menšie a menšie problém zakaždým,
a aj keď sme sa úplne formalizované veci v kóde tu
To je presne to, čo sa deje v týždni 0 sa v telefónnom zozname.
To je presne to, čo sa deje v posledných týždňoch sa Seanom
a s našimi ukážkami vyhľadávania čísel.
Trvá to nejaký problém a delenie to znova a znova.
>> Inými slovami, existuje spôsob, ako teraz prekladanie
tento reálny svet konštrukt, to vyššia úroveň konštrukt
z rozdeľ a panuj a robiť niečo znovu a znovu
v kóde, takže to je niečo, čo budeme vidieť znova v priebehu času.
Teraz, rovnako ako stranou, ak ste nový rekurzia, mali by ste aspoň chápem
prečo je to smiešne.
Chystám sa ísť na google.com,
a budem hľadať niekoľko tipov a trikov na rekurzia, zadajte.
Povedzte osoby vedľa vás, či sa nesmeje práve teraz.
Mali ste na mysli rekurziu?
Mali ste na mysli-ah, tam ideme.
Dobre, teraz to zvyšok každého.
Trochu Veľkonočné vajíčko vložené niekde v Google.
Ako stranou, jeden z článkov my sme dali na ihrisku internetových stránkach
pre dnešok je len táto sieť rôznych algoritmov triedenia,
z ktorých niektoré sme sa pozreli na minulý týždeň, ale to, čo je pekné o tejto vizualizácie
ako ste sa snaží zabaliť svoju myseľ okolo rôznych vecí súvisiacich s algoritmami
viete, že môžete veľmi ľahko teraz začať s rôznymi typmi vstupov.
Vstupy všetky zvrátiť, vstupy väčšinou sú zoradené, vstupy náhodné a tak ďalej.
Ak sa pokúsite znova, rozlíšiť tieto veci vo vašej mysli
uvedomiť, že táto URL na ihrisku stránkach na prednášky stránke
vám môžu pomôcť dôvodom cez niektoré z nich.
>> Dnes sme sa konečne dostať k riešeniu tohto problému z chvíľu späť,
ktorý bol, že táto odkladacia funkcie jednoducho nefunguje,
a to, čo bolo zásadný problém s touto funkciou swapu,
ktorého cieľom bola opäť vymeniť hodnotu tu a tu
také, že sa tak stane?
To nebolo v skutočnosti fungovať. Prečo?
Jo.
[Nepočuteľné-študent]
Presne, vysvetlenie pre tento bugginess
proste bolo preto, že keď budete volať funkcie v C
a tie funkcie trvať argumenty, ako a, b tu,
ste okoloidúci v kópiách akúkoľvek hodnotu ste poskytovania tejto funkcii.
Nie ste poskytuje pôvodné hodnoty sami,
takže videl v kontexte buggyc,
buggy3.c, ktorý vyzeral trochu niečo takého.
>> Pripomeňme si, že sme mali x a y inicializovaná na 1 a 2, resp.
Potom sme vytlačiť to, čo oni boli.
Potom som tvrdil, že som bol vymieňať je volaním swap x, y.
Ale problém bol, že odkladanie pracoval,
ale iba v rozsahu swapu fungovať sám.
Akonáhle sme narazili riadok 40 týmto vymenili hodnoty
boli vyhodené, a tak nič
v pôvodnej funkcie bola hlavná vlastne nezmenil,
takže ak si myslíte, že vtedy, čo to vyzerá, pokiaľ ide o našej pamäti
v prípade, že ľavá strana dosky predstavuje-
a ja budem robiť moje najlepšie pre každého vidieť, v prípade, že ľavá strana tabule
predstavuje, povedzme, RAM, a zásobník bude rast na up týmto spôsobom,
a zavoláme funkciu ako hlavný, a hlavné má 2 lokálne premenné, x a y,
poďme popísať tie, ktoré sú x tu, a poďme popisovať tieto ako y tu,
a poďme dať v hodnotách 1 a 2, tak toto je hlavné,
a keď hlavné volá swap funkcie operačného systému
dáva SWAP funkcie vlastnej pás pamäte na zásobníku,
vlastný rám vo fronte, aby som tak povedal.
Je tiež prideľuje 32 bitov pre tieto ints.
Stáva sa to nazvať, a b, ale to je úplne náhodné.
Mohlo by ich povolal, čo chce, ale čo sa stane, keď hlavný
vyzýva swap je to berie túto 1, dá kópiu tam, dá kópiu tam.
>> K dispozícii je 1 ďalšie lokálne premennú v swapu, keď volal, čo? >> Tmp.
Tmp, tak mi dovoľte dať si ďalších 32 bitov tu,
a čo som urobil v tejto funkcii?
Povedal som int tmp dostane, tak má 1, tak som to urobil, keď sme naposledy hrali v tomto príklade.
Potom sa dostane b, takže b je 2, takže teraz to bude 2,
a teraz b dostane teplota, takže teplota je 1,
tak teraz b stáva toto.
To je skvelé. Fungovalo to.
Ale potom, akonáhle sa funkcia vráti
swapu pamäte v skutočnosti zmizne, takže to môže byť znovu
inú funkciu v budúcnosti, a hlavné je, samozrejme, úplne bez zmeny.
Potrebujeme spôsob, ako zásadne vyriešenie tohto problému,
a dnes budeme mať konečne spôsob, ako to dosiahnuť, keď
môžeme predstaviť niečo ako ukazovateľ.
Ukazuje sa, že môžeme vyriešiť tento problém
nie je odovzdaním kópie x a y
ale tým, že podstúpi v čo, myslíš, na odkladaciu funkciu?
Jo, čo o adrese?
Sme naozaj hovoril o adresách v veľa podrobne,
ale ak to tabule predstavuje môjho pamäti počítača
by sme mohli určite začať číslovanie bytov v mojom RAM
a povedať to je byte # 1, to je byte # 2, byte # 3,
byte # 4, byte # ... 2000000000 keď mám 2 GB pamäte RAM,
takže sme mohli určite prísť s nejakým ľubovoľným schémy číslovania
pre všetky jednotlivé byty v mojej pamäti počítača.
>> Čo keď namiesto toho, keď som hovor odkladacia
skôr ako prejsť v kópiách x a y
prečo by som miesto odovzdať adresu x tu,
adresa y tu, v podstate poštová adresa
x a y, pretože potom swap, keď je informovaný
na adresu v pamäti X a Y,
potom swap, ak sme cvičili ho trochu,
mohol potenciálne viesť na túto adresu, aby som tak povedal,
x, a zmeniť číslo tam, potom cesta na adresu y,
zmeniť číslo tam, aj keď nie v skutočnosti získať kópie týchto hodnôt sám,
takže aj keď sme o tom hovorili ako hlavnej pamäte
a toto ako bytia swapu pamäte silný a nebezpečný časť C
je to, že každý funkcia môže dotknúť pamäte kdekoľvek v počítači,
a to je silný v tom, že môžete robiť veľmi efektné veci s počítačovými programami v C.
To je nebezpečné, pretože môžete tiež pokaziť veľmi ľahko.
V skutočnosti, na jeden z najčastejších spôsobov, ako programy v týchto dňoch byť využité
Stále je pre programátor neuvedomuje
že on alebo ona je umožniť dátové
byť napísaný v mieste v pamäti, že nebol určený.
>> Napríklad, on alebo ona prehlasuje, pole o veľkosti 10
ale potom náhodne snaží dať 11 bajtov do tejto matice v pamäti,
a začnete dotýkať častí pamäte, ktoré už nie sú platné.
Len pre kontextové to, niektorí z vás vedia, že
softvér často vás vyzve na zadanie sériového čísla alebo registračných kľúčov,
Photoshop a Word a programy, ako je táto.
Existujú trhliny, ako si niektorí z vás vedia, on-line, kde môžete spustiť malý program,
a voila, nič viac žiadosť o poradové číslo.
Ako je to, že pracuje?
V mnohých prípadoch sa tieto veci jednoducho nájsť v počítačoch
textové segmenty v počítači skutočných núl a jedničiek
kde je táto funkcia, kde je požadované sériové číslo,
a prepísať priestor, alebo keď je program spustený
môžete zistiť, kde je kľúč skutočne uložený
pomocou niečo ako debugger, a môžete bezva softvér týmto spôsobom.
To je však neznamená, že toto je naším cieľom pre ďalšie dva dni,
ale má veľmi reálne následky.
Že jeden sa stane zapojiť krádeže softvéru,
ale je tu aj kompromis celých strojov.
>> V skutočnosti, keď webové stránky v týchto dňoch sú využívané
a ohrozená a dáta sú deravý a heslá sú ukradnuté
Tento veľmi často súvisí so zlým riadením niečí pamäte,
alebo, v prípade databáz, neschopnosť predvídať
kontradiktórne vstup, tak o tom viac v najbližších týždňoch,
ale teraz len plížiť náhľad druhu škôd, ktoré môžete urobiť
tým, že úplne pochopiť, ako veci fungujú pod pokrievku.
Poďme o pochopenie, prečo je chybný
s nástrojom, ktorý bude stále viac a viac užitočné
ako naše programy sa zložitejšie.
Tak ďaleko, keď ste mali chybu v programe
ako ste odišla o ladenie to?
Čo vaše techniky boli tak ďaleko, či už učil svoje TF
alebo len samouk?
[Študent] printf.
Printf, takže printf bol pravdepodobne tvoj priateľ v tom, že ak chcete vidieť
čo sa deje vo vnútri vášho programu
stačí dať printf tu, printf tu, printf tu.
Potom ho spustíte, a dostanete veľa vecí na obrazovke
, Ktoré môžete použiť, aby potom odvodiť, čo sa vlastne deje zle vo vašom programe.
>> Printf má tendenciu byť veľmi silná vec,
ale je to veľmi manuálny proces.
Musíte dať printf tu, printf tu,
a ak ste to vnútri slučky môžete dostať 100 riadkov
výstupu, ktorý potom musí preosiať cez.
Nie je to ako veľmi užívateľsky príjemný alebo interaktívne mechanizmus pre ladenie programov,
ale našťastie existuje alternatívy.
Tam je program, napríklad, volal GDB, GNU Debugger,
čo je trochu tajomný v tom, ako ho použiť.
Je to trochu zložitejšie, ale úprimne povedané,
to je jedna z tých vecí, kde, ak si dať v tomto týždni a ďalšie
ďalšie hodina pochopiť niečo ako GDB
to vám ušetrí pravdepodobne aj desiatky hodín v dlhodobom horizonte,
tak s tým, dovoľte mi, aby som vám ukážku, ako tá vec funguje.
>> Som v terminálovom okne.
Nechaj ma ísť napred a skompilovať tento program, buggy3.
Je to už aktuálne.
Dovoľte mi, aby som ho spustiť rovnako ako sme to urobili na chvíľu späť, a naozaj, je rozbiť.
Ale prečo je to? Možno som podelal odkladacie funkciu.
Možno, že je to a, b Tak nejako neviem, pohybujúce sa okolo nich správne.
Nechaj ma ísť ďalej a robiť to.
Skôr než len spustiť buggy3 dovoľte mi, aby som miesto spustenie tohto programu GDB,
a ja poviem to spustiť buggy3,
a budem zahŕňať príkazového riadku argumentu,-TUI,
a dáme to v budúcich problémov pri špec pripomenúť.
A teraz táto čierna a biela rozhranie objavilo sa, že opäť,
je trochu ohromujúci na prvý, pretože tam je všetko
Informácie o záruke tu, ale aspoň je tu niečo spájalo.
V hornej časti okna je môj skutočný kód,
a keď som prechádzať sem dovoľte mi, aby som prejdite na samom vrchole môjho súboru,
a naozaj, tam je buggy3.c, a všimnite si, v dolnej časti tohto okna
Mám GDB riadku.
>> To nie je rovnaká ako normálnemu John Harvard riadku.
To je výzva, čo sa deje, aby mi dovolil riadiť GDB.
GDB je debugger.
Debugger je program, ktorý vám umožní prejsť
prevedenie vášho programu riadok po riadku po riadku,
pozdĺž spôsobom robiť, čo chcete s programom,
aj volanie funkcií, alebo hľadáte, je ešte dôležitejšie,
Na rôznych premenné hodnoty.
Poďme ďalej a urobiť to.
Chystám sa ísť dopredu a zadajte behu na riadku gdb je,
tak zistíte v ľavom dolnom rohu na obrazovke som napísal bežať,
a ja som stlačte klávesu Enter, a čo to bolo?
Je to doslova bežal môj program, ale ja som robil nie vlastne vidieť veľa ďalej tu
preto, že som vlastne povedal ladiaci
pozastaviť v určitom okamihu v čase.
Len zadaním beh spustí program.
Nemám vlastne nič vidieť. Nemôžem s ním manipulovať.
>> Namiesto toho nechajte ma to urobiť.
V tomto GDB riadku, dajte mi miesto zadajte pauzu, zadajte.
To nie je to, čo som chcel napísať.
Poďme namiesto toho napíšte prestávka hlavné.
Inými slovami, chcem nastaviť niečo, čo nazýva zarážka,
ktorý je vhodne pomenovaný pretože to sa zlomí alebo pozastavenie
vykonávanie programu na príslušnom mieste.
Hlavné je názov mojej funkcie.
Všimnite si, že GDB je celkom šikovný.
To prišiel na to, že hlavné stane, kto hrubo na riadku 18
z buggy3.c, a potom zistíte tu vľavo hore
b + je hneď vedľa riadku 18.
To je mi pripomenul, že som si nastaviť zarážku na riadku 18.
Tentoraz, keď som typ beh, budem bežať môj program
až kým nenarazí, že zarážku,
takže program bude pauza pre mňa na riadku 18.
Ideme na to, spustiť.
Nič Zdá sa, že sa stalo, ale s výpovednou lehotou vľavo dole
spustenie programu, buggy3, breakpoint 1 v hlavnej na riadku buggy3.c 18.
Čo môžem robiť?
>> Všimnite si, môžem začať písať veci, ako je tlač,
nie je printf, tlač x, a teraz to je divné.
$ 1 je len zvedavosť, ako uvidíme
pri každej tlači niečo, čo ste si nový $ hodnotu.
To je tak, že môžete sa vrátiť späť na predchádzajúce hodnoty len v prípade,
ale teraz to, čo na plátne mi hovorí, je, že hodnota x v tomto bode príbehu
je zrejme 134514032.
Čo? Kde sa to dokonca pochádzať z?
[Nepočuteľné-študent]
Naozaj, toto je to, čo budeme hovoriť na odpadky hodnotu, a my sme nehovorili o tom ešte,
ale z dôvodu, že by ste ju inicializovať premenné
je samozrejme tak, že majú nejakú hodnotu, ktorú chcete ich mať.
Ale úlovok je pripomenúť, že môžete deklarovať premenné
ako som to urobil pred chvíľou v mojom sigma napríklad
bez toho by sa skutočne dáva im hodnotu.
Spomeňte si, čo som urobil tu v sigma.
Vyhlásil som n, ale akú cenu som dať?
Žiadne, pretože som vedel, že v najbližších niekoľkých riadkov
GetInt sa bude starať o probléme uvedenie hodnoty vnútri n
>> Ale v tomto bode v príbehu riadku 11
a riadok 12 a riadok 13 a riadok 14
počas tých niekoľkých riadkov, čo je hodnota n?
V jazyku C si jednoducho neviem.
Je to všeobecne nejaký smetiarske hodnota, niektoré úplne náhodné číslo
, Ktorý je v podstate ostali z niektorej predchádzajúcej funkcie
ktoré prebehli, tak váš program beží
Pripomínam, že funkcia dostane funkcie, funkcie, funkcie.
Všetky tieto snímky si dať na pamäti, a potom tie funkcie návrate,
a rovnako ako som navrhol s gumou ich pamäť je nakoniec znovu použiť.
No, to len tak sa stane, že táto premenná x v tomto programe
Zdá sa, že obsahuje nejaké odpadky hodnotu ako 134514032
z nejakého predchádzajúcej funkcie, nie ten, ktorý som napísal.
Mohlo by to byť niečo, čo prichádza účinne s operačným systémom,
niektoré funkcie pod kapotou.
>> Dobre, to je v poriadku, ale poďme sa teraz postúpiť na ďalší riadok.
Ak som typ "next" na mojej GDB riadku a ja stlačte klávesu Enter,
Všimnite si, že zvýraznenie sa presunie dole na riadok 19,
ale logické implikácie je, že linka 18
Teraz po spustení, takže keď som zase písať "print x"
Mal by som teraz vidieť 1, a naozaj, ja.
Opäť, $ veci je spôsob, ako GDB vám pripomenie
čo histórie tlače, že ste urobil.
Teraz ma nechaj ísť ďalej a vytlačiť y, a naozaj, y je nejaký blázon hodnota rovnako,
ale žiadny veľký problém, pretože v súlade 19 sa chystáme prideliť
hodnota 2, tak mi dovoľte zadajte "next" znova.
A teraz sme na printf riadku.
Dovoľte mi, aby som to tlačové x.
Dovoľte mi, aby som to tlačovú y. Úprimne povedané, ja začínam trochu unavený z tlače to.
Dovoľte mi, aby som namiesto toho napíšte "displeja X" a "displeja y,"
a teraz zakaždým, keď som zadajte príkaz v budúcnosti
Budem pripomenul, čo je x a y, čo je x a y, čo je x a y.
>> Môžem tiež, ako vyňatie pôdy z produkcie, typ "info Locals."
Info je špeciálny príkaz.
Miestne znamená, že mi ukazuje lokálne premenné.
Len v prípade, keď zabudnem, alebo je to blázon, komplikovaná funkcie
že ja alebo niekto iný napísal info obyvatelia vám povie,
aké sú všetky lokálne premenné vnútri tejto lokálnej funkcie
ktoré by vás mohli záleží, ak chcete hrabať okolo.
Teraz, printf sa chystá vykonať, tak nechajte ma ísť dopredu a len typu "next".
Vzhľadom k tomu, že sme v tomto prostredí sme v skutočnosti videl to
vykonávať sem, ale všimnete, že to začína byť trochu rozbité tu.
Všimnime si ale, že to prevažujúci obrazovku tam,
takže to nie je ideálne program tu, ale to je v poriadku, pretože som si vždy hrabať okolo
pomocou tlače, keď chcem.
>> Dovoľte mi, aby som zadajte ďalšie zase, a teraz je tu zaujímavá časť.
V tomto bode príbehu y je 2, a x je 1,
ako navrhuje tu, a znova,
Dôvod, prečo sa automaticky zobrazuje je teraz, pretože som použil príkaz
Displej x a y displej, takže vo chvíli, keď píšem ďalšie
v Teória X a Y by sa mal stať vymenil.
Teraz už vieme, že to nebude ten prípad,
ale uvidíme za chvíľu, ako môžeme ponoriť hlbšie sa zistiť, prečo to je pravda.
Ďalšie, a bohužiaľ, y je stále 2 a x je stále 1, a môžem potvrdiť, ako moc.
Tlač x, y tlače.
Skutočne, žiadny odkladanie sa skutočne stalo, takže poďme začať to znova.
Je zrejmé, swap je rozbité.
Poďme namiesto toho napíšte "Spustiť".
Dovoľte mi povedať áno, chcem reštartovať od začiatku, zadajte.
>> Teraz som späť na riadku 18.
Teraz všimnete x a y sú odpadky hodnoty znovu.
Ďalej, ďalší, ďalší, ďalší.
Keby som nudiť môžem tiež len typ N pre ďalšie.
Môžete ho skrátiť na najkratšiu možnú postupnosť znakov.
Swap je teraz rozdelené.
Poďme ponor, takže miesto písania ďalšie,
teraz budem písať krok tak, že som posilnenie vnútri tejto funkcie
takže môžem prejsť, takže som narazila krok a potom zadajte.
Všimnite si, že upozorňovať na skoky stanovuje nižšie v mojom programe na riadok 36.
Tak aké sú lokálne premenné?
Info Locals.
Nič zatiaľ, pretože sme nedostali k tejto priamke,
tak poďme ďalej a hovoriť "next".
Teraz sa zdá, že majú TMP, tlač tmp.
Garbage hodnota, nie? Myslím, že áno.
Ako asi vytlačiť, tlačové B, 1 a 2?
V okamihu, keď som typ next znova
tmp bude trvať na hodnotu 1, dúfajme,
pretože tmp sa bude priradená hodnota.
>> Teraz poďme si vytlačiť, tlačové b,
ale teraz tlačiť tmp, a to je naozaj 1.
Nechaj ma robiť ďalej. Nechaj ma robiť ďalej.
Dokončil som odkladacie funkciu.
Som stále vo vnútri nej v riadku 40, tak mi dovoľte tlače,
print b, a je mi jedno, čo tmp je.
Vyzerá to, že swap je správne, pokiaľ ide o zámenu a a b
Ale keď som teraz písať ďalej, som skočiť späť na riadok 25,
a samozrejme, ak zadám do x a y tlače
sú stále bez zmeny, takže sme ani opravený problém.
Ale diagnosticky teraz možno s týmto programom GDB
sme aspoň dostali o krok bližšie k pochopeniu
čo sa deje zle, bez toho aby museli vrhu náš kód tým, že printf tu,
printf tu, printf tu a potom ju spustiť znovu a znovu
sa snaží prísť na to, čo sa deje zle.
>> Chystám sa ísť dopredu a ukončite z toho úplne s ukončite.
Bude to potom povedať, "Quit vlastne je?" Áno.
Teraz som späť v mojom bežnom riadku, a ja som urobil pomocou GDB.
Ako stranou, nemusíte používať tento-Tui vlajkou.
V skutočnosti, ak ho vynecháte dostanete v podstate dolnú polovicu obrazovky.
Keby som zadajte prestávka hlavné a potom spustite
Aj stále môžete spustiť svoj program, ale čo to bude robiť je viac textovo
Len mi ukáž aktuálny riadok jeden po druhom.
-Tui, textová užívateľské rozhranie,
Len ukazuje viac programu naraz, čo je asi trochu koncepčne jednoduchšie.
Ale naozaj, môžem len robiť ďalej, budúci, ďalší,
a ja idem vidieť jeden riadok naraz, a ak chcem naozaj vidieť, čo sa deje
Môžem písať zoznam a uvidíte veľa susedných riadkov.
>> Tam je video, ktoré sme požiadali, aby sa budete pozerať na problém sady 3
, V ktorom Nate zahŕňa niektoré zložitosti GDB,
a to je jedna z tých vecí, úprimne, kde niektorí non-triviálne percento z vás
Nikdy sa nedotýkajte GDB, a že bude zlé
pretože doslova skončí tráviť viac času v priebehu tohto semestra
naháňa chyby, potom by ste, ak ste vložili do tejto polhodine / hod
tento týždeň a učenia sa dostať pohodlne s GDB.
Printf bol tvoj priateľ.
GDB by teraz mala byť tvoj priateľ.
>> Akékoľvek otázky týkajúce sa GDB?
A tu je stručný prehľad niektorých z najmocnejších a užitočné príkazy.
Jo. >> Možno vytlačiť reťazec?
Môžete vytlačiť reťazec? Absolútne.
Nemusí to byť len celé čísla.
Ak je premenná y je reťazec stačí zadať tlač s
To vám ukáže, čo sa tento reťazec premenná je.
[Nepočuteľné-študent]
To vám dá adresu a reťazec sám.
To vám ukáže, ako.
A posledná vec, len preto, že sa jedná o dobré vedieť taky.
Backtrace a rám, dovoľte mi, aby som sa ponoriť do tohto jedného minule,
rovnaký presný program s GDB.
Nechaj ma ísť napred a spustiť textovú verziu užívateľského rozhrania,
rozbiť hlavné.
Nechaj ma ísť napred a znovu spustiť. Tu som.
Teraz ma nechaj ísť nabudúce, nabudúce, nabudúce, nabudúce, nabudúce, krok, zadajte.
>> A teraz, že som teraz v swapu zámerne, ale ja na to: "Sakra, čo bola hodnota x?"
Nemôžem x už.
Nemôžem y, pretože to nie je v pôsobnosti.
Sú to v kontexte, ale žiadny problém.
Môžem písať backtrace.
To ukazuje mi všetky funkcie, ktoré boli vykonané až do tohto bodu v čase.
Všimnite si, že jeden na dne, hlavné, zoradia sa hlavné
je na spodnej strane našom obrázku tu.
Skutočnosť, že swap je nad ňou vedenie s odkladacou že nad ním v pamäti tú,
a keď chcem vrátiť na hlavnú dočasne môžem povedať "rám."
Aké číslo? Hlavné je rám # 1.
Chystám sa ísť dopredu a povedať: "frame 1."
>> Teraz som späť v hlavnom, a môžem tlačiť x, a môžem vytlačiť y,
ale nemôžem vytlačiť alebo b
Ale môžem, keď poviem: "Dobre, počkajte. Kde je swap?"
Nechaj ma ísť ďalej a povedať, "frame 0".
Teraz som tam, kde chcem byť, a ako stranou,
je tu ďalšie príkazy taky, ako keď ste naozaj nudiť písanie ďalší, ďalší, ďalší, ďalší,
možno všeobecne povedať, veci ako "ďalší 10," a že sa bude pohybovať po ďalších 10 riadkov.
Môžete tiež napísať "pokračovať", keď naozaj vám dosť s krokovým cez to.
Pokračovať bude spustite program bez prerušenia, kým nenarazí ďalšie zarážku,
či už v slučke alebo nižšia dole vo vašom programe.
>> V tomto prípade sa pokračuje až do konca, a program ukončený normálne.
To je ozdobný spôsob, nižšia proces.
Len váš program ukončený normálne.
Viac o ktoré vo videu a ladenie zasadnutí prísť.
To bolo veľa.
Poďme vziať našu 5-minút prestávku tu, a vrátime sa structs a súbory.
>> Ak ste sa ponorila do tohto týždňa PSet už
budete vedieť, že budeme používať v distribučnom kódu,
zdrojový kód, ktorý sme Vám poskytli ako východiskový bod, niektoré nové techniky.
Najmä, sme zaviedli tento nový kľúčové názvom štruktúra, pre konštrukciu,
takže môžeme vytvoriť vlastné premenné druhov.
Zaviedli sme tiež pojem súboru I / O, súboru vstup a výstup,
a to je tak, že sa môže uložiť stav
svojho Scramble palube do súboru na disku
tak, aby učebné chlapi a chápem
čo sa deje vo vnútri vášho programu, bez toho aby ste museli ručne hrať
desiatky hier zhonu.
Môžeme to urobiť viac automatedly.
>> Táto myšlienka struct rieši pomerne presvedčivé problém.
Predpokladajme, že chceme zaviesť nejaký program
že nejako udržuje informácie o študentoch,
a študenti môžu mať, napríklad, ID, názov
a dom na mieste, ako je Harvard, takže sa jedná 3 kusy informácií
Chceme udržať okolo, tak mi dovoľte pokračovať a začať písať trochu program tu,
patrí stdio.h.
Dovoľte mi, aby som to patrí cs50.h.
A potom začať svoj hlavnú funkciu.
Nebudem obťažovať so žiadnymi argumentmi príkazového riadku,
a tu chcem mať študenta, takže som chcel povedať
Študent má meno, tak som chcel povedať, "názov reťazca."
Potom som chcel povedať, študent tiež má ID, takže int id,
a študent má dom, tak som tiež chcel povedať "reťazec dom."
Potom som si objednať to trochu čistejšie takhle.
Dobre, teraz mám 3 premenné, s ktorými sa predstavujú študenta, tak "študenta."
>> A teraz chcem naplniť tieto hodnoty, tak nechajte ma ísť napred a povedal niečo ako
"Id = 123".
Meno dostane Davida.
Povedzme, že dom dostane Mather,
a potom budem robiť niečo svojvoľne ako printf ("% s,
ktorého ID je% d, žije v% s
A teraz, čo chcem pripojiť tu, jednu po druhej?
Meno, id, dom; return 0.
Dobre, ak som to podelal niekde tu
Myslím, že máme celkom dobrý program, ktorý ukladá jeden študent.
Samozrejme, že to nie je tak zaujímavé. Čo keď chcem mať 2 študentov?
To nie je veľký problém. Môžem podporiť 2 ľudí.
Nechaj ma ísť napred a zdôrazniť to a ísť sem dole,
a môžem povedať, "id = 456" pre niekoho, ako je Rob, ktorý žije v Kirkland.
>> Dobre, počkajte, ale nemôžem volať je to isté,
a vyzerá to, že budem musieť kopírovať to,
tak mi dovoľte povedať, že sa bude jednať o Dávidovi premenné,
a dovoľte mi, aby som niektoré kópie týchto pre Roba.
Zavoláme to Rob, ale to nebude fungovať hneď
preto, že som-počkať, zmeňme ma ID1, name1 a house1.
Rob bude 2, 2.
Musím zmeniť tu, tu, tu, tu, tu, tu.
Počkajte, čo Tommy? Poďme to urobiť znova.
Samozrejme, ak si stále myslíte, že je to dobrý spôsob, ako robiť to, nie je to,
takže kopírovať / vložiť zlé.
Ale my sme to vyriešil pred týždňom.
>> Čo bolo naše riešenie, keď sme chceli mať viac inštancií rovnakého dátového typu?
[Študenti] poľa.
Pole, takže skúsim vyčistiť toto hore.
Dovoľte mi, aby som určitý priestor pre seba v hornej časti, a dovoľte mi, aby som namiesto toho to tu.
Ak budeme si týchto ľudí, a namiesto toho budem hovoriť "int id,"
a budem podporovať 3 z nás teraz.
Ja poviem "názvy reťazcov," a ja podporovať 3 z nás,
a potom som chcel povedať, "reťazec domy," a budem podporovať 3 z nás.
Teraz tu miesto David dostať svoje vlastné lokálne premenné
môžeme zbaviť tých.
Že sa cíti dobre, že sme čistenie to až.
Potom môžem povedať, David bude [0] a názvy [0]
a domy [0].
A potom Rob môžeme podobne ušetriť na túto tému.
Poďme dať to sem, takže to bude ľubovoľne bude ids [1].
On to bude mena [1],
a potom konečne domy [1].
>> Stále trochu nudné, a teraz musím prísť na to,
takže povedzme "mena [0], id [0], domy [0],
a poďme pluralize to.
IDS, IDS, IDS.
A opäť, robím to, tak znova, som už uchyľovať kopírovať / vložiť znova,
takže šance sú tam iné riešenie tu.
Ja si asi vyčistiť to ešte vyššie, sa slučkou, alebo niečo také,
Takže v skratke, je to trochu lepšie, ale stále sa cíti ako
Ja sa uchyľovať k kopírovať / vložiť, ale aj to, tvrdím,
nie je naozaj zásadne správne riešenie, pretože
čo keď niekedy sa rozhodneme viete čo?
By sme mali byť uloženie e-mailovej adresy pre Davida a Rob
a všetci ostatní v tomto programe.
Mali by sme tiež ukladať telefónne čísla.
Mali by sme tiež ukladať čísla tiesňového kontakt.
Máme všetky tieto kúsky dát, ktoré chcete uložiť,
tak ako sa vám ísť o tom, že?
>> Môžete deklarovať ďalšie pole v hornej časti, a potom ručne pridať
e-mailová adresa [0], e-mailová adresa [1]
Dávidovi a Rob a tak ďalej.
Ale je to naozaj len predpoklad, z ktorého tento design
že som pomocou česť systém vedieť, že
[I] v každej z niekoľkých polí
len tak náhodou odkazovať na rovnakú osobu,
takže [0] v IDS je číslo 123,
a budem predpokladať, že mená [0]
je tá istá osoba meno a domy [0]
je tá istá osoba dom a tak ďalej pre všetky z rôznych polí, ktoré som vytvárajú.
Všimnime si ale, že to nie je zásadný väzba
medzi tie 3 kusy informácií, id, meno a dom,
aj keď účtovná jednotka sa snažíme vzoru v tomto programe nie je pole.
Polia sú práve tento programový spôsob, ako to dosiahnuť.
Čo naozaj chceme modelovať v našom programe, je osoba,
podobne ako David, človek ako Rob vnútri, ktoré
alebo zapuzdrenie je meno a ID a dom.
>> Môžeme nejako vyjadriť túto myšlienku zapuzdrenie
keď človek má ID, meno a dom
a nie sa uchýliť k naozaj hack, kedy sme len
verím, že konzola niečo
odkazuje na rovnaký ľudskej entity v každej z týchto rôznorodých polí?
Môžeme skutočne urobiť.
Nechaj ma ísť nad hlavným teraz, a dovoľte mi, aby som vytvoriť svoj vlastný dátový typ
pre naozaj prvýkrát.
Využili sme túto techniku ​​v Scramble,
ale tu budem pokračovať a vytvoriť dátový typ,
a viete čo, budem to nazývať študent alebo osoba,
a budem používať typedef pre definíciu typu.
Chystám sa povedať, že je to štruktúra,
a potom táto štruktúra bude typu študenta, budeme hovoriť,
aj keď je to trochu z teraz pre mňa.
Povieme "int id."
Povieme "názov reťazca."
Potom budeme hovoriť "string dom,"
tak odteraz do konca týchto pár riadkov kódu
Práve som učil rinčanie, že existuje
dátový typ okrem ints, okrem reťazcov, okrem zdvojnásobí, okrem plaváky.
>> Od tejto chvíle v časovej línii 11, je teraz nový dátový typ nazvaný študentov,
a teraz môžem vyhlásiť, študentské premennú kdekoľvek chcem,
tak mi dovoľte prejdite sem ľudí.
Teraz môžem zbaviť toho, a môžem ísť späť dole k Dávidovi tu,
a pre Davida môžem skutočne povedať, že David,
môžeme doslova pomenovať premenné po sebe,
bude typu študenta.
To by mohlo vyzerať trochu divne, ale to nie je všetko, že rôzne
od vyhlásenia niečo ako int alebo reťazec alebo plaváku.
To len tak sa stane, byť nazývaný študenta teraz,
a keď chcem, aby niečo vo vnútri tejto štruktúry
Teraz mám použiť nový kus syntaxe, ale je to celkom jednoduché,
david.id = 123, david.name = "David" v hlavnom D,
a david.house = "Mather,"
a teraz môžem zbaviť tejto veci tu.
Všimnite si, že sme teraz prerobila náš program naozaj oveľa lepšie
v tom, že teraz náš program kopíruje reálny svet.
>> Tam je real-svet pojem osoby alebo študenta.
Tu máme teraz verzii C osoby alebo presnejšie študenta.
Vnútri tejto osoby sú tieto rozhodujúce vlastnosti,
ID, názov a dom, tak Rob podstate stáva to isté tu dole,
tak študenti rob, a teraz rob.id = 456,
rob.name = "Rob."
Skutočnosť, že premenná sa nazýva Rob je trochu nezmyselné.
Mohli sme hovorili, že je x alebo y alebo z.
Práve sme sa volal to Rob byť sémanticky konzistentné,
ale v skutočnosti meno je vo vnútri tejto oblasti sám,
takže teraz mám toto.
To tiež nie je cítiť sa ako najlepší dizajn v tom, že som pevný kódované David.
Ja som pevný kódované Roba.
A ešte musím uchýliť k nejakej skopírujte a vložte zakaždým Chcem nové premenné.
Navyše som si zrejme mal každý z týchto premenných meno,
aj keď by som oveľa radšej popisovať tieto premenné
viac druhovo ako študenti.
>> Teraz môžeme zlúčiť myšlienky, ktoré funguje dobre pre nás
a namiesto toho povedal: "Vieš čo, daj mi premennú s názvom študentov,
a poďme sa to byť o veľkosti 3, "takže teraz môžem upresniť to ďalej,
zbaviť ručne deklarované David,
a môžem namiesto toho povedal niečo ako študentov [0] tu.
Potom môžem povedať, študentov [0] tu,
študenti [0] tu, a tak ďalej, a môžem ísť okolo
a vyčistiť, aby sa pre Roba.
Mohol by som tiež ísť o teraz možná pridaním slučky
a pomocou GetString a GetInt skutočne dostať tieto hodnoty od užívateľa.
Mohol by som ísť o pridanie konštanta, pretože to je všeobecne zlá prax
na pevný kód niektoré ľubovoľné číslo ako 3 tu
a potom už len na pamäti, že by ste mali dať viac ako 3 študentov v ňom.
Bolo by asi bolo lepšie použiť # define v hornej časti môjho súboru
a faktor, ktorý sa, tak naozaj, nechajte ma ísť napred a zovšeobecniť toto.
>> Dovoľte mi, aby som otvoriť príklad, ktorý je medzi dnešnej
Príklady vopred, structs1.
To je viac kompletný program, ktorý používa # define sem
a hovorí, že budeme mať 3 študentov v predvolenom nastavení.
Tu som sa prehlasuje, že triedny cenu študentov,
takže učebňa študentov, a teraz som s použitím slučky
len preto, aby sa kód trochu viac elegantný, naplniť triedu
s vstup užívateľa, tak určiť iteráciou od i = 0 až na študentov, čo je 3.
A potom som vyzve užívateľa v tejto verzii
Čo je študenta ID, a ja si to s GetInt.
Čo je na meno študenta, a potom som si to s GetString.
Čo je na študenta dom? Chápem to s GetString.
A potom v dolnej tu som sa rozhodol zmeniť
ako som tlač týchto, a skutočne používať slučky,
A kto som ja tlač?
Podľa komentármi som tlač nikoho v Mather,
a je to tak Roba a Tommym a tak ďalej, vlastne Tommy je v Mather.
Tommy a David by byť vytlačené v tomto prípade, ale ako je to pracuje?
Nevideli sme túto funkciu skôr, ale hádať o tom, čo to robí.
Porovná reťazca.
>> Je to trochu iné ako zrejmé, ako sa porovnáva reťazca, pretože sa ukazuje,
ak sa vráti 0 to znamená, že reťazce sú zhodné.
Ak sa vráti -1 to znamená, že niekto príde abecedne skôr ako ten druhý,
a ak je to vráti 1 to znamená, že ďalšie slovo príde abecedne
skôr ako ten druhý, a môžete sa pozrieť na internete alebo v manuálové stránky
presne zistiť, akým spôsobom je ktorý, ale toto všetko je teraz robí, je to hovorí
v prípade, že [i]. dom sa rovná "Mather"
potom ísť dopredu a vytlačiť tak, a tak je v Mather.
Ale tu je to niečo, čo sme ešte nevideli, a vrátime k tomu.
Nespomínam si, že by bolo potrebné vykonať v niektorej z mojich programov.
Zdarma je zrejme odkazuje na pamäti, uvoľnenie pamäte,
ale čo pamäte som zrejme uvoľní v tejto slučky v spodnej časti tohto programu?
Vyzerá to, že som uvoľnenie meno osoby
a osoba je dom, ale prečo je to?
>> Ukázalo sa, že vo všetkých týchto týždňov, ktoré ste doteraz používali GetString
sme trochu bolo zavedenie chybu v každom z vašich programov.
GetString pamäťou návrhu prideľuje tak, aby sa mohli vrátiť k vám reťazca,
ako David, alebo Rob, a potom môžete robiť, čo chcete,
s týmto reťazcom vo vašom programe, pretože sme vyhradené pamäť pre vás.
Problém je všetko tentoraz pri každom volaní GetString
my, autori GetString, sa pýta, operačný systém
aby nám trochu RAM pre tohto reťazca.
Dajte nám trochu RAM pre túto ďalšiu reťazca.
Dajte nám trochu viac pamäte RAM pre túto ďalšiu reťazca.
Čo ste, programátor, nikdy robil
dáva nám, že pamäť späť,
tak pre tých niekoľko týždňov všetky programy, ktoré ste napísali
mali, čo sa nazýva pamäťový skok, ktorým sa naďalej používať
viac a viac pamäte zakaždým, keď budete volať GetString, a to je v poriadku.
Zámerne sme sa tomu, že v prvých týždňoch, pretože to nie je tak zaujímavé
mať na starosti o tom, kde je reťazec pochádza.
Všetko, čo chcem, je slovo, Rob sa vrátil keď používateľ zadá ju dovnútra
>> Ale dopredu teraz musíme začať sa viac dômyselný o tom.
Kedykoľvek sa alokovať pamäť môžeme lepšie nakoniec odovzdať ho späť.
Inak v reálnom svete na vašom počítači Mac alebo PC môžete mať občas skúsených
príznaky, kde je počítač brúsenie k zastaveniu nakoniec
alebo hlúpy točiace plážová lopta práve okupuje počítač je
Celá pozornosť a nemôžete robiť veci.
To sa dá vysvetliť tým, ľubovoľný počet chýb, ale medzi tie prípadné chyby
sú veci, tzv úniky pamäti, kedy niekto, kto písal ten kus softvéru
Používate nepamätal na voľnej pamäte
že on alebo ona požiadala operačný systém pre,
nepoužívate GetString, pretože to CS50 vec, ale pomocou podobné funkcie
že požiadať operačný systém pre pamäte.
Ak vy alebo oni skrutku a nikdy skutočne vráti, že pamäť
príznak, ktorý môže byť, že program, spomaľuje a spomaľuje a spomaľuje
ak si spomeniete, volať zadarmo.
>> Vrátime sa, kedy a prečo by ste volať zadarmo,
ale poďme toho len dobré opatrenia a pokúste sa spustiť tento konkrétny program.
Toto bolo nazývané structs1, zadajte.
Nechaj ma ísť napred a spustiť structs1, 123, David Mather,
456, Rob Kirkland, 789,
Tommy Mather, a vidíme Davida v Mather, Tommy je v Mather.
To je len malý rozum skontrolujte, či program pracuje.
Teraz, bohužiaľ, tento program je trochu frustrujúce v tom, že
Ja som všetko, čo práca, som napísal v 9 rôznych reťazcov, stlačte klávesu Enter,
Bolo mi povedané, kto bol v Mather, ale samozrejme som vedel, kto bol v Mather už preto, že som ju zadali.
Bolo by pekné, keby aspoň tento program je viac ako databáza
a vlastne si pamätá, čo som napísal v
takže som nikdy musieť zadávať tieto záznamy o študentoch.
Možno je to ako registrarial systému.
>> Môžeme to urobiť pomocou tejto techniky známej ako súbor I / O, súboru vstup a výstup,
veľmi všeobecný spôsob, ako povedať, kedykoľvek budete chcieť čítať alebo zapisovať súbory
môžete to urobiť s určitou sadu funkcií.
Nechaj ma ísť napred a otvorte tento príklad structs2.c,
ktorá je takmer totožná, ale uvidíme, čo to teraz robí.
V hornej časti súboru Prehlasujem triedu študentov.
Potom som naplniť triedy s vstup užívateľa,
takže tie riadky kódu sú presne ako predtým.
Potom keď som nalistujte tu vytlačiť každý, kto je v Mather ľubovoľne ako predtým,
ale to je zaujímavá nová funkcia.
Tieto riadky kódu sú nové, a oni predstaví tu niečo,
OBRÁZOK, všetky veľké písmená, a to má * tu rovnako.
Dovoľte mi prejsť to tu, a * tu tiež.
>> Táto funkcia sme nevideli, fopen,
ale to znamená súbor otvorený, takže sa poďme prelistovať nich,
a to je niečo, čo sa vrátime v najbližších psets,
ale táto linka tu v podstate otvorí súbor s názvom databázy,
a to konkrétne otvorí to takým spôsobom, že môže robiť to, čo do nej?
[Nepočuteľné-študent]
Dobre, tak "w" jednoducho znamená, že to hovorí operačný systém
otvorenie tohto súboru takým spôsobom, že nemôžem zapisovať.
Nechcem si ho prečítať. Nechcem, aby na neho len pozrú.
Chcem to zmeniť a pridať veci potenciálne k nemu,
a súbor sa bude nazývaný databázy.
To by mohlo byť nazývaný nič.
To by mohlo byť database.txt. To by mohlo byť. Db.
To by mohlo byť slovo ako foo, ale ja som svojvoľne zvolila názov súboru databázy.
To je trochu rozumu kontrola, či sa vrátime do veľmi podrobne v priebehu času,
ak fp, pre tento súbor ukazovateľ, nie je rovnaký NULL to znamená, že je všetko v poriadku.
>> Dlhý príbeh krátky, funkcie ako fopen niekedy nedarí.
Možno súbor neexistuje. Možno ste z disku.
Možno nemáte oprávnenie k tejto zložke,
takže ak fopen vráti null niečo zlé stalo.
Naopak, ak fopen nevráti null všetko je v poriadku
a môžem začať písať do tohto súboru.
Tu je nový trik.
To je pre slučky, ktorý je iterácia nad každým z mojich študentov,
a to vyzerá tak podobné tomu, čo sme robili predtým,
ale táto funkcia je bratranec printf vyzvala fprintf pre súbor printf,
a všimnite si, že je to iný iba vo 2 spôsobmi.
Jeden, začína f miesto p,
ale potom jeho prvý argument je zrejme to, čo?
[Študenti] súboru. >> Je to súbor.
To, čomu sa hovorí fp, ktoré budeme nakoniec šprýmař oddelene, čo súbor je ukazovateľ,
ale teraz fp predstavuje len súbor, ktorý som otvoril,
tak fprintf tu hovorí vytlačiť tento návod ID do súboru, nie na obrazovke.
Vytlačte meno užívateľa do súboru, nie na obrazovke,
dom do súboru, nie na obrazovke, a potom tu dole, samozrejme,
zatvorte súbor, a potom sem bez pamäti.
>> Jediný rozdiel medzi touto verziou 2 a verzia 1
je zavedenie funkcie fopen, a to súbor s príponou *
a tento pojem fprintf, takže sa poďme pozrieť, čo konečný výsledok je.
Nechaj ma ísť do môjho terminálovom okne.
Dovoľte mi, aby som bežať structs2, zadajte.
Vyzerá to, že je všetko v poriadku. Poďme spustite structs2.
123, David Mather, 456, Rob Kirkland,
789, Tommy Mather, zadajte.
Vyzerá to, že sa správal rovnako, ale keď som teraz robiť ls
upozornenie, čo súbor, je tu medzi všetkými mojom kódu, databázy,
takže sa poďme otvoriť, gedit databázy, a pozri sa na to.
Nie je to sexy formátov súborov.
Je to naozaj jeden kus dátové linky na linku na riadok,
ale tí z vás, ktorí používajú aplikácie Excel alebo CSV súborov, oddelených čiarkou hodnoty,
Mohol som samozrejme použil fprintf miesto toho možno urobiť niečo také
takže som mohol skutočne vytvoriť ekvivalent súboru programu Excel
oddelením veci s čiarkami, nie len nové linky.
>> V tomto prípade, ak by som mal namiesto toho používať čiarky namiesto nových liniek
Mohol by som doslova otvoriť tento súbor databázy v programe Excel, ak som miesto, aby to vyzeralo takto.
Stručne povedané, teraz, že máme silu písať k súborom
teraz môžeme začať pretrvávajúce údaje, držať to asi na disk
takže môžeme uchovávať informácie okolo znova a znova.
Všimnite si pár ďalších vecí, ktoré sú v súčasnej dobe trochu známejší.
V hornej časti tohto súboru C máme typedef
pretože sme chceli vytvoriť dátový typ, ktorý predstavuje slovo,
tak tento typ sa nazýva slovo, a vnútri tejto štruktúry
je to trochu obsiahlejší teraz.
Prečo je slovo skladajúci sa z zdanlivo poľa?
Čo je slovo len intuitívne?
>> Je to pole znakov.
Je to postupnosť znakov, chrbtom k sebe k sebe.
LISTY vo všetkých uzáverov sa stane, že sme svojvoľne povedať, maximálna dĺžka
akékoľvek slovo v slovníku, že sme pomocou pre Scramble.
Prečo mám 1?
Null znak.
Pripomeňme, keď sme si príklad Bananagrams sme potrebovali osobitnú hodnotu
na konci slova, aby sa sledovať
, Kde slová skutočne skončil, a ako problém set špecifikácia hovorí
tu sme spájali s dané slovo logickú hodnotu,
vlajka, aby som tak povedal, true alebo false.
Našli ste toto slovo už preto, že si uvedomujeme,
Naozaj potrebujeme spôsob, ako si pamätať nielen to, čo slovo je v Scramble
ale či alebo nie vy, človek, našli ho
takže ak zistíte, že slovo "len", môžete nielen zadajte, zadajte, že, zadajte, že, zadajte
a získať 3 body, 3 body, 3 body, 3 body.
Chceme byť schopní na blacklist, že slovo nastavením bool
na hodnotu true, ak ste už našiel, a tak to je dôvod, prečo sme
zapuzdrené to v tejto štruktúre.
>> Teraz, tu v Scramble tam je to iné struct hovorí slovník.
Neprítomnosť tu je slovo typedef, pretože v tomto prípade
sme potrebovali k zapuzdrenie myšlienku slovníka,
a slovník obsahuje veľa slov,
ako vyplýva z tohto poľa, a koľko z týchto slov sú tam?
No, nech je táto premenná nazýva veľkosť hovorí.
Ale my to jednoducho potrebujeme jeden slovník.
Nepotrebujeme dátový typ zvaný slovník.
Potrebujeme len jeden z nich, tak to dopadá v C
že ak nechcete povedať typedef, stačí povedať struct, potom vnútri zložených zátvoriek
môžete dať svoje premenné, potom dal meno.
Toto je prehlasuje jeden variabilný s názvom slovník
, Ktorá vyzerá takto.
Naopak, tieto riadky sú vytváranie opakovane použiteľných dátovú štruktúru nazvanú slovo
že môžete vytvoriť viac kópií, rovnako ako sme vytvorili
viac kópií študentov.
>> Čo to v konečnom dôsledku nám umožňujú robiť?
Nechaj ma ísť späť do, povedzme, jednoduchší príklad z jednoduchších časov,
a dovoľte mi, aby som otvoriť, povedzme, compare1.c.
Problém je tu po ruke, je skutočne šupkou späť
vrstva reťazca a začnete off týchto školení kola
pretože sa ukázalo, že reťazec celú dobu
je, ako sme sľúbili v týždni 1 naozaj len prezývku,
synonymum od CS50 knižnice po niečom, čo vyzerá trochu tajomná,
char *, a my sme videli túto hviezdu pred.
Videli sme to v rámci súborov.
>> Poďme sa teraz, prečo sme sa skrýval tento detail nejakú dobu.
Tu je súbor s názvom compare1.c,
a to zrejme žiada užívateľa o 2 reťazca, s a t,
a potom sa snažia porovnávať tieto reťazce pre rovnosť v súlade 26,
a ak sú rovnaké, že hovorí: "Zadali ste to isté,"
a ak to nie je rovné to hovorí, "Zadali ste rôzne veci."
Nechaj ma ísť napred a spustiť tento program.
Nechaj ma ísť do môjho zdrojového adresára, aby sa compare1. Je zostavený v poriadku.
Dovoľte mi, aby som bežať compare1.
Budem priblížite, zadajte.
Povedz niečo. HELLO.
Poviem niečo znova. HELLO.
Rozhodne som nemal písať rôzne veci.
>> Skúsim to znova. BYE BYE.
Rozhodne nie iný, takže to, čo sa tu deje?
No, čo sa naozaj byť porovnané v súlade 26?
[Nepočuteľné-študent]
Áno, tak to ukazuje, že reťazec, dátový typ, je tak trochu lož.
Reťazec je char *, ale to, čo je char *?
Char *, ako sa hovorí, je ukazovateľ,
a ukazovateľ je skutočne adresa,
čiastka umiestnenie v pamäti, a ak ste náhodou zadali v slove, ako HELLO,
stiahnuť z minulých diskusií reťazcov
to je ako slovo HELLO.
Pamätajte si, že slovo ako Hello môže byť reprezentovaná
ako pole znakov, ako je tento
a potom so zvláštnym charakterom na konci nazýva nulový znak,
ako \ vyjadruje,.
Čo je vlastne reťazec?
Všimnite si, že toto je viac kusy pamäti,
a v skutočnosti, je to skončí len známy, akonáhle sa pozriete do celého reťazca
hľadá pre špeciálne nulový znak.
Ale ak je to kus pamäte z môjho počítača pamäte,
poďme ľubovoľne povedať, že tento reťazec jednoducho šťastie,
a to mám umiestnený na samom začiatku môjho počítača RAM.
To je bajt 0, 1, 2, 3, 4, 5, 6 ...
>> Keď poviem, že niečo ako GetString a ja string s = GetString
čo sa naozaj sa vrátil?
U týchto posledných niekoľkých týždňoch, je to, čo naozaj byť uložené v s
nie je tento reťazec sama o sebe, ale v tomto prípade to, čo je uložené, je
číslo 0, pretože to, čo GetString vlastne robí
je nie je fyzicky vráti reťazec.
To nie je vlastne ani robiť koncepčný zmysel.
Čo to urobí, návrat je číslo.
Toto číslo je adresa HELLO v pamäti,
a reťazec je potom, keď sa šupkou späť táto vrstva, reťazec v skutočnosti neexistuje.
Je to len zjednodušenie v CS50 knižnici.
>> To je naozaj niečo, čo nazýva char *.
Char dáva zmysel, pretože to, čo je slovo, ako HELLO?
No, to je séria znakov, rad znakov.
Char * znamená adresu charakteru,
tak čo to znamená vrátiť reťazec?
Pekný, jednoduchý spôsob, ako vrátiť reťazec
je skôr než sa snažiť prísť na to, ako som sa vrátiť do 5 alebo 6 rôznych bajtov
dovoľte mi vrátiť sa na adresu, ktorá byte?
Prvý z nich.
Inými slovami, dovoľte mi, aby som vám adresu znaku v pamäti.
To je to, čo char * predstavuje, adresa jediného znaku v pamäti.
Volať, že premenné s
Skladujte v s, že konkrétnu adresu, ktorú som svojvoľne povedal je 0,
len aby to jednoduché, ale v skutočnosti je to všeobecne väčší počet.
>> Počkajte chvíľku.
Ak ste len, že mi adresu prvého znaku, ako môžem vedieť, čo je adresa
druhého znaku, tretej, štvrtej a piatej?
[Nepočuteľné-študent]
Tie len vedieť, kde na konci reťazca je prostredníctvom tohto šikovného triku,
takže keď použiť niečo ako printf, čo printf doslova berie ako svoj argument,
pripomenúť, že používame tento% s zástupný symbol, a potom odovzdať
premenná, ktorá je ukladanie reťazec.
Čo ste naozaj absolvovaní je adresa prvého znaku tohto reťazca.
Printf potom používa na vedenie alebo slučky while obdržaním tejto adresy,
Napríklad, 0, tak nech ma k tomu teraz,
printf ("% s \ n", s);
Keď hovorím printf ("% s \ n", s); to, čo som naozaj poskytuje printf s
je adresa prvého znaku v s, ktorý je v tomto prípade je ľubovoľné H.
>> Ako printf vedieť, čo presne sa má zobraziť na obrazovke?
Osoba, ktorá vykonáva printf zavedený while alebo pre sláčiky
, Ktorý hovorí, to postava rovnať špeciálny nulový znak?
Ak nie, vytlačte ju. A čo táto?
Ak ho vytlačiť, vytlačte ho, tlačiť, vytlačiť.
Oh, toto je zvláštne. Zastavte tlač a vráťte sa do užívateľa.
A to je doslova všetko, čo sa deje pod kapotou,
a to je veľa stráviť v prvý deň triedy,
ale teraz je to naozaj stavebným kameňom pochopenie všetkého
že sa deje na vnútornej strane našej pamäti počítača,
a nakoniec budeme dráždiť Tento aparthotel s malou pomocou
od jedného z našich priateľov na Stanforde.
>> Profesor Nick Parlante na Stanforde urobil tento úžasný video sekvencie
zo všetkých druhov rôznych jazykoch, ktoré zaviedli
tento malý Claymation charakter Binky.
Hlas, ktorý sa chystáte počuť len niekoľko sekúnd prepašovať náhľad
je to, že z Stanford profesor, a dostaneš
iba 5 alebo 6 sekúnd tohto práva teraz,
ale je to poznámka, na ktorom sa budeme uzatvárať dnes
a začať v stredu.
Dám vám ukazovateľ zábava s Binkym, preview.
[♪ Music ♪] [Profesor Parlante] Ahoj, Binky.
Prebuď sa. Je čas na ukazovateľ zábavu.
[Binky] Čo je to? Ďalšie informácie o ukazovateli?
Oh, dobrota!
>> Uvidíme sa v stredu.
[CS50.TV]