[Powered by Google Translate] [4 savaitė]
[David J. Malan] [Harvardo universiteto]
[Tai CS50.] [CS50.TV]
>> Viskas gerai, tai CS50, ir tai yra 4 savaitės pradžia,
ir tai yra vienas iš lėčiausiai galimų rūšiavimo algoritmų.
Viena iš jų buvo tai, kad mes tiesiog stebėjo?
Tai buvo burbulas rūšiuoti, kad didelis O (n ^ 2) + suma,
ir iš tiesų mes esame ne vieninteliai šiame pasaulyje, atrodo, žinau,
burbulas rūšiuoti yra arba jo veikimo laikas.
Iš tikrųjų, tai buvo interviu su Eric Schmidt "Google"
ir buvęs senatorius Barackas Obama (Barakas Obama) vos prieš keletą metų.
>> Dabar, senatorius, jūs čia "Google",
ir man patinka galvoti apie pirmininkavimo darbo interviu.
Dabar sunku gauti darbą kaip prezidento, ir jūs ketinate per sąstingis dabar.
Tai taip pat sunku gauti darbą "Google".
Mes turime klausimų, ir mes prašome mūsų kandidatai klausimus,
ir tai vienas iš Larry Schwimmer.
Jūs manote, kad aš juokauji? Tai čia.
Kas yra efektyviausias būdas rūšiuoti milijoną 32-bitų sveikųjų skaičių?
[Juokas]
Gerai
Aš atsiprašau. >> Ne, ne, ne, ne.
Manau, kad burbulas tarsi būtų neteisingas būdas eiti.
>> Nagi, kuris papasakojo jam tai?
Praėjusią savaitę primena, mes priėmėme iš kodo pertraukos, bent jau per dieną,
ir pradėjo sutelkiant dėmesį į kai kurių aukštesnio lygio idėjas ir problemų sprendimo apskritai
paieškos ir rūšiavimo,
ir mes pristatėme kažką, kad mes ne SLAP tokį vardą praėjusią savaitę,
bet asimptotinė notacija, Big O, Big Omega
, o kartais ir Big teta notacijos, ir tai buvo tiesiog būdų
aprašyti algoritmų veikimo laiką,
kiek laiko užtrunka už algoritmas paleisti.
>> Ir jūs žinote, kad jūs kalbėjote apie veikimo laiką dydžio
sąnaudų dalis, kuri mes paprastai vadiname n, kokia problema gali būti,
kur n yra žmonių skaičius į kambarį,
telefonų knygos puslapių skaičius, ir mes pradėjome rašyti dalykus
kaip O (n ^ 2) arba O (n) arba O (n log n),
ir net tada, kai matematikos ne gana dirbti taip tobulai
ir jis buvo n ² - n / 2 ar kažkas panašaus
mes verčiau tiesiog išmesti kai apatinių nutartyje,
ir motyvacija yra, kad mes tikrai norime
tarsi objektyviai įvertinti
programų įgyvendinimą arba algoritmų rezultatai
kad dienos pabaigoje neturi nieko bendro, pavyzdžiui,
nuo jūsų kompiuterio greičio.
>> Pavyzdžiui, jei įgyvendinti burbulas rūšiuoti,
ar jums įgyvendinti sujungti šiandienos kompiuterio rūšiavimo arba atrankos rūšiuoti,
2 GHz kompiuterio, ir paleisti jį,
ir tai trunka keletą sekundžių skaičių, kitais metais ten 3 GHz
arba 4 GHz kompiuteris, ir galbūt tada teigti, kad: "Oho, mano algoritmas
dabar yra du kartus taip greitai, nors iš tikrųjų tai akivaizdžiai ne tas atvejis.
Tai tik įranga turi Dotarłeś greičiau, tačiau jūsų kompiuteris
ne, ir taip mes tikrai norite išmesti dalykų, pavyzdžiui,
kartotinus 2 arba dauginiai iš 3, kai kalbama apie užeina
kaip greitai ar kaip lėtai algoritmas yra ir tikrai tik sutelkti
n arba kai jos veiksnys,
kai galia kaip iš praeitą savaitę rūšių.
Ir priminti, kad su Merge sort pagalba
mes galėjome padaryti daug geriau nei burbulas rūšiuoti ir atrankos rūšiuoti
ir net įterpimas rūšiuoti.
>> Mes turime n log n, ir vėl,
prisiminti, kad log n paprastai reiškia tai, kad auga
lėčiau, tada n, todėl n log n iki šiol buvo gerai
, nes jis buvo mažiau nei n ².
Tačiau norint pasiekti n log n Merge sort
tai, kas buvo pagrindinė idėja gemalai, kad mes turėjome sverto
kad mes taip pat daro poveikį jos įtakai savaitę 0?
Kaip mes rūšiavimo problemą spręsti protingai sujungti rūšiuoti?
Kokia buvo pagrindinė įžvalga, gal?
Kas nors ne visi.
Gerai, galime žengti žingsnį atgal.
Apibūdinti sujungti tarsi savo žodžiais.
Kaip tai veikia?
Gerai, mes eilutėje atgal į savaitę 0.
Gerai, yeah.
[Nesigirdi studentas]
Gerai, gerai, kad mes suskirstyti į 2 dalių skaičių masyvas.
Surūšiuota kiekvienas iš šių vienetų, o tada mes sujungėme juos,
ir mes matėme šią idėją, prieš atsižvelgiant problema, kad tai didelis
ir sukapoti jį į problemą, kad tai didelis, ar tai didelis.
>> Prisiminkite, telefonų knygos pavyzdys.
Prisiminkite savarankiškai skaičiavimo algoritmas savaites,
taip sujungti tarsi apibendrinta šio pseudocode čia.
, Kai esate n elementus, iš pradžių ji buvo normalumas patikrinti.
Jei n <2 neturite padaryti ką nors ne visi
nes jei n <2, tai n yra akivaizdžiai 0 arba 1,
ir todėl, jei jis yra 0 arba 1 nieko rūšiuoti.
Baigsite.
Jūsų sąrašas jau funkcionalumą lengvai surūšiuoti.
Bet kitaip, jei jūs turite 2 ar daugiau elementų, eiti į priekį ir suskirstyti jas
į 2 dalis, į kairę ir į dešinę.
Rūšiuoti kiekviena iš tų per pusę, ir tada sujungti surūšiuoti puses.
Bet problema čia yra tai, kad iš pirmo žvilgsnio tai mano, kaip mes Punting.
Apibrėžimą, nes tai yra nelogiškas, jei aš paprašė jums n elementus norite surūšiuoti šių
ir jūs man sako, "Gerai, gerai, mes rūšiuoti tas n / 2 ir tie, n / 2 elementų,
tada mano kitas klausimas bus "Gerai, kaip jums rūšiuoti n / 2 elementus?"
>> Tačiau dėl šios programos struktūros,
, nes yra į šį bazinį scenarijų, taip sakant,
tai ypatingas atvejis, kad sako, kad jei n yra mažesnis už tam tikrą nustatytą vertę, pavyzdžiui, 2 reisai iš karto.
Negalima atsakyti su tuo pačiu sukamaisiais atsakymo.
Šis procesas, šis cikliškumas bus galiausiai baigiasi.
Jei aš prašau tavęs "surūšiuoti šių n elementų," ir jūs sakote: "Gerai, surūšiuoti šių n / 2"
tada jūs sakote: "Gerai, surūšiuoti šių N / 4, n / 8, n/16,"
galų gale jums padalinti pakankamai didelis skaičius
, kad jūs turite tik 1 elementas kairę, o tada galite pasakyti,
"Čia, čia yra rūšiuotas vienas elementas."
Tada šio algoritmo blizgesį čia kyla iš to,
, kad, kai jūs turite iš šių atskirai surūšiuoti sąrašus,
kurie visi yra 1, dydžio, kuris, atrodo, būti nenaudingas,
kai pradėsite sujungiant juos ir juos sujungti
jums sukurti galiausiai, kaip Rob padarė vaizdo įrašą pagaliau surūšiuoti sąrašą.
>> Bet ši idėja toli už rūšiavimo.
Yra ši idėja įtraukti į šią programą, žinomą kaip rekursijos,
idėja, pagal kurią esate programa,
ir išspręsti kai kurių problemų, Jūs vadinate save,
arba įdėti programavimo kalbų, jums yra funkcija,
ir siekiant išspręsti problemą, jums funkcija skambinti sau
vėl ir vėl ir vėl, bet jūs funkcija
negali paskambinti sau be galo daug kartų.
Galų gale jūs turite į dugną, taip sakant,
ir turėti tam tikrą kietai "įsiūtos bazę sąlyga, kad sako
šiuo metu sustabdyti skambinate sau, kad visas procesas
pagaliau realiai sustoti.
Ką tai iš tikrųjų reiškia, į recurse?
>> Pažiūrėkime, jei mes galime padaryti paprastą, trivialus pavyzdys, tarkim,
3 žmonės su manimi čia ant scenos, jei kas nors yra patogus.
1, ateiti iki, 2 ir 3.
Jei jums 3 nori ateiti čia.
Jei norite išsiskirti šalia manęs linija, tarkime, kad po ranka problema
labai funkcionalumą lengvai suskaičiuoti žmonių, kurie čia.
Bet atvirai, aš pavargau nuo visų šių skaičiavimo pavyzdžių.
Ketina imtis šiek tiek laiko, 1, 2, ir taškas, taškas, taškas.
Truks amžinai.
Aš, o tiesiog kamuolio išmušimas iš rankų šią problemą apskritai su padėti-koks tavo vardas?
Sara. >> Sara, viskas gerai.
Kelly. >> Kelly ir?
>> Willy. >> Willy Sara, Kelly ir Willy
Dabar aš jau kažkas uždavė klausimą
kiek žmonių yra šiame etape, ir aš neįsivaizduoju.
Tai tikrai ilgas sąrašas, ir todėl vietoj aš ruošiuosi padaryti šį triuką.
Aš ruošiuosi paprašyti asmenį šalia manęs padaryti didžiąją darbo dalį,
ir kai ji daro didžiąją darbo dalį
Aš ruošiuosi daryti mažesnį dirbti ir tiesiog pridėkite 1
neatsižvelgiant į tai, kokia jos atsakymas yra, kad čia mes einame.
Aš buvo paprašyta, kiek žmonių scenoje.
Kiek žmonių ant scenos į kairę jus?
Iš manęs kairėje? >> Gerai, bet ne apgauti.
Tai gerai, tai teisinga, tačiau, jei norime tęsti šią logiką
Tarkime, kad jūs taip pat norite kamuolio išmušimas iš rankų į šią problemą iš jūsų kairėje,
taip, o ne atsakymą tiesiogiai eiti į priekį ir tiesiog praeiti spardytis.
O, kiek žmonių mane kairėje?
Kiek žmonių į kairę?
1.
[Juokas]
Gerai, kad 0, todėl tai, ką dabar Willy padarė
yra, jūs jau grąžino savo atsakymą šia kryptimi, sakydamas: 0.
Dabar, ką jūs turėtumėte daryti? >> 1.
Gerai, kad jūs esate 1, todėl jūs sakote, "Na, gerai, aš ruošiuosi pridėti 1
kokia Willy skaičius buvo ", todėl 1 + 0.
Jūs dabar 1, kad jūsų atsakymas į dešinę dabar
1. >> Ir mano būtų 2.
Gerai, kad jūs vartojate ankstesnį atsakymą iš 1,
pridedant minimalų darbo kiekį, kurį norite padaryti, kuris yra +1.
Dabar jūs turite 2, ir jūs tada ranka man, kuris vertė?
3, aš turiu galvoje, atsiprašau, 2.
Geras.
>> Na, mes turėjome 0 į kairę.
Tada mes turėjome 1, ir tada pridedame 2,
ir dabar jūs pernešimo man skaičiumi 2,
ir todėl aš noriu pasakyti, gerai, +1, 3.
Yra tiesų 3 žmonės stovėjo šalia manęs šiame etape,
todėl galėjo akivaizdžiai tai padarė labai tiesiškai
labai akivaizdaus mados, bet ką mes tikrai?
Mes paėmė 3 dydžio problemą iš pradžių.
Mes tada sumušė jį žemyn į 2 dydžio problema,
1 dydžio problema, ir galiausiai pagal bazinį scenarijų
buvo tikrai, o, nėra nė vieno,
tuo momentu Willy grįžo efektyviai kietai "įsiūtos atsakymas porą kartų,
, o antrasis buvo tada burbuliukų, burbuliukais, burbuliukų iki,
ir tada pridėti šį vieną papildomą 1
mes įdiegėme šią pagrindinę idėją rekursijos.
>> Dabar, šiuo atveju ji tikrai ne išspręsti problemą
efektyviau nei mes matėme iki šiol.
Bet pagalvokite apie algoritmus, mes padarėme scenoje iki šiol.
Mes turėjome 8 popieriaus lapų lentos,
vaizdo kai Sean ieškojau su skaičiumi 7, ir ką jis tikrai?
Na, jis negali daryti bet kokią atskirtį, ir užkariauti.
Jis nepadarė jokios rekursijos natūra.
O jis tiesiog padarė tokią linijinę algoritmą.
Bet kai mes surūšiuoti skaičių scenoje idėja gyventi praėjusią savaitę
tada mes turėjome šį instinktas eiti į vidurį,
tada mes turėjo mažesnį sąrašą 4 dydžio ar kitos 4 dydis sąrašas
ir tada mes turėjome tą patį problema, todėl mes pakartoti, pakartoti, pakartoti.
Kitaip tariant, mes recursed.
Labai ačiū čia mūsų 3 savanorių įrodoma, kad pas mus rekursija.
>> Pažiūrėkime, jei mes negalime padaryti tai dabar truputį daugiau betono,
išspręsti problemą, kad vėl galėtume padaryti gana lengvai,
tačiau mes jį naudoti kaip slenksčiu į įgyvendinant šią pagrindinę idėją.
Jei aš noriu apskaičiuoti krūva skaičių sumavimo,
Pavyzdžiui, jei jums perduoti skaičiumi 3,
Aš noriu duoti jums 3 Sigma vertę,
taip suma 3 + 2 + 1 + 0.
Noriu gauti atsakymą 6,
todėl mes įgyvendinti šį sigma funkciją, tai apibendrinimo funkciją
, kad vėl, mano įvesties ir tada grąžina sumavimo
šį numerį visą kelią žemyn iki 0.
Galėtume tai padaryti gana paprastai, tiesa?
Galėtume tai padaryti su kažkokio apsisukimo struktūrą,
todėl leiskite man eiti į priekį ir gauti tai prasidėjo.
>> Įtraukti stdio.h.
Leiskite man save į Pagrindinis dirbti su čia.
Išsaugokime tai kaip sigma.c.
Tada aš ruošiuosi eiti į čia, ir aš ketina paskelbti int n,
ir aš ruošiuosi daryti toliau, kai vartotojas nebendradarbiauja.
, Kai vartotojas nėra davęs man teigiamą skaičių
leiskite man eiti į priekį ir greitai juos n = GetInt
ir leiskite jiems šiek tiek instrukcijas, ką daryti,
taip printf ("teigiamas sveikasis skaičius").
Tiesiog kažkas gana paprasta, kaip tai, kad iki to laiko mes hit linija 14
dabar mes turime teigiamą sveikąjį skaičių Numatoma n.
>> Dabar galime kažką daryti su juo.
Leiskite man eiti į priekį ir apskaičiuoti sumavimo, todėl int suma = sigma (n).
Sigma yra tik išdava, todėl aš tik raštu mėgėjas.
Mes tiesiog paskambinti tai sigma ten.
, Kad suma, ir dabar aš ruošiuosi, jei norite spausdinti rezultatas,
printf ("Suma yra% d \ n", suma).
Ir tada aš grįžti 0 gera priemonė.
Mes padarėme viską, kad ši programa reikalauja išskyrus įdomiausia dalis,
kuris yra iš tikrųjų įgyvendinti Sigma funkciją.
>> Leiskite man eiti čia į apačią, ir leiskite man deklaruoti funkcija sigma.
Jis gavo imtis kintamąjį, tipo sveikasis skaičius,
ir ką duomenų tipas, aš noriu grįžti matyt nuo sigma?
Žiniasklaida, nes noriu, kad jis atitiktų mano lūkesčius 15 on-line.
Čia leiskite man eiti į priekį ir įgyvendinti šią
gana paprastas būdas.
>> Eikime į priekį ir pasakyti int suma = 0,
ir dabar aš ruošiuosi eiti šiek tiek už linijos čia
kad ketina pasakyti kažką panašaus į tai,
už (int i = 0; I <= skaičius; i + +) suma + = i.
Ir tada aš ruošiuosi grįžti sumą.
Aš galėjo įgyvendinti bet keliais būdais.
Aš galėjo naudoti while cikle.
Aš galėjo praleisti naudojant suma kintamasis, jei aš tikrai norėjo,
bet trumpai tariant, mes tiesiog turime funkciją, kuri, jei aš ne goof pareiškia, suma yra 0.
Tada jis kartoja nuo 0 aukštyn per skaičius,
ir kiekvienos iteracijos jis priduria, kad dabartinę vertę suma ir tada grąžina sumą.
>> Dabar jau šiek tiek optimizavimas čia.
Tai turbūt švaistomi žingsnis, bet tegul bus taip. Tai gerai dabar.
Mes bent kruopščiai ir ketina 0 visą kelią iki.
Nėra labai sunku, ir gana paprasta,
tačiau paaiškėja, kad su sigma funkcija turi tokią pačią galimybę
kaip mes čia ant scenos.
Ant scenos, mes tiesiog suskaičiuoti, kiek žmonių buvo šalia manęs,
bet vietoj to, jei norime suskaičiuoti 3 + 2 + 1
iki 0 galėtume panašiai kamuolio išmušimas iš rankų į funkciją
, kad aš, o ne apibūdinti kaip rekursinis.
Čia darykime greitai normalumas patikrinti ir įsitikinkite, kad Aš ne goof.
>> Aš žinau, bent vienas dalykas šioje programoje, kad aš padaryti neteisingai.
Kai aš paspauskite "Enter" I am going gauti bet kokį šaukiantį į mane?
Ką aš ketinu būti rėkė apie?
Taip, aš pamiršau prototipą, todėl aš naudoju funkcija vadinama sigma on line 15
bet tai ne deklaruoti iki 22 eilutė, kad aš geriausiai aktyviai eiti čia
ir paskelbti prototipą, ir pasakysiu int Sigma (int numeris), ir viskas.
Ji įgyvendinama apačioje.
>> Arba kitas būdas galėčiau išspręsti šią problemą,
Aš negalėjau ten perkelti funkciją, kuri yra neblogai,
bet bent jau kai jūsų programas pradėti gauti ilgai, tiesą sakant,
Manau, kad yra šiek tiek visada pagrindinis viršuje vertė
taip, kad jūs į skaitytuvą galima atidaryti failą ir tada iš karto pamatyti
tai, ką programa daro be būtinybės ieškoti
ieškome šios pagrindinės funkcijos.
Leiskite eiti į mano terminalo lange čia, pabandykite sigma padaryti sigma,
ir aš įsukus čia.
Implicit funkcijos GetInt deklaracija Aš pamiršau padaryti tai, ko dar?
[Nesigirdi studentas]
Gerai, kad matyt dažnai pasitaikanti klaida, todėl galime tai padaryti čia,
cs50.h, o dabar grįžkime mano terminalo lange.
>> Aš išvalyti ekraną, ir aš iš naujo paleisti, kad sigma.
Atrodo, kad turime surinkti. Leiskite man dabar paleisti sigma.
Aš įveskite skaičiumi 3, ir aš gauti 6, todėl ne griežtas patikrinimas,
bet bent jau atrodo, kad reikia dirbti, iš pirmo žvilgsnio, bet dabar galime nukopijuoti jį išskiria,
ir tegul iš tikrųjų sverto rekursijos idėją, dar kartą,
labai paprasta kontekste taip, kad po kelių savaičių
kai mes pradedame tyrinėti mėgėjas duomenų struktūras kaip masyvai
mes turime kitą įrankį priemonių rinkinio, su kuriuo būtų
manipuliuoti šių duomenų struktūras, kaip matysime.
Tai iteracinis metodas, kilpa pagrįstas požiūris.
>> Vietoj dabar leiskite man tai padaryti.
Leiskite man, o ne pasakyti, kad skaičiaus sumuojant
iki 0 iš tiesų yra tas pats, kaip
numeris + sigma (numeris - 1).
Kitaip tariant, kaip ant scenos aš punted kiekvienai žmonių šalia manęs,
ir jie savo ruožtu nuolat Punting, kol mes pagaliau dugną Willy,
, kurie turėjo grįžti kietai "įsiūtos atsakymą kaip 0.
Čia dabar mes panašiai Punting sigma
tą pačią funkciją, kaip iš pradžių buvo vadinamas, bet čia pagrindinė įžvalga
yra tai, kad mes ne skambinti sigma identiškai.
Mes ne artimųjų n.
Mes aiškiai einančios skaičius - 1,
todėl šiek tiek mažesnis problema, šiek tiek mažesnis problema.
>> Deja, tai ne visai sprendimas dar ir kol mes nustatyti
kas gali būti taip akivaizdu, kai kurie iš jūsų šokinėja iš
leiskite man eiti į priekį ir iš naujo padaryti.
Atrodo, kad sudaryti gerai.
Leiskite man pakartotas sigma su 6.
Oi, leiskite man iš naujo paleisti Sigma su 6.
Mes matėme prieš tai, nors ir netyčia paskutinį kartą taip pat.
Kodėl aš gauti šį neaiškūs segmentavimo kaltės? Taip.
[Nesigirdi studentas]
Yra ne bazinį scenarijų, o tiksliau, kas tikriausiai atsitiko?
Tai yra koks elgesys simptomas?
Pasakyti, kad tai šiek tiek garsiau.
[Nesigirdi studentas]
Tai begalinis kilpos ir begalybės linijų problema
, kai jie susiję su rekursija šiuo atveju, funkcija pasivadino,
kas atsitinka kiekvieną kartą, kai vadiname funkciją?
Na, manau, atgal, kaip mes išdėstyti kompiuterio atmintį.
Mes sakėme, kad ten tai atminties riekė vadinamas kamino apačioje,
ir kiekvieną kartą, kai skambinate funkcija šiek tiek daugiau atminties gauna įdėti
šios vadinamosios kamino, kuriame šią funkciją vietos kintamieji arba parametrus,
todėl, jei sigma ragina sigma skambučius sigma ragina sigma
ragina sigma, kur tai istorijos pabaiga?
>> Na, tai galiausiai viršijimus bendra suma
atminties, kad turite prie kompiuterio.
Jūs viršijo segmentą, kad jums turėtų likti,
ir gausite šį segmentavimo kaltės, pagrindinių dempingo kaina,
ir kokie pagrindiniai dempingo kaina reiškia, kad dabar aš turiu failą pavadinimu pagrindinė
kuris yra failas, kuriame yra nulių ir
kad iš tikrųjų ateityje bus diagnostiniu požiūriu.
, Jei tai nėra akivaizdu jums, kur yra jūsų klaida yra
jūs iš tikrųjų galite padaryti šiek tiek teismo ekspertizei, taip sakant,
šio pagrindinio iškelties failą, kuris, vėlgi, yra tik visa krūva nulių ir
kad iš esmės atstovauja savo programos atminties būklę
tada, kai jis sudužo šiuo būdu.
>> Sprendimas čia yra, kad mes negalime aklai grįžti sigma,
numeris + sigma šiek tiek mažesnis problemos.
Mes turime turėti kažkokį bazine čia,
ir kas turėtų bazinį scenarijų, tikriausiai?
[Nesigirdi studentas]
Gerai, kol skaičius teigiamas, mes iš tiesų turėtų grįžti,
Kitaip tariant, jeigu, sakykime, <=, 0
žinote, ką aš eisiu į priekį ir grįžti 0,
panašiai kaip Willy padarė, ir dar, aš ruošiuosi eiti į priekį
ir grįžti, kad tai ne tai, kad daug trumpesnis
nei Pakartotinai versija, kad mes plakta pirmą kartą naudojant už kilpos,
, bet pastebėsite, kad ten tai elegancija rūšiuoti.
, O ne grąžinant tam tikrą numerį ir atlikti visa tai matematikos
ir pridėti dalykų su vietos kintamieji
Vietoj to, jūs sakydamas: "Gerai, jei tai yra super lengva problema,
kaip skaičius yra <0, leiskite man nedelsiant grąžinti 0 ".
>> Mes neketiname vargintis patvirtinamuosius neigiamus skaičius,
todėl aš į kietąjį kodą "0" vertės.
Bet kitaip, kad įgyvendintų šią sumuojant idėja
visų šių skaičių kartu galite efektyviai imtis mažų įkandimo
iš problemos, panašiai kaip mes padarėme čia ant scenos,
tada kamuolio išmušimas iš rankų problemos poilsio kitą asmenį,
tačiau šiuo atveju kitas asmuo yra jūs pats.
Tai vienodai pavadintas funkcija.
Tiesiog praeiti mažesni ir mažesni ir mažesni problema kiekvieną kartą,
ir nors mes turime ne gana formalūs kodo dalykų čia
būtent tai ir vyksta 0 telefonų knygoje savaitę.
Būtent tai vyksta pastarąsias savaites su Sean
mūsų demonstracijas numerių paieškos.
Tai problema ir dalijant jį vėl ir vėl.
>> Kitaip tariant, dabar yra būdas versti
tai realaus pasaulio konstruktas, tai aukštesnio lygio konstruktas
iš skaldyk ir valdyk ir darai kažką, vėl ir vėl
kodu, todėl tai yra kažkas, ką mes pamatysime laikui bėgant.
Dabar, kaip panaikinti, jei esate naujas rekursijos turėtumėte bent suprasti dabar
kodėl tai yra juokinga.
Aš ruošiuosi eiti į google.com,
ir aš einu ieškoti keletą patarimų ir gudrybės, rekursijos, įveskite.
Pasakykite asmenį šalia savęs, jei jie ne iš juoko, tik dabar.
Ar Jūs turėjote galvoje rekursija?
Ar Jūs turėjote galvoje Ak, čia mes einame.
Gerai, kad dabar visiems poilsio.
Šiek tiek margutis įterptųjų kažkur ten "Google".
Kaip panaikinti, viena iš šių nuorodų, mes įdėti kurso tinklalapyje
nes šiandien yra tik tai įvairių rūšiavimo algoritmų tinklelis,
kai kurie iš jų mes pažvelgė į praeitą savaitę, bet kas malonu apie šį vizualizacija
kaip jums pabandyti wrap savo mintis apie įvairių dalykų, susijusių su algoritmų
žinote, kad galite labai lengvai dabar pradėti su skirtingų rūšių sąnaudų.
Įėjimai visi pasikeitė, žaliavos daugiausia rūšiuojamos, žaliavos atsitiktinis ir pan.
Kaip jums pabandyti vėl, atskirti šiuos dalykus savo proto
suprasti, kad tai kurso paskaitas puslapyje tinklalapyje URL
gali padėti jums per kai kurias iš šių priežastis.
>> Šiandien mes pagaliau išspręsti šią problemą, o atgal,
kuris buvo, kad ši apsikeitimo funkcija tiesiog neveikia,
ir kokia buvo pagrindinė problema, su šia funkcija apsikeitimo sandorio,
kurios tikslas buvo, vėlgi, čia ir čia keistis vertę
taip, kad tai atsitiks?
Tai nebuvo faktiškai dirba. Kodėl?
Taip.
[Nesigirdi studentas]
Tiksliai, Šio bugginess paaiškinimas
tiesiog buvo, nes kai skambinate funkcijas C
ir tas funkcijas imtis argumentus, kaip a ir b čia,
jūs einančios kopijų kokia vertė jūs suteikiate tą funkciją.
Jūs nesate pradines reikšmes save,
taip, mes matėme tai į buggyc
buggy3.c, kuri atrodė šiek tiek kažką panašaus į tai.
>> Prisiminkite, kad mes turėjome inicializuoti iki 1 ir 2, x ir y atitinkamai.
Mes tada atspausdinti ką jie.
Aš tada pareiškė, kad aš buvau Swapping telefonu atminties x, y.
Bet problema buvo ta, kad Swapping dirbo,
bet tik apsikeitimo taikymo sritį veikti pati.
Kuo greičiau mes nukentėjo 40 eilutėje šioms pavertė vertės
buvo išmesti, ir todėl nieko
pirminę funkciją pagrindinis buvo iš tikrųjų pasikeitė ne visi,
todėl, jei manote, kad atgal tada kaip tai atrodo mūsų atmintyje
jei tai kairėje pusėje valdybos atstovauja-
ir aš darysiu viską visiems pamatyti, jei tai kairėje pusėje valdybos
atstovauja, tarkim, jūsų RAM, ir kamino augs iki tokiu būdu,
ir mes vadiname, kaip pagrindinė funkcija ir pagrindinis yra 2 vietos kintamieji X ir Y,
galime apibūdinti kaip x čia, ir tegul čia aprašyti tai kaip y,
ir tegul reikšmes 1 ir 2, todėl čia yra pagrindinis,
ir kai pagrindinis ragina apsikeitimo funkcija operacinė sistema
dėl apsikeitimo sandorio, suteikia funkciją savo atminties swath kamino,
savo rėmas kamino, taip sakant.
Taip pat skiria 32 bitų šių int.
Taip atsitinka, kad jiems skambinti a ir b, bet tai visiškai savavališkai.
Ji galėjo pavadino juos, ką nori, bet kas atsitinka, kai pagrindinis
ragina apsikeitimo jis užima šio straipsnio 1, kelia kopiją ten, kelia kopiją.
>> Yra 1 kita apsikeitimo vietos kintamąjį, nors, vadinamas ką? >> Tmp.
Tmp, todėl leiskite sau čia dar 32 bitų,
Ką aš padariau šią funkciją?
Aš pasakiau, int tmp gauna, todėl yra 1, todėl aš padariau tai, kai mes paskutinį kartą grojo su šiuo pavyzdžiu.
Tada gauna b, kad b yra 2, tad dabar tai tampa 2,
ir dabar b gauna temp, todėl temperatūra yra 1,
todėl dabar b tampa šios.
Tai puiku. Jis dirbo.
Bet tada kuo greičiau funkcija grąžina
realiai dingsta taip, kad ji gali būti pakartotinai naudojamas SWAP atmintis
kitu funkcija ateityje, ir pagrindinis yra akivaizdžiai visiškai nepakitęs.
Mums reikia iš esmės spręsti šią problemą,
ir šiandien mes pagaliau taip, kaip tai padaryti, pagal kurią
galime pristatyti kažką vadinama rodyklė.
Pasirodo, kad mes galime išspręsti šią problemą
ne artimųjų kopijose x ir y
tačiau užuot išlaikius kokiais jūs manote, apsikeitimo funkcija?
Taip, ką apie adreso?
Mes ne iš tikrųjų kalbėjo apie adresus daug detalių,
bet jei tai lenta atstovauja savo kompiuterio atminties
mes tikrai galėtų pradėti numeravimo baitų mano RAM
ir pasakyti, kad tai baitų # 1, tai yra baitas # 2, # 3 baitų,
baitų # 4, baitų # ... 2 mlrd., jei aš turiu 2 GB RAM,
, kad galėtume tikrai sugalvoti su kai kuriais savavališkai numeravimo schemą
visų atskirų baitų mano kompiuterio atmintyje.
>> Ką daryti, jei vietoj, kai aš vadinu apsikeitimo
o ne perduoti į x ir y kopijų
kodėl ne aš, o ne perduoti x adresą čia,
y adresas čia, iš esmės pašto adresas
x ir y, nes tada apsikeitimo, jei jis informaciją
x ir y atminties adresą,
tada apsikeitimo, jei mes išmokome jį šiek tiek,
jis potencialiai gali vairuoti šiuo adresu, taip sakant,
x, ir pakeisti ten, tada vairuoti y adresą,
pakeisti numerį, net ne iš tikrųjų gauti kopijas šių verčių pats,
todėl, nors mes kalbėjome apie tai, kaip pagrindinis atmintis
ir tai, kaip Būdamas SWAP atminties galinga ir pavojinga dalis C
yra tai, kad kiekviena funkcija gali paliesti bet kurioje kompiuterio atmintį,
ir tai yra galingas, kad jūs galite padaryti labai išgalvotas dalykų su kompiuterių programų C.
Tai pavojinga, nes jūs taip pat galite labai lengvai susukti.
Iš tiesų, vienas iš labiausiai paplitusių būdų programas šių dienų turi būti išnaudotas
vis dar yra programuotojas negali suprasti
, kad jis arba ji yra, leidžiančios duomenų
turi būti parašyta į atminties vietą, kuri nebuvo numatyta.
>> Pavyzdžiui, jis ar ji pareiškia masyvas dydis 10
bet tada netyčia bando įdėti 11 baitų į tą atminties masyvo,
ir pradėdami neliesti atminties dalis, nebegalioja.
Tiesiog konteksto tai, kai kurie iš jūsų gali žinoti, kad
programinė įranga dažnai paragina jus serijinius numerius ar registracijos raktus,
Photoshop, Word ir panašiose programose.
Egzistuoja įtrūkimų, kaip kai kurie iš jūsų žinote, internete, kur jūs galite paleisti maža programa,
ir voila, ne daugiau prašymas, serijos numeris.
Kaip tai veikia?
Daugeliu atvejų, šie dalykai yra tiesiog rasti kompiuterių
kompiuterių faktinių nulių ir teksto segmentai
kur yra ta, kad, jei serijos numeris prašoma funkcija,
ir perrašyti vietos, arba kai programa veikia
galite išsiaiškinti, kur svarbiausia yra faktinis saugomas
naudojant kažką vadinama Debugger, ir jūs galite nulaužti programinę įrangą, kad taip.
Tai ne pasakyti, kad tai yra mūsų tikslas, į kitą porą dienų,
Tačiau ji turi labai realių pasekmių.
Kad viena būna, kad apima programinės įrangos vagystės,
tačiau taip pat kompromisą ištisų mašinų.
>> Iš tiesų, kai svetainės šių dienų yra išnaudojami
ir pavojus ir duomenų nutekėjo ir slaptažodžiai yra pavogti
tai labai dažnai yra susijęs su blogo valdymo atmintyje,
arba, duomenų bazių, nesugebėjimas numatyti
rungimosi įėjimas, todėl daugiau apie tai ateinančias savaites,
bet dabar tiesiog nukniaukti peržiūrėti žalos rūšiuoti, kad jūs galite padaryti
ne visai suprasti, kaip viskas veikia po gaubtu.
Eikime apie suprasti, kodėl tai neveikia
priemonė, kuri bus vis daugiau ir daugiau naudingos
mūsų programos gauti daugiau sudėtingas.
Iki šiol, kai jūs turėjo savo programą klaidą
kaip buvote nuėję apie derinimo?
Ką savo technikas buvo iki šiol, ar mokė savo TF
arba tiesiog savamokslis?
[Studentų] printf.
Printf, todėl printf tikriausiai tavo draugas, nes jei norite pamatyti
tai, kas vyksta viduje savo programą
jūs tiesiog įdėti printf čia printf čia printf čia.
Tada paleisti jį, ir gausite visa krūva stuff ekrane
, kad galite naudoti tada padaryti išvadą, kas iš tikrųjų vyksta ne į savo programą.
>> Printf linkęs būti labai galingas dalykas,
bet tai labai neautomatinis procesas.
Jūs turite įdėti printf čia, printf čia
ir jei jūs įtraukėte viduje kilpa galite gauti 100 eilučių
produkcijos, kad tada jūs turite atsijoti per.
Tai nėra patogus naudoti ar interaktyvaus mechanizmas dėl derinimo programas,
bet, laimei, egzistuoja alternatyvų.
Yra programa, pavyzdžiui, vadinamas GDB, GNU Debugger,
, kuris yra šiek tiek slaptas, kaip jūs jį naudoti.
Tai šiek tiek sudėtinga, tačiau, atvirai kalbant,
tai yra vienas iš tų dalykų, kur, jei jūs įtraukėte šią savaitę ir kitą
papildomą valandą, suprasti kažką panašaus GDB
ji bus jums sutaupyti tikriausiai dešimtis valandų per ilgą laiką,
su tuo, leiskite man duoti jums, kaip šis dalykas veikia erzintoją.
>> Aš mano terminalo lange.
Leiskite man eiti į priekį, ir kaupti šią programą, buggy3.
Jis jau iki šiol.
Leiskite man ją paleisti tik, kaip mes padarėme, o atgal, ir iš tiesų, jis neveikia.
Bet kodėl taip yra? Gal aš įsukus apsikeitimo funkcija.
Gal tai a ir b. Aš ne visai perkelti juos aplink teisingai.
Leiskite man eiti į priekį ir tai padaryti.
, O ne tiesiog paleisti buggy3, o ne leiskite man paleisti šią programą GDB,
ir aš norėčiau pasakyti jį paleisti buggy3,
ir aš ruošiuosi įtraukti komandų eilutės argumentą, TUI,
ir mes įdėti šią nuorodą į ateities problemų spec priminti.
O dabar tai juoda ir balta sąsaja popped up, kad vėl,
yra šiek tiek didele per pirmąjį, nes ten visa tai
Garantijos informacija žemyn čia, bet bent jau kažkas susipažinę.
Lango viršuje yra mano tikrieji kodas
ir jei aš slinkite aukštyn čia leiskite man pereikite prie mano byla pačiame viršuje,
ir iš tiesų, ten buggy3.c, ir pranešimas šio lango apačioje
Turiu šį GDB eilutę.
>> Tai ne tas pats kaip mano normalus John Harvardo eilutę.
Tai greitai, kad ketina leisti man kontroliuoti GDB.
GDB Debugger.
Debugger yra programa, kuri leidžia jums vaikščioti per
vykdyti savo programos linijos eilutė po eilutės,
pakeliui, daro viską, ką nori su programa,
net skambinti funkcijas, ar ieškote, kas svarbiausia,
Įvairūs kintamojo vertybių.
Eikime į priekį ir tai padaryti.
Aš ruošiuosi eiti į priekį ir įveskite run GDB Operatyvaus,
todėl pastebėsite įvedėte paleisti iš ekrano apačioje, kairėje,
ir aš paspauskite "Enter", ir ką, kad padaryti?
Jis tiesiog bėgo savo programą, bet aš ne iš tikrųjų matyti daug eiti čia
, nes aš ne iš tikrųjų sakė Debugger
pristabdyti tam tikru laiko momentu.
Tiesiog rašyti paleisti veikia programą.
Aš ne iš tikrųjų matyti nieko. Aš negaliu manipuliuoti.
>> Vietoj to, leiskite man tai padaryti.
Šiuo GDB eilutę, leiskite man, o ne įveskite pertraukos, įveskite.
, Kad ne tai, ką aš reiškė tipo.
Tegul vietoj įveskite pertrauka pagrindinis.
Kitaip tariant, aš noriu nustatyti kažką vadinama atskaitos tašką,
taikliai pavadintas, nes jis bus pertrauka ar pristabdyti
vykdyti savo programą toje konkrečioje vietoje.
Pagrindinis yra mano funkcijos pavadinimas.
Atkreipkite dėmesį, kad GDB yra gana protingas.
Jis suprato, kad pagrindinis atsitinka pradėti maždaug 18 eilutėje
iš buggy3.c, o tada pastebėsite čia, viršuje kairėje
b + yra šalia eilutė 18.
Tai primena man, kad aš nustatyti atskaitos tašką at line 18.
Šį kartą, kai aš tipo paleisti, aš paleisti savo programą
iki tol, kol ji hitai, kad atskaitos tašką,
kad programa bus pristabdyti man at line 18.
Here we go, paleisti.
Niekas, atrodo, atsitiko, bet pranešimas apačioje kairėje
pradedant programa, buggy3 ne buggy3.c linijos 18, pagrindinis 1 atskaitos tašką.
Ką aš galiu padaryti dabar?
>> Atkreipkite dėmesį, aš galiu pradėti rašyti dalykų, pavyzdžiui, spausdinimo,
ne printf, spausdinti X, o dabar tai keista.
$ 1 yra tik smalsumas, kaip matysime
kiekvieną kartą, kai ką nors atspausdinti, gausite naują $ value.
Štai, kad būtų galima grąžinti į ankstesnes vertybes tik tuo atveju,
bet dabar tai, ką spausdinti sako man, kad x vertė Šiuo istorija
matyt 134.514.032.
Ką? Kur, kad net atsirado?
[Nesigirdi studentas]
Iš tiesų, tai, ką mes vadiname šiukšlių vertę, o mes ne kalbėjo apie tai dar,
bet priežastis, kad jums inicijuoti kintamieji
yra akivaizdu, kad jie turi tam tikrą vertę, kad jūs norite, kad jie turi.
Bet laimikis priminti, kad galite paskelbti kintamieji
kaip aš prieš akimirką mano sigma pavyzdžiu
be faktiškai suteikti jiems vertę.
Prisiminkite, ką aš padariau, čia sigma.
Aš paskelbiau N, tačiau, kas vertė aš suprato, kad tai?
Nėra, nes žinojau, kad per ateinančius keletą eilučių
GetInt rūpintis problema reikšmę viduje n.
>> Tačiau šiuo 11 linijos istorija
ir linijos 12 ir 13 linijos ir linijos 14
per šių kelių eilučių, kas yra n vertė?
C jūs tiesiog nežinau.
Tai paprastai kai šiukšlių vertė, kai visiškai atsitiktinių skaičių
, liko iš esmės kai kurios ankstesnės funkcijos
buvo paleista, taip, kaip jūsų programa veikia
priminti, kad funkcija pasireiškia funkcija, funkcija, funkcijos.
Visi šie rėmai gauti įdėti atminties, ir tada šios funkcijos grąžina,
ir kaip aš pasiūliau, su trintuku, jų atmintis galiausiai dar kartą panaudoti.
Na, tai tiesiog taip atsitinka, kad šis kintamasis X šioje programoje
atrodo, kad yra tam tikrą šiukšlių vertę, pavyzdžiui, 134514032
iš kai kurių ankstesnės funkcijos, o ne vienas, kad aš parašiau.
Tai gali būti kažkas, kad ateina efektyviai su operacine sistema,
kai po gaubtu funkcija.
>> Gerai, kad viskas gerai, bet tegul dabar iš anksto į kitą eilutę.
Jeigu aš ne mano GDB eilutę įrašykite "Kitas", ir aš paspauskite "Enter",
pastebėti, kad pabrėžiant juda žemyn į eilutę 19
bet logiška reiškia, kad eilutė 18
baigtas vykdyti, todėl, jei aš vėl įvesti "spausdinti x"
Aš dabar turėtų matyti 1, ir iš tiesų, aš.
Vėlgi, $ medžiaga yra būdas GDB priminti jums
spaudinių istorija yra tai, kad tu padarei.
Dabar leiskite man eiti į priekį ir spausdinti y, ir iš tikrųjų, y kai beprotiškas vertė, taip pat,
bet ne big deal, nes 19 eilutėje, mes apie tai priskirti ją
vertė 2, todėl leiskite man įvesti "Next" dar kartą.
Ir dabar mes printf eilutėje.
Leiskite man padaryti spausdinimo x.
Leiskite man padaryti spausdinimo y. Atvirai kalbant, aš gaunu šiek tiek pavargęs spausdinimo.
Leiskite man, o ne įveskite "ekranas x" ir "ekranas y"
ir dabar kiekvieną kartą, kai aš įveskite komandą ateityje
Aš bus priminta apie tai, kas x ir y, kas x ir y, kas yra x ir y.
>> Galiu taip pat, kaip žemę, tipo "info vietinių gyventojų."
Informacija yra speciali komanda.
Vietiniai reiškia, kad jis rodo man vietos kintamieji.
Tik tuo atveju, nepamenu, ar tai yra crazy, sudėtingos funkcijos
, kad aš ar kas nors kitas rašė informacija vietiniai gyventojai jums pasakys,
kas yra visų vietos kintamieji Viduje šios vietos funkcija
kad jums gali rūpintis, jei norite baksnoti aplink.
Dabar printf apie įvykdyti, todėl leiskite man eiti į priekį ir tiesiog įrašykite "šalia".
, Nes mes šioje aplinkoje mes ne iš tikrųjų matyti,
vykdyti čia, bet pastebite, kad truputį kočiotiniai čia.
Bet pastebite, kad neatsižvelgti į ekraną,
todėl nėra čia puiki programa, bet tai gerai, nes aš visada galite baksnoti aplink
naudojantis print, jei noriu.
>> Leiskite man įvesti kitą vėl, ir dabar čia įdomiausia dalis.
Šiuo pasakojimo taško y 2 ir x yra 1,
, kaip siūloma čia, ir vėl,
priežastis, tai automatiškai rodyti dabar yra, nes aš komandą
ekranas x ir ekranas y, todėl momentas, I tipo kitas
teorijos x ir y turėtų tapti pavertė.
Dabar, mes jau žinome, kad nesiruošia būti,
bet mes pamatyti, per akimirką, kaip mes galime pasinerti giliau išsiaiškinti, kodėl tai tiesa.
Kitą, ir, deja, y yra dar 2 ir x yra dar 1, ir galiu patvirtinti, kiek.
Spausdinti x, spausdinimo m.
Iš tiesų, ne Swapping iš tiesų įvyko, todėl galime pradėti tai per.
Aiškiai apsikeitimo neveikia.
Tegul, o ne dar kartą įveskite "Vykdyti".
Leiskite man pasakyti, taip, aš noriu paleisti jį nuo pat pradžių, įveskite.
>> Dabar aš atgal į viršų 18 eilutėje.
Dabar pastebėsite, x ir y yra šiukšlių vertės dar kartą.
Next, Next, Next, Next.
Jei aš nuobodu, aš taip pat tiesiog įveskite n kitą.
Galite jį mažinti per trumpiausią įmanomą simbolių seka.
Sukeisti dabar sulaužyta.
Tegul neria, todėl užuot įvedę kitą,
dabar aš ruošiuosi rašyti žingsnis, kad aš stiprinti šios funkcijos viduje
, kad galėčiau eiti per jį, kad aš paspauskite žingsnį ir tada įveskite.
Atkreipkite dėmesį, kad paryškinimas šuoliai žemyn mažesnis mano programa 36 eilutei.
Dabar, kas yra vietos kintamieji?
Info vietiniai.
Nieko tik dar, nes mes ne Dotarłeś prie tos linijos,
todėl eikime į priekį ir pasakyti "Kitas".
Dabar mes, atrodo, tmp, spausdinimo tmp.
Šiukšlių vertė, tiesa? Manau, kad taip.
Kaip apie spausdinti, spausdinimo B, 1 ir 2?
Vienu metu, kaip tik aš įveskite kitą kartą
tmp ketina imtis reikšmė 1, tikiuosi,
nes tmp bus priskirtas vertę.
>> Dabar galime spausdinti, spausdinimo b,
bet dabar spausdinti tmp, ir tai iš tiesų 1.
Leiskite man daryti toliau. Leiskite man daryti toliau.
Aš pabaigiau apsikeitimo funkcija.
Aš vis dar viduje ji 40 eilutėje, todėl leiskite man spausdinti,
spausdinti b, ir man nusispjauti, ką TVP yra.
Atrodo, kad apsikeitimo sandoris yra teisingas, kai kalbama apie Swapping a ir b.
Bet jei aš dabar įveskite kitą, aš šuolis atgal 25 eilutei,
ir, žinoma, jei aš tipo x ir spausdinimo y
jie vis dar nepakitusi, todėl mes ne nustatytas problemas.
Bet diagnostiniu dabar galbūt su šiuo GDB programos
mes bent Dotarłeś vienas žingsnis siekiant suprasti
kas vyksta blogai be neteršti mūsų kodą įgyvendinant printf čia,
printf čia printf čia ir tada paleisti jį vėl ir vėl
bando išsiaiškinti, kas vyksta blogai.
>> Aš ruošiuosi eiti į priekį ir mesti iš šio apskritai mesti.
Tai vyksta tada sako, "Baigti" anyway? " Taip.
Dabar aš ne mano normalus eilutę, ir aš padariau, naudojant GDB.
Kaip panaikinti, jums nereikia naudoti šį TUI vėliava.
Iš tiesų, jei jūs praleisti gausite esmės apatinėje ekrano.
Taigi, jei aš įvesti pertrauka pagrindinis ir paleiskite
Aš vis dar galite paleisti savo programą, bet ką ji darys daugiau tekstu
Tik parodykit man ką dabartinę eilutę vienu metu,.
-Tui, tekstinės vartotojo sąsajos,
tik parodo, kad jūs daugiau programos vienu metu, kuris tikriausiai yra šiek tiek konceptualiai lengviau.
Bet iš tiesų, galiu tik daryti toliau, Next, Next,
ir aš norėčiau pamatyti vieną eilutę vienu metu, ir jei aš tikrai noriu pamatyti, kas vyksta
Galiu tipo sąrašą ir pamatyti visa krūva kaimyninių linijų.
>> Yra vaizdo, kad mes prašome, kad jūs žiūrėti problema nustato 3
, kuris Nate apima kai kurias iš GDB gudrybės,
ir tai yra vienas iš tų dalykų, sąžiningai, kai kurie ne trivialus procentas
niekada nelieskite gdb, ir kad bus blogai
nes tiesiog jūs galų gale išleisti daugiau laiko vėliau šį semestrą
vejasi žemyn klaidas tada jums būtų, jei jūs įtraukėte pusvalandį / valandą
šią savaitę ir kitą gyvenimą, gauti patogi su GDB.
Printf buvo tavo draugas.
GDB dabar turėtų būti tavo draugu.
>> Bet kokie klausimai dėl GDB?
Ir čia yra trumpas sąrašas kai kurių iš galingiausių ir naudinga komandų.
Taip. >> Ar galite išspausdinti eilutę?
Galite spausdinti eilutę? Absoliučiai.
Tai nebūtinai turi būti tik sveikieji skaičiai.
Jei kintamojo s string tiesiog įveskite spausdinimo s.
Jis parodys jums, kas, kad eilutės rodiklis.
[Nesigirdi studentas]
Jis duos jums adresą ir seka pats stringas.
Jis parodys jums abiem.
Ir paskutinis dalykas, tik todėl, kad tai yra gera žinoti, per.
Backtrace ir rėmas, leisk man pasinerti į šį vieną paskutinį kartą,
pats tiksliai programa su GDB.
Leiskite man eiti į priekį ir paleisti tekstinės vartotojo sąsajos versiją,
pertrauka pagrindinis.
Leiskite man eiti į priekį ir paleisti iš naujo. Here I am.
Dabar leiskite man eiti Next, Next, šalia, greta, šalia, žingsnis, įvesti.
>> Ir dabar manau, kad aš esu dabar apsikeitimo sandorio sąmoningai, bet aš, kaip "Velnias, kokia buvo x vertė?"
Aš negaliu to padaryti x daugiau.
Aš negaliu to padaryti y, nes jie nėra komplekte.
Jie nėra tame kontekste, bet ne problema.
Galiu tipo pėdsako.
Kad man rodo visas funkcijas, kad šiuo metu atliktos iki.
Atkreipkite dėmesį, kad ant dugno vienas, pagrindinis, linijos, kurių pagrindinis
čia mūsų paveikslėlio apačioje.
Tai, kad apsikeitimo sandoris yra apsikeitimo virš jo atmintyje tai, kas pirmiau pasakyta, linijų,
ir jei noriu grįžti į pagrindinį laikinai galiu pasakyti "rėmo".
Kokiu numeriu? Pagrindinis rėmas # 1.
Aš ruošiuosi eiti į priekį ir pasakyti "Rėmelis 1".
>> Dabar aš pagrindinis ir galiu atspausdinti x ir galiu atspausdinti y,
bet aš negaliu spausdinti a arba b.
Bet aš galiu, jei aš sakau, "Gerai, palaukite kelias minutes. Jeigu apsikeitimo?"
Leiskite man eiti į priekį ir pasakyti "Frame 0".
Dabar aš atgal, kai aš noriu būti, ir kaip panaikinti,
kitos komandos taip pat, pavyzdžiui, jei jūs tikrai gauti nuobodu rašyti, Next, Next, Next, Next,
galite paprastai pasakyti dalykų, pavyzdžiui, "Kitas 10" ir tai bus žingsnis per ateinančius 10 eilučių.
Taip pat galite rašyti "Tęsti", kai jūs tikrai gauti atsibodo su žengia per jį.
Toliau bus paleisti programą be pertraukos, kol ji hitai kitą atskaitos tašką,
ar kilpa arba sumažinti žemyn į savo programą.
>> Šiuo atveju mes ir toliau iki galo, ir programa išėjo paprastai.
Tai yra išgalvotas būdas, prastesnės procesas.
Tiesiog jūsų programa išėjo normaliai.
Daugiau apie šią vaizdo ir derinimo sesijas priekį.
Kuris buvo daug.
Paimkime mūsų 5-minučių pertrauką ir sugrįšime su structs ir failus.
>> Jei turite nėrė į šią savaitę pset jau
jūs žinote, kad mes naudojame platinimo kodą,
išeitinis kodas, kad mes teikiame jums, kaip atskaitos tašką, kai naujas technologijas.
Visų pirma, mes pristatė šį naują raktažodį, pavadintą struct, struktūros,
taip, kad mes galime sukurti individualų kintamieji rūšių.
Mes taip pat pristatė failą I / O, failo įvesties ir išvesties sąvoką,
ir tai yra todėl, kad mes galime išgelbėti valstybę
savo scramble lentos ant disko failą
taip, kad mokymo bičiulių, ir gebu suprasti
tai, kas vyksta viduje savo programą, be būtinybės rankiniu būdu žaisti
dešimtys žaidimai scramble.
Mes galime tai padaryti daugiau automatedly.
>> Šis struct idėja išsprendžia gana įtikinamų problema.
Tarkime, kad norime įgyvendinti kai kurių programa
kad kažkaip stebi informaciją apie studentų
ir studentai gali turėti, pavyzdžiui, ID, vardą
ir kaip Harvardo vietoje namas, todėl tai yra 3 vnt informacija
mes norime išlaikyti aplink, todėl leiskite man eiti į priekį ir pradėti rašyti maža programa,
įtraukti stdio.h.
Leiskite man daryti įtraukti cs50.h.
Ir tada pradėti savo pagrindinę funkciją.
Aš ne nerimauti su bet komandinės eilutės argumentai,
ir čia aš noriu turėti studentas, todėl aš ketina pasakyti
studentas turi pavadinimą, todėl aš ketina pasakyti "String vardas."
Tada aš ruošiuosi pasakyti studentas taip pat turi ID, todėl int id,
ir studentas turi namą, todėl aš taip pat ketina pasakyti "styginių namą."
Tada aš užsisakyti šiuos šiek tiek daugiau švariai, kaip šis.
Gerai, dabar aš turiu 3 kintamieji, su kuriais atstovauti studentas, todėl "studentas."
>> O dabar noriu užpildyti šias vertybes, todėl leiskite man eiti į priekį ir pasakyti kažką panašaus
"Id = 123".
Vardas ketina gauti Dovydą.
Tarkime, namas ketina gauti Mather,
ir tada aš ruošiuosi daryti kažką savavališkai kaip printf ("% s,
, kurio ID yra% d% s, gyvena.
Ir dabar, ką aš noriu prijungti čia, vieną po kito?
Vardas, id, namas; return 0.
Gerai, jei aš kažkur čia įsukus
Manau, mes turime gana gera programa, kuri saugo vienas studentas.
Žinoma, tai ne visi, kad įdomus. Ką daryti, jei aš noriu turėti 2 studentus?
Tai yra ne big deal. Galiu paremti 2 žmonės.
Leiskite man eiti į priekį ir pabrėžti tai, ir eiti čia,
ir galiu pasakyti, "id = 456" kažkas panašaus Rob, kurie gyvena Kirkland.
>> Gerai, palauk, bet aš negaliu paskambinti tai tas pats,
ir atrodo, kad aš ruošiuosi turite nukopijuoti,
todėl leiskite man pasakyti, kad tai bus Dovydo kintamieji,
ir leiskite man gauti kai kuriuos iš šių egzempliorių Rob.
Mes paskambinsime šių Rob, bet tai nesiruošia dirbti dabar
nes aš laukti, galime pakeisti mane į ID1, NAME1 ir house1.
Rob bus 2, 2.
Aš turiu pakeisti čia, čia, čia, čia, čia, čia.
Laukti, ką apie Tommy? Leiskite tai padaryti ir vėl.
Žinoma, jei jūs vis dar manote, kad tai yra geras būdas tai padaryti, tai ne,
taigi nukopijuokite / įklijuokite blogas.
Bet mes išsprendė šią savaitę.
>> Tai, kas buvo mūsų sprendimas, kai mes norėjome turėti kelis egzempliorius to paties duomenų tipo?
[Mokiniai] masyvas.
Masyvas, todėl leiskite man pabandyti valyti tai padaryti.
Leiskite man šiek tiek už save kambarį viršuje, ir leiskite man, o ne padaryti čia.
Mes jį vadiname šių žmonių, ir vietoj to aš ruošiuosi pasakyti "int adresus,
ir aš ruošiuosi palaikyti 3 iš mūsų dabar.
Aš ruošiuosi pasakyti "styginių vardus", ir aš palaiko 3 iš mūsų,
ir tada aš ruošiuosi pasakyti "styginių namus", ir aš norėčiau paremti 3 iš mūsų.
Dabar čia vietoj David gauti savo vietos kintamieji
mes galime atsikratyti tų,.
, Kad jaučiasi gerai, kad mes valyti tai.
Galiu pasakyti Dovydas bus [0] ir vardai [0]
ir namų [0].
Ir tada Rob panašiai galime sutaupyti tai.
Tegul tai žemyn čia, kad jis ketina būti savavališkai ID [1].
Jis vyksta, kad jo pavardė būtų [1],
ir tada galiausiai, namai [1].
>> Dar šiek tiek varginantis, ir dabar aš turiu suprasti tai,
todėl tarkim "vardai [0], id [0], namai [0],
ir tegul pluralize tai.
Ids, IDS, idėjas.
Ir vėl, aš tai daro, todėl vėl aš jau kreipiantis į nukopijuokite / įklijuokite iš naujo,
todėl šansai yra, yra ir kitas sprendimas čia.
Aš greičiausiai gali išvalyti tai padaryti su kilpa, ar kažką panašaus, kad,
Taigi trumpai tariant, tai šiek tiek geriau, bet vis dar jaučiasi
Aš kreipiantis kopijuoti / įklijuoti, tačiau net ir tai, aš patvirtinu,
tikrai nėra iš esmės teisingas sprendimas, nes
ką daryti, jei kada nors mes nuspręsime, kad jūs žinote, ką?
Mes tikrai turėjo, o saugojimo elektroninio pašto adresą, Dovydo ir Rob
ir visi kiti šioje programoje.
Mes taip pat turėtume laikyti telefono numerius.
Mes taip pat turėtume laikyti skubios pagalbos numeriai.
Mes turime visus šiuos duomenis gabalus, kad mes norime laikyti,
taip, kaip jums eiti apie tai daro?
>> Jūs patvirtinate kitą masyvas viršuje, ir tada jūs rankiniu būdu įtraukti
pašto adresas [0], elektroninio pašto adresas [1]
Dovydo ir apiplėšti ir kt.
Bet ten tikrai tik prielaida, kuria grindžiamas šis dizainas
kad aš naudoju Honor sistema, žinoti, kad
[I] kiekvieną iš kelių masyvų
tiesiog taip atsitinka, susiję su tuo pačiu asmeniu,
taip [0] identifikatorius yra 123
ir aš ruošiuosi daryti prielaidą, kad vardus [0]
yra tas pats asmuo, vardas, pavardė ir namai [0]
yra tas pats asmuo, namai ir tt visiems įvairių sukurti masyvų.
, Bet pastebėsite, kad nėra esminis ryšys
iš jų 3 iš informacijos, id, name ir namo dalių,
nors subjektas, šioje programoje, mes stengiamės modelio nėra matricos.
Matricos yra tik tai programinis būdas tai padaryti.
Tai, ką mes tikrai norime modeliuoti mūsų programoje yra asmuo,
kaip Dovydo, kaip Rob asmuo, kurio viduje
ar apibendrinamos pavadinimas ir ID ir namas.
>> Mes galime kažkaip išreikšti šią hermetizuoti idėja
, pagal kurią asmuo turi ID, vardas ir namą
o ne griebtis tikrai tai Hack, kai mes tiesiog
pasitikėti, kad kronšteino kažką
daroma nuoroda į tos pačios žmogiškosios subjekto kiekvieną iš šių skirtingų masyvų?
Mes iš tikrųjų galite tai padaryti.
Leiskite man eiti virš pagrindinis dabar, ir leiskite man sukurti savo duomenų tipą
tikrai pirmą kartą.
Mes panaudojome šią technologiją scramble,
bet čia aš ruošiuosi eiti į priekį ir sukurti duomenų tipą,
ir žinote, ką aš ruošiuosi jį vadiname studentas arba asmuo,
ir aš ruošiuosi naudoti Typedef nustatyti tipą.
Aš ruošiuosi pasakyti, kad tai yra struktūra,
ir tada ši struktūra tipo studentas, mes pasakyti,
nors tai šiek tiek nuo dabar man.
Mes pasakyti "int numeris."
Mes pasakyti "String vardas".
Tada mes pasakyti "string namą,"
tai dabar, šių kelių eilučių kodą pabaigos
Apsukite metalinis garsas Aš ką tik mokė, kad egzistuoja
be int duomenų tipas, be stygų, be to, dviviečiai, be plūdės.
>> Kaip šio laiko linija 11 metu, dabar yra naujas duomenų tipas vadinamas studentai,
ir dabar aš galiu paskelbti studentų kintamąjį bet aš noriu,
todėl leiskite man slinkti žemyn žmonėms.
Dabar galiu atsikratyti šio ir aš galiu eiti atgal į Dovydo čia,
ir už Dovydą aš iš tiesų gali pasakyti, kad Dovydas,
mes galime tiesiog pavadinti kintamąjį po save,
bus tipo studentas.
Tai gali atrodyti šiek tiek keista, bet tai dar ne viskas, kad skiriasi
paskelbti kažką kaip int ar eilutę arba plūduriuoti.
Jis tiesiog taip atsitinka, turi būti vadinamas studentas dabar,
ir jei noriu daryti kažką viduje šios struktūros
Dabar aš turiu naudoti naują sintaksę gabalas, bet tai gana paprasta,
, david.name = "Dovydas" sostinėje D david.id = 123,
ir david.house = "Mather,"
ir dabar aš galiu atsikratyti šio stuff čia.
Pranešimas dabar mes atnaujinome mūsų programą tikrai daug geriau
kad dabar mūsų programa atspindi realų pasaulį.
>> Yra realaus pasaulio samprata, kad asmuo ar studentas.
Čia mes turime dabar C versija asmens arba, tiksliau studentas.
Viduje to asmens šie Atitinkamos techninės charakteristikos, kurių tinkamumas,
ID, pavadinimas ir namo, todėl Rob iš esmės tampa žemyn čia tas pats,
taigi studentas apiplėšti, o dabar rob.id = 456,
rob.name = "Rob".
Tas faktas, kad kintamasis yra vadinamas Rob tarsi beprasmis.
Mes galėjome pavadino jį x arba y arba z.
Mes tiesiog pavadino jį apiplėšti, semantiškai atitinka,
bet tikrai pavadinimas yra viduje pats toje srityje,
todėl dabar aš tai.
Tai taip pat nesijaučia kaip geriausią dizainą, kad aš sunkiai koduojami Dovydą.
Aš sunkiai koduojami Rob.
Ir aš vis dar turi imtis tikrą kopiją ir įklijuokite kiekvieną kartą, kai aš noriu naujus kintamuosius.
Be to, turiu ir matyt kiekvieną iš šių kintamųjų pavadinimą,
nors aš daug, o aprašomos šių kintamųjų
daugiau bendrine studentai.
>> Dabar mes galime sujungti idėjų, dirbusias mums
ir vietoj to pasakyti: "Žinai ką, man duoti kintamasis vadinamas studentų,
ir tegul jis bus 3 dydžio ", todėl dabar galiu patobulinti tai dar labiau,
atsikratyti rankiniu būdu deklaruotą Dovydo,
ir aš galiu vietoj pasakyti kažką panašaus į studentų [0] Čia.
Galiu pasakyti studentus [0] čia
studentai [0] čia, ir taip toliau, ir aš galiu eiti aplink
ir išvalyti, kad Rob.
Aš taip pat galėtų eiti apie dabar gal pridedant kilpą
ir naudojant GetString ir GetInt faktiškai gauti šias vertybes iš vartotojo.
Galėčiau eiti apie pridedant pastovus, nes tai iš esmės bloga praktika
į kietąjį kodą kai kokiam kaip 3 čia
ir tada tiesiog atminkite, kad jums reikia įdėti ne daugiau kaip 3 studentų.
Turbūt būtų geriau naudoti # define mano failo viršuje
ir kitų veiksnių, kad iš, todėl iš tikrųjų, leiskite man eiti į priekį ir apibendrinti.
>> Leiskite man atverti pavyzdį, kad tarp šiandien
pavyzdžiai iš anksto, structs1.
Tai yra visa programa, kuri naudoja # define čia
ir sako, kad mes ketiname turėti 3 studentus pagal nutylėjimą.
Čia aš skelbiantis klasės verta studentų,
todėl studentų klasėje, o dabar aš naudoju kilpą
tiesiog padaryti kodas šiek tiek daugiau elegantiškas, gyventojų klasę
vartotojo įvestį, todėl kartoti nuo i = 0 iki studentų, kurie yra 3.
Ir tada aš paskatinti vartotoją Šioje versijoje
kas studento ID, ir aš jį gauti su GetInt.
Koks studento vardas, ir tada aš jį gauti su GetString.
, Kas studento namas? I get it su GetString.
Ir tada apačioje čia, aš tiesiog nusprendžiau pakeisti
kaip aš spausdinti tai ir iš tikrųjų naudoti kilpą,
o kas aš spausdinti?
Pagal komentarą, aš spausdinti bet Mather,
ir viskas taip Rob ir Tommy ir tt iš tikrųjų Tommy Mather.
Tommy ir Dovydas būti spausdinami šiuo atveju, bet kaip tai dirba?
Šią funkciją, mes nematėme anksčiau, bet atspėti, ką tai nereiškia,.
Lygina eilutes.
>> Tai šiek tiek ne akivaizdus, ​​kaip ji lygina eilutes, nes paaiškėja,
jei jis grąžina 0, tai reiškia, kad stygos yra lygūs.
Jei ji grąžina -1, tai reiškia, kad vienas ateina abėcėlę prieš kitas,
ir jei ji grąžina 1, tai reiškia, kad kitą žodį ateina abėcėlę
anksčiau už kitą, ir jūs galite ieškoti internete arba žinyno puslapyje
tiksliai kokiu būdu yra, bet visa tai daro dabar, tai sako,
jeigu [i]. namas yra lygus "Mather"
tada eiti į priekį ir atspausdinti, kad ir taip yra Mather.
Bet štai ką mes dar nematėte anksčiau, ir mes grįžti prie šio.
Nepamenu, kad kada nors tai padaryti savo programas.
Nemokama, matyt, į atmintį, atlaisvinti atminties,
bet kas atminties aš matyt išleisti šio ciklo šios programos apačioje?
Atrodo, kad aš esu atlaisvinus asmens vardą
ir asmens namas, bet kodėl taip yra?
>> Pasirodo, visas šias savaites, kad jūs naudojate GetString
mes tipo buvo įvesti vieną kartą per klaidą į jūsų programų.
GetString dizaino skiria atminties, taip, kad ji gali grįžti į jums styga,
kaip Dovydas, arba Rob ir tada galite daryti ką nori
su ta savo programą eilutę, nes mes rezervuota jums atmintį.
Problema yra ta, visą šį laiką, kiekvieną kartą, kai paskambinti GetString
mes, autoriai apie GetString, buvo klausia operacinę sistemą
duoti mums šiek tiek RAM šios eilutės.
Duok mums šiek tiek RAM šiai kitą eilutę.
Duok mums šiek tiek daugiau RAM šio kitą eilutę.
Ką jūs, programuotojas, niekada buvo padaryti
suteikia mums, kad atminties atgal
šių kelių savaičių visas programas rašėte
turėjo tai, kas vadinama atminties šuolis, kai jie nuolat
vis daugiau ir daugiau atminties kiekvieną kartą, kai skambinate GetString, ir kad gerai.
Mes specialiai padaryti, kad pirmąsias savaites, nes tai nėra, kad įdomu
nereikės nerimauti apie tai, kur eilutė yra iš.
Viskas, ką norėtumėte yra žodis Rob grįžti, kai vartotojas įveda jį in
>> Bet juda į priekį, dabar mes turime pradėti vis labiau sudėtingesnės apie tai.
Bet kuriuo metu mes paskirstyti atmintį, mes geriau galiausiai perduoti jį atgal.
Kitaip realiame pasaulyje jūsų Mac arba PC, jums gali tekti kartais atsiranda
simptomai, kai jūsų kompiuteris yra šlifavimo sustabdyti ilgainiui
arba kvailas verpimo paplūdimio kamuolys yra tik užima kompiuteris
visą dėmesį ir jūs negalite daryti dalykus.
, Kurie gali būti paaiškinti bet klaidų skaičius, bet tarp tų galimų klaidų
yra dalykų, Atminties nutekėjimas, kažkas, kas rašė, kad programinė įranga,
jūs naudojate neprisiminė, kad atlaisvintumėte atminties,
kad jis ar ji paprašė operacinę sistemą,
nenaudojate GetString, nes tai CS50 dalykas, tačiau naudojant panašias funkcijas
kad paklausti operacinės sistemos atminties.
Jei jūs ar jie susukti ir iš tikrųjų niekada grįžti, kad atmintis
simptomas, kad gali būti, kad programa lėtina ir stabdo ir lėtina
, jei pamenate skambinti nemokamai.
>> Mes grįžti, kada ir kodėl jums turėtų skambinti nemokamai
bet eikime į priekį tiesiog gera priemonė ir pabandykite paleisti šią konkrečią programą.
Tai buvo vadinama structs1, įveskite.
Leiskite man eiti į priekį ir paleisti structs1, 123, David Mather parengto
456, Rob Kirkland, 789,
Tommy Mather, ir mes matome, Dovydo Mather, Tommy Mather.
Tai tik šiek tiek normalumas patikrinti, kad programa veikia.
Dabar, deja, ši programa yra šiek tiek varginantis, kad
Aš visos, kad darbas, aš įvedėte 9 skirtingų stygų, paspauskite "Enter",
buvo pasakyta, kuris buvo Mather, tačiau akivaizdu, aš žinojo, kas jau buvo Mather, nes aš ją įvedėte.
Būtų bent malonu, jei ši programa yra daugiau kaip duomenų bazės
ir ji iš tikrųjų prisimena, ką aš įvedėte
todėl aš niekada vėl turi įvesti šių studentų įrašus.
Gal tai kaip registrarial sistemos.
>> Mes galime tai padaryti naudojant šią techniką, vadinamą failą I / O, failo įvesties ir išvesties,
labai bendro pobūdžio būdas pasakyti, bet kada norite skaityti failus arba įrašyti failus
jūs galite tai padaryti su tam tikrų funkcijų rinkiniu.
Leiskite man eiti į priekį ir atidaryti šį pavyzdį structs2.c
kuris yra beveik identiškas, bet pažiūrėkime, ką jis dabar daro.
Failo viršuje paskelbti klasė studentų.
Aš tada užpildyti su vartotojo įvestį klasę,
todėl tie kodo eilutės lygiai taip, kaip anksčiau.
Tada, jei aš slinkti žemyn čia atspausdinti, kad kiekvienas, kuris yra Mather savavališkai, kaip anksčiau,
bet tai yra įdomi nauja funkcija.
Šios kodo eilutės yra nauja, ir jie įdiegti kažką čia,
Byloje, visi dangteliai, ir ji * čia taip pat.
Leiskite man perkelti tai čia, * čia taip pat.
>> Ši funkcija dar nematėte anksčiau, fopen,
bet tai reiškia, kad failą atidaryti, todėl galime peržvelgti jų,
ir tai yra kažkas, ką mes sugrįšiu ateityje psets,
bet ši eilutė čia iš esmės atidaro duomenų bazės failą pavadinimu
ir specialiai atidaro ją taip, kad ji gali daryti tai, ką į jį?
[Nesigirdi studentas]
Teisus, todėl "w" tik reiškia, kad jis pasako, kad operacinės sistemos
atidaryti šį failą taip, kad aš galiu rašyti į jį.
Aš nenoriu jį perskaityti. Aš nenoriu tiesiog žiūrėti į jį.
Aš noriu jį pakeisti ir įtraukti elementai gali,
ir byla bus vadinama duomenų bazės.
Tai galėtų būti vadinama nieko.
Tai gali būti database.txt. Tai gali būti db.
Tai gali būti kaip foo žodis, bet aš savavališkai pavadinimas pasirinktas failo duomenų bazę.
Tai šiek tiek normalumas patikrinimas, kad mes grįžti labai išsamiai, laikui bėgant,
jei fp, failo rodyklė, ne vienodą NULL, tai reiškia, kad viskas yra gerai.
>> Ilga istorija trumpa, funkcijas, pavyzdžiui, fopen, kartais nepavyksta.
Gal failas neegzistuoja. Gal jūs iš disko vietos.
Gal jūs neturite teises į tą aplanką,
fopen grąžina null todėl, jei kažką baisaus neįvyko.
Ir atvirkščiai, jei fopen negrįžta null viskas yra gerai
ir aš galiu pradėti rašyti į šį failą.
Štai naujas triukas.
Tai yra kilpa, kad manimi iteravimu per kiekvieną mano studentų,
ir tai atrodo tiek panašus į ką mes padarėme prieš,
tačiau ši funkcija yra pusbrolis printf vadinamas fprintf failui printf,
ir pastebėsite, kad jis skiriasi tik 2 būdais.
Vienas, jis pradeda f vietoj p
bet tada jos pirmasis argumentas yra, matyt, ką?
[Mokiniai] failas. >> Tai failas.
Šis dalykas vadinamas fp, mes galų gale erzinti, išskyrus tai, ką failas rodyklė
bet dabar fp tiesiog aš atidarau failą,
fprintf čia sako spausdinti šio vartotojo ID prie bylos, o ne į ekraną.
Spausdinti vartotojo vardą, prie bylos, o ne į ekraną,
namas į failą, o ne į ekraną, ir tada žemyn čia, be abejo,
uždaryti bylą, ir tada žemyn čia nemokamai atminties.
>> Vienintelis skirtumas tarp šios versijos 2 bei versiją 1
fopen įvedimas ir šį failą *
ir ši sąvoka fprintf, tad pažiūrėkime, ką galutinis rezultatas yra.
Leiskite man eiti į mano terminalo lange.
Leiskite man paleisti structs2, įveskite.
Atrodo, kad viskas yra gerai. Leiskite pakartotas structs2.
123, David Mather, 456, Rob Kirkland,
789, Tommy Mather, įveskite
Atrodo, kad jis elgėsi tas pats, bet jei aš dabar daryti ls
pastebėti, kas tai per failas yra čia tarp visų mano kodas, duomenų bazės,
todėl galime atidaryti, kad gedit duomenų bazės, ir pažvelgti į tai.
Tai ne failų formatų Sexiest.
Tai tikrai yra vienas gabalas duomenų perdavimo linija kiekvienoje eilutėje, kiekvienoje eilutėje,
bet tiems iš jūsų, kurie naudojate "Excel" arba CSV failus, kableliais atskirtos reikšmės,
Aš tikrai galėtų naudojo fprintf vietoj gal padaryti kažką panašaus į tai
taip, kad aš iš tikrųjų galėtų sukurti Excel failą ekvivalentas
atskiriant kableliais, o ne tik naujų linijų.
>> Šiuo atveju, jei aš vietoj to naudojo kableliais, o ne naujų linijų
Aš galėtų tiesiog atidaryti šį duomenų bazės failą "Excel", jei aš vietoj jis atrodys taip.
Trumpai tariant, dabar, kad mes turime teisę kreiptis į failus
dabar mes galime pradėti išlikusias duomenis, laikant jį aplink diske
, kad galėtume saugoti informaciją apie vėl ir vėl.
Pranešimas keletą kitų dalykų, kurie dabar šiek tiek labiau susipažinę.
Šio C failo viršuje Typedef
nes norėjome sukurti duomenų tipą, kuris atstovauja žodį,
todėl šis tipas vadinamas žodis, o viduje Šios struktūros
tai šiek tiek mėgėjas.
Kodėl žodis matyt masyvo?
Kas yra žodis tiesiog intuityviai?
>> Tai simbolių masyvas.
Tai simbolių seka, atgal atgal atgal.
LAIŠKAI didžiosiomis atsitinka, kad mes savavališkai pasakyti didžiausias ilgis
bet žodyne žodžio, kad mes naudojau scramble.
Kodėl aš turiu 1?
Null charakterį.
Prisiminkite, kai mes padarėme Bananagrams pavyzdį mums reikia ypatingą vertę
žodžio pabaigoje siekiant stebėti
kur žodžiai iš tikrųjų pasibaigė, ir kaip problema rinkinys specifikacija sako
čia mes susieti su tam tikru žodžiu vertė logiška,
vėliava, taip sakant, true arba false.
Ar jums rasti šį žodį jau, nes mes suprantame,
mes tikrai reikia atsiminti kelią ne tik tai, ką žodis yra scramble
bet ar jus, žmogaus, rado jį
taip, kad jei jums rasti žodį "" galite ne tik įrašykite, įvesti, įveskite, įveskite
ir gauti 3 taškus, 3 taškai, 3 taškai, 3 taškai.
Mes norime, kad būtų galima į juodąjį sąrašą, kad nustatyti bool žodį
tiesa, jei jūs jau jį radau, ir kad yra, kodėl mes
aplieti jį šioje struktūroje.
>> Dabar žemyn čia scramble tai kitas struct vadinamas žodynas.
Nesant yra žodis Typedef, nes šiuo atveju
mums reikia įdėti į kapsulę žodyno idėją,
ir žodyne yra visa krūva žodžių,
kaip teigiama šioje matricoje, ir kiek iš šių žodžių yra?
Na, ką šis kintamasis vadinamas dydis sako.
Bet mes tiesiog reikia vieną žodyną.
Mums nereikia duomenų tipą, vadinamą žodynas.
Mes tiesiog reikia vieną iš jų, todėl it turns out, C
, kad, jei jūs neturite pasakyti Typedef, galite tiesiog pasakyti, struct, tada viduje klamrami
jūs įtraukėte savo kintamuosius, tada jūs įtraukėte vardą.
Tai skelbiantis vieną kintamąjį, pavadintą žodyną
kad atrodo taip.
Priešingai, šios eilutės yra sukurti daugkartinio naudojimo duomenų struktūra, vadinama žodis
, kad jūs galite sukurti kelias kopijas, kaip ir mes sukūrėme
keletą kopijų studentams.
>> Ką tai galiausiai leis mums daryti?
Leiskite man grįžti į, tarkim, paprastesnį pavyzdį iš paprastesnių laikais,
ir leiskite man atverti, tarkim, compare1.c.
Problema čia yra iš tikrųjų žievelės atgal
eilutę sluoksnis ir pradėdami vartoti šias mokymo ratus
, nes paaiškėja, kad eilutę visą šį laiką
kaip žadėjome 1 savaitę tikrai tik slapyvardį,
sinonimas iš CS50 bibliotekos kažką, kad atrodo šiek tiek paslaptingas,
char *, ir mes matėme ši žvaigždė anksčiau.
Mes matėme byloms.
>> Leiskite dabar pamatyti, kodėl mes buvo pasislėpę šią detalę tam tikrą laiką dabar.
Čia yra rinkmena, pavadinta compare1.c,
ir jis akivaizdžiai prašo, kad vartotojas, 2 eilučių, s ir t,
ir tada ji bando palyginti šias eilutes lygybės 26 eilutėje,
ir jei jie nesiskiria, ji sako, "Jūs įvedėte tą patį,"
ir jei jie nėra lygūs ji sako: "Jūs įvedėte skirtingus dalykus."
Leiskite man eiti į priekį ir paleisti šią programą.
Leiskite man eiti į savo šaltinio katalogą, compare1. Jis parengė gerai.
Leiskite man paleisti compare1.
Aš padidinti, įeiti.
Ką nors pasakyti. Sveiki.
Pasakysiu kažką naujo. Sveiki.
Aš tikrai neturėjo įveskite skirtingus dalykus.
>> Leiskite man pabandyti šį kartą. Bye bye.
Tikrai nesiskiria, tai kas čia vyksta?
Na, tai, kas tikrai yra palyginti atitinka 26?
[Nesigirdi studentas]
Taip, kaip paaiškėja,, kad eilutę, duomenų tipas, yra rūšies balto melas.
Eilutė yra char *, bet kas yra char *?
Char *, kaip jie sako, yra rodyklė,
ir žymeklis veiksmingai adresas,
suma, kurią vietą atmintyje, ir, jei atsitiktų įvedėte žodžio kaip HELLO,
atšaukti iš ankstesnių diskusijų stygų
tai kaip žodžio HELLO.
Atminkite, kad gali būti atstovaujama, kaip HeLLO žodis
kaip simbolių masyvas, kaip šis
ir tada su specialiuoju simboliu pabaigoje vadinamas null pobūdį,
kaip \ žymi.
, Kas iš tikrųjų yra eilutė?
Atkreipkite dėmesį, kad tai yra kelis gabaliukus atminties,
ir iš tiesų, jo pabaigoje yra tik žinoma, kai jums atrodo per visą eilutę
ieško specialios null pobūdžio.
Bet jei tai yra iš mano kompiuterio atminties atminties riekė,
tegul savavališkai pasakyti, kad ši eilutė tiesiog pasisekė,
ir jis gavo pateikti pačioje pradžioje mano kompiuterio RAM.
Tai baitų 0, 1, 2, 3, 4, 5, 6 ...
>> Kai aš sakau kažką panašaus GetString ir aš string s = GetString
kas iš tikrųjų grąžinami?
Pastaruosius keletą savaičių, kas tikrai yra saugomi s
yra ne tai savaime eilutę, tačiau šiuo atveju tai, kas buvo saugomi
skaičius 0, nes ką GetString iš tiesų
tai nėra fiziškai grįžti eilutę.
Kad nėra net tikrai konceptualų jausmą.
Ką ji daro pelnas yra skaičius.
Šis skaičius yra HELLO adresas atmintyje,
ir styginių ai tada, jei mes žievelės atgal šis sluoksnis, styginių nėra tikrai egzistuoja.
Tai tik supaprastinimas CS50 bibliotekoje.
>> Tai tikrai yra kažkas vadinamas char *.
Char turi prasmę, nes tai, ką žodis, kaip HELLO?
Na, tai simbolių serija, ženklų serija.
Char * reiškia pobūdžio adresą,
Taigi, ką tai reiškia grįžti eilutę?
Gražus, paprastas būdas grąžina eilutę
o ne bandyti išsiaiškinti, kaip grįžti į 5 ar 6 skirtingų baitų
leiskite man grįžti prie kurio baito adresą?
Pirmasis.
Kitaip tariant, leiskite man duoti jums pobūdį adresą atmintyje.
Štai ką char * atstovauja, vieną požymį adresas atmintyje.
Skambinti, kad kintamojo s.
Parduotuvė s,, kad ypač adresas, kurį aš savavališkai sakė yra 0,
tik, kad viskas paprasta, bet iš tikrųjų tai paprastai didesnis skaičius.
>> Palauk.
Jei jūs tik, kad suteikėte man pirmą simbolį adresą, kaip man žinoti, ką adresas yra
antrojo pobūdžio, trečia, ketvirta ir penkta?
[Nesigirdi studentas]
Jūs tik žinoti, kur eilutės pabaigos pagal šią patogią apgauti,
todėl, kai jūs naudojate kažką panašaus printf, kas printf tiesiog mano, kaip savo argumentą,
priminti, kad mes naudojame šį% s vietos rezervavimo ženklą, ir tada jums perduoti
kintamasis saugoti eilutę.
Ką jūs tikrai artimųjų tos eilutės pirmasis simbolis adresas.
Printf tada naudoja linijos ar while cikle gavęs tą adresą,
pavyzdžiui, 0, todėl leiskite man tai padaryti dabar,
printf ("% s \ n");
Kai aš vadinu printf ("% s \ n" s), ką aš iš tikrųjų teikiant printf su
s yra pirmasis simbolis adresas, kuris šiame savavališkai atveju yra H.
>> Kaip printf žinoti, ką tiksliai parodyti ekrane?
Asmuo, kuris įgyvendino printf įgyvendino while cikle ar už linijos
sako, kad šis simbolis lygus ypatingą null simbolį?
Jei ne, jį atspausdinti. Kaip apie šį vieną?
Jei ne spausdinti, spausdinti, spausdinti, spausdinti.
O, tai yra ypatingas. Sustabdyti spausdinimą ir grįžti į vartotoją.
Ir kad tiesiog visa tai buvo daroma po gaubtu,
ir tai daug virškinti pirmą dieną klasėje,
bet dabar tai tikrai suprasti viską, statybinis blokas
kad vyksta viduje mūsų kompiuterio atmintyje,
ir galiausiai mes erzinti tai ne tik su nedidele pagalba
iš vieno iš mūsų draugų Stanfordo universitete.
>> Profesorius Nikas Parlante Stanfordo universitete padarė šį nuostabų vaizdo seką
iš įvairių skirtingų kalbų, kurios įdiegė
tai mažai Claymation pobūdis Binky.
Balso, jūs ketinate išgirsti tik keletą antra uždarą peržiūrą
Stanfordo profesorius, ir jūs gaunate
dabar tik 5 ar 6 sekundes šia teise,
bet tai yra pastaba, dėl kurių mes sudaryti šiandien
ir pradėti trečiadienį.
Aš jums pointeris Binky Pramogos su peržiūros.
[♪ Muzika ♪] [Profesorius Parlante] Ei, Binky.
Pabusti. Atėjo laikas rodykliniams įdomus.
[Binky] Kas tai? Sužinokite daugiau apie rodykles?
Oh, geruolis!
>> Pamatysiu jus trečiadienį.
[CS50.TV]