[Powered by Google Translate] [Apžvalga] [Viktorina 0]
>> [Lexi Ross, Tommy MacWilliam, Lucas Freitas, Joseph Ong] [Harvardo universiteto]
>> [Tai CS50.] [CS50.TV]
>> Ei, visi.
Sveiki atvykę į peržiūros sesijos 0 Viktorina, kuri vyksta šį trečiadienį.
Ką mes ketiname tai padaryti šį vakarą, aš su 3 kitų TFS
ir kartu mes ketiname eiti per ką mes padarėme Žinoma, peržiūros.
Jis nesiruošia būti 100% išsamus, tačiau jis turėtų suteikti jums geresnį supratimą
, ką jūs jau turite ir ko jums vis tiek reikia studijuoti iki trečiadienio.
Ir nedvejodami pakelti ranką klausimus, kaip mes einame kartu,
, tačiau reikia nepamiršti, kad mes taip pat turime šiek tiek laiko pabaigoje
jei mes gauti per keletą minučių atsarginių daryti bendro pobūdžio klausimus,
todėl keep that in mind, ir todėl mes ketiname pradėti su 0 savaitės pradžioje.
>> [Viktorina 0 Review!] [0 dalis] [Lexi Ross] Bet kol mes padaryti, kad pakalbėkime apie
Viktorinos logistika.
>> [Logistika] [Viktorina vyksta Trečiadienis 10/10 vietoj paskaitos]
>> [(Žr. Išsamesnės informacijos http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf)] Tai trečiadienis, spalis 10.
>> Štai šį trečiadienį, ir jei jūs einate į šį URL čia,
, kuri yra taip pat prieinama iš CS50.net-ten yra nuoroda į jį,
galite pamatyti informaciją apie tai, kur eiti, remiantis
Jūsų pavardė ar mokyklos priklausomybė taip pat
jis pasakoja apie tai, ką viktorina apims ir klausimų tipai, kad jūs ketinate gauti.
Turėkite omenyje, kad jūs taip pat turėsite galimybę peržiūrėti viktorinoje skyriuje,
todėl jūsų TFS turėtų būti vyksta per šiek tiek praktikos problemas,
ir tai yra dar viena gera proga pamatyti, kur jūs vis dar reikia mokytis viktorinoje.
Pradėkime su bitai 'n' baitų pradžioje.
Atminkite, šiek tiek yra tik 0 arba 1,
ir baitas yra 8 šių bitų kolekcija.
Pažvelkime šiuo bitų surinkimo čia.
Turėtume sugebėti išsiaiškinti, kiek bitų yra.
Kur tikimės, kad tik 8 iš jų 8 0 arba 1 vnt.
Ir kadangi yra 8 bitai, 1 baitas,
ir tegul konvertuoti jį į šešioliktainį.
Šešioliktainis yra pagrindo 16, ir tai gana lengva konvertuoti
dvejetainis skaičius, o tai, kas tai yra, šešioliktainis skaičius.
Visi mes darome, mes pažvelgti grupėmis po 4,
ir mes juos konvertuoti į atitinkamą šešioliktainis skaitmuo.
Mes pradedame su dešiniojoje grupės 4, 0011.
Tai bus vienas 1 ir 2, tai kartu, kad daro 3.
Ir tada pažvelkime kitame bloke 4.
1101. Tų, kurie ketina būti viena 1, 4, ir vienas 8.
Kartu, kad bus 13, todėl D.
Ir mes prisiminti,, kad šešioliktainis mes ne tiesiog eiti nuo 0 iki 9.
Mes einame 0 iki F, kad po 9, 10 atitinka,
11 B, ir tt, kur F yra 15.
Čia 13 yra D,
kad konvertuoti jį į dešimtainį, visi mes darome, mes iš tikrųjų
laikyti kiekvieną poziciją kaip 2 galios.
Štai vienas 1, vienas 2, nulis 4s, nulis 8s, vienas 16 ir tt,
ir tai šiek tiek sunku apskaičiuoti galvą, bet jei mes einame į kitą skaidrę
mes galime matyti, kad atsakymas į šį.
>> Iš esmės mes ketiname per iš dešinės į kairę,
ir mes dauginant kiekvieną skaitmenį pagal atitinkamą galią 2.
Ir atminkite, kad mes Šešioliktainius skaičius žymi šiuos numerius su 0x pradžioje
todėl nereikia supainioti su dešimtainiu skaičiumi.
Tęsiant tai ASCII lentelė,
ir ką mes naudojame ASCII map iš simbolių skaitines reikšmes.
Prisiminti kriptografijos pset plačiai naudoti ASCII lentelėje
siekiant naudoti įvairius metodus, kriptografijos,
Cezaris ir Vigenere šifras skirtingus laiškus, konvertuoti
eilutę pagal vartotojo pateiktas iki rakto.
Pažvelkime šiek tiek ASCII matematikos.
Žiūri "P" + 1, simbolių forma, kuri be Q
ir prisiminti, kad '5 '≠ 5.
Ir kaip tiksliai tai mes konvertuoti tarp tų 2 formų?
Iš tikrųjų tai ne per sunku.
Siekiant gauti 5 mes atimti '0 '
, nes yra 5 vietos tarp "0" ir "5".
, Siekiant pereiti į kitą pusę, mes tiesiog pridėti 0,
todėl tarsi reguliariai aritmetinis.
Tiesiog neužmirškite, kad kai kažkas turi kabutes pobūdis
ir todėl atitinka ASCII lentelę vertės.
Persikėlimas į bendresnes Kompiuterijos temomis.
Mes sužinojome, kad tai, kas yra algoritmas ir kaip mes ją naudojame programavimo
įgyvendinti algoritmai.
Kai algoritmų pavyzdžiai yra kažkas tikrai paprasta kaip
patikrinti, ar skaičius yra lyginis ar nelyginis.
Už tai atsimenu, mes mod skaičių iš 2 ir patikrinti, ar rezultatas yra 0.
Jei taip, tai dar. Jei ne, tai keista.
Ir tai yra tikrai pagrindinio algoritmo pavyzdys.
>> Šiek tiek daugiau dalyvavo ir dvejetainis paieškos
mes pereiti vėliau sesijos apžvalgos.
Ir programavimas yra terminas, naudojamas algoritmą
ir konvertuoti kodas kompiuterį gali skaityti.
2 programų pavyzdžiai yra nulio,
, kuri yra tai, ką mes padarėme savaitė 0.
Nors mes ne iš tikrųjų įveskite kodą įgyvendinimo būdas
šis algoritmas, kuris spausdina skaičiai 1-10,
ir čia mes darome tą patį C programavimo kalba.
Tai yra funkciškai lygiavertės, tik parašyta įvairiomis kalbomis ar sintaksės.
Mes tada sužinojo apie Būlio išraiškos,
ir loginė reikšmė yra vertė, tai arba true arba false,
ir čia dažnai Būlio išraiškos
vidun sąlygų, todėl, jei (x ≤ 5),
gerai, mes jau x = 5, kad sąlyga ketina įvertinti, tiesa.
Ir jei tai tiesa, bet kodas yra po sąlyga
bus vertinami iš kompiuterio, kad eilutė bus spausdinami
į standartinį išvedimą ir trukmės sąlyga
reiškia viską, kas yra viduje IF skliaustuose.
Prisiminti visiems suinteresuotiems ūkio subjektams.
Atminkite, tai && ir | | kai mes bandome sujungti 2 ar daugiau sąlygų,
== Ne = patikrinti, ar 2 dalykai yra lygūs.
Atminkite, kad = užduotims, o == Būlio operatorius.
≤, ≥ ir tada galutinis 2 yra savaime suprantama.
Bendrosios peržiūros Bulio logika čia.
Ir loginės išraiškos yra taip pat svarbu, kilpomis,
kuriuos mes eiti per dabar.
Mes sužinojome apie 3 rūšių kilpos iki šiol CS50,, o ir padaryti, o.
Ir svarbu žinoti, kad nors dauguma tikslų
mes iš tikrųjų galite naudoti bet kokio tipo kilpa paprastai
yra tam tikrų rūšių tikslais arba bendrų tendencijų
programavimo, kurie konkrečiai reikalauja viena iš šių kilpų
, kad padaryti jį pačios efektyviausios arba elegantiškas kodas ją tokiu būdu.
Eikime per tai, ką kiekvienas iš šių kilpų linkęs būti naudojamas dažniausiai.
>> Į už linijos mes paprastai jau žinote, kiek kartų mes norime pakartoti.
Tai, ką mes įdėti sąlyga.
Nes, i = 0, i <10, pvz.
Mes jau žinome, kad norime padaryti kažką 10 kartų.
Dabar, while cikle, paprastai mes nebūtinai
sužinoti, kiek kartų mes norime linijos paleisti.
Bet mes žinome kažkokią būklės, kad mes norime, kad ji
visada būti teisingi arba visada yra melagingi.
Pavyzdžiui, nors yra nustatytas.
Tarkime, kad Būlio kintamieji.
Nors tai tiesa, mes norime kodas įvertinti,
todėl šiek tiek labiau išplečiama, šiek tiek daugiau nei už linijos,
tačiau bet už linijos taip pat gali būti konvertuojami į while cikle.
Galiausiai nustatyta, ar, o kilpos, kurios gali būti sudėtingiausia suvokti iš karto,
dažnai naudojami, kai norime įvertinti kodą
prieš pirmą kartą mes tikriname šią sąlygą.
Dažnai naudojamas daryti, o kilpa
yra tada, kai norite gauti vartotojo įvesties, ir jūs žinote, jūs norite paprašyti, kad naudotojas
įvesties bent vieną kartą, bet jei jie nesuteikia jums gerą indėlį, iš karto
norite nuolat klausia juos, kol jie jums gerą indėlį.
Štai labiausiai paplitęs while cikle,
ir pažiūrėkime faktiniu šių kilpų struktūros.
Jie paprastai visada linkę laikytis šių modelių.
>> Dėl pasiūlymo kilpa viduje jūs turite 3 dalys:
iniciacijos, paprastai kažkas panašaus int i = 0, kur i yra skaitiklis,
sąlyga, jei mes norime pasakyti, paleisti linijos tol, kol ši sąlyga vis dar turi,
Kaip aš <10, ir galiausiai, atnaujinti, o tai, kaip mes prieaugio
skaitiklis kiekvienos kilpos taške kintamasis.
Dažnas dalykas pamatyti ten yra tik i + +,
o tai reiškia, prieaugio i 1 kiekvieną kartą.
Jūs taip pat galėtų padaryti kažką panašaus i + = 2,
o tai reiškia, I 2 pridėti kiekvieną kartą, kai jūs einate per kilpą.
Ir tada padaryti tai tiesiog reiškia bet kokį kodą, kad iš tikrųjų veikia kaip kilpa.
Ir while cikle, šiuo metu mes iš tikrųjų iniciacijos už kilpos,
taigi, pavyzdžiui, tarkim, mes stengiamės padaryti tos pačios rūšies kilpos, kaip aš ką tik aprašytą.
Mes sakytume, int i = 0 prieš kilpa prasideda.
Tada mes galime pasakyti, o aš <10 tai padaryti,
todėl tą patį kodo blokas, kaip ir anksčiau,
ir šį kartą atnaujinta dalis kodo, pavyzdžiui, aš + +,
iš tikrųjų vyksta viduje kilpos.
Ir, pagaliau, daryti, o, jis panašus į while cikle,
tačiau mes turime prisiminti, kad kodas bus įvertinti, kai
Prieš sąlyga, tikrinama, todėl daro daug daugiau prasmės
jei peržvelgsite tvarka viršaus į apačią.
Do, o kilpa kodas įvertina prieš jus net pažvelgti kartu būklės,
kadangi while cikle, jis pasitikrina pirmas.
Ataskaitos ir kintamieji.
Kai mes norime sukurti naują kintamąjį mes pirmiausia norime ją inicijuoti.
>> Pavyzdžiui, int baras inicijuoja kintama baras,
tačiau jis neturi suteikti jai vertę, tai kas yra baro vertė dabar?
Mes nežinome.
Jis gali būti šiek tiek šiukšlių vertė, kuri anksčiau buvo saugomas atmintyje,
ir mes nenorime naudoti šį kintamąjį
kol mes iš tikrųjų suteikia jai reikšmę,
todėl mes skelbiame jį čia.
Tada mes inicijuoti, kad ji būtų toliau 42.
Dabar, žinoma, mes žinome, tai gali būti padaryta, į vieną eilutę, int bar = 42.
Bet tik reikia išvalyti kelis veiksmus, kurie vyksta,
deklaraciją ir iniciacijos vyksta atskirai.
Taip atsitinka, vienas žingsnis, ir kit ˛ a, int baz = bar + 1,
Toliau šis teiginys, kad padidėjimų Baz, kad šio bloko kodo pabaigoje
jei mes spausdinti bazių vertę, kad būtų 44
nes mes pareiškiame ir inicijuoti, kad ji būtų 1> juosta
ir tada mes prieaugio jį dar kartą su + +.
Mes nuėjome per šį gana trumpai, bet tai gerai, kad bendras
suprasti, ką verpalai ir renginiai.
Mes daugiausia tai padarė nulio,
todėl jūs galite galvoti apie temas kaip daug kodo sekas
veikia tuo pačiu metu.
Be aktualija, tikriausiai jis toks ir yra ne veikia tuo pačiu metu,
bet tarsi abstrakčiai mes galime galvoti apie tai, kad taip.
>> Nulio, pavyzdžiui, mes turėjome kelis animacinius.
Tai galėtų būti tuo pačiu metu vykdyti kitą kodą.
Vienas gali būti vaikščiojimas, o kitas sako kažką
kitoje ekrano dalyje.
Įvykiai yra dar vienas būdas atskirti logiką
tarp skirtingų elementų savo kodą,
ir nulio, mes galėjome, kad būtų imituotos įvykius naudojant transliacija
ir kad iš tikrųjų Kai gausiu, o ne, kai aš girdžiu,
, tačiau iš esmės tai yra būdas perduoti informaciją
iš vienos į kitą Sprite.
Pavyzdžiui, galbūt norėsite perduoti žaidimą per
ir kai gauna kita Sprite žaidimą per
jis reaguoja tam tikru būdu.
Tai svarbi modelis suprasti programavimo.
Tiesiog eiti per pagrindinio savaitę 0, tai, ką mes iki šiol praėjo per
pažvelkime šį paprastą C programos.
Tekstas gali būti šiek tiek mažas, iš čia, bet aš eiti per jį tikrai greitai.
Mes įskaitant 2 header files viršuje, cs50.h ir stdio.h.
Tada mes apibrėžiant pastovų, vadinamą ribą, turi būti 100.
Mes tada įgyvendinti savo pagrindinę funkciją.
Kadangi mes nenaudojame komandinės eilutės argumentai čia mes turime įdėti negaliojančiu
kaip pagrindiniai argumentai.
Mes matome int virš pagrindinis. Štai grįžimo tipo, todėl grįžti 0 apačioje.
Ir mes naudojame CS50 bibliotekos funkcija gauti int
prašyti vartotojo input, ir mes saugome Šis kintamasis x,
todėl mes skelbiame x pirmiau, ir mes jį inicijuoti, kai x = GetInt.
>> Mes tada patikrinkite, jei vartotojas davė mums gerą indėlį.
, Jei ji ≥ LIMIT norime grįžti klaidos kodas iš 1 ir spausdinti klaidos pranešimą.
Ir pagaliau, jei vartotojas davė mums geras įnašas
mes ketiname aikštėje ir išspausdinti šį rezultatą.
Tiesiog įsitikinkite, kad tie visi Patekti į
jūs galite pamatyti visas etiketes įvairiose kodą čia.
Minėjau pastovus, antraščių failus.
O, int x. Įsitikinkite, kad prisiminti, kad vietos kintamąjį.
Priešpastato jį pasaulinį kintamąjį, kurį mes kalbame apie
šiek tiek vėliau sesijos apžvalgos,
ir mes kviečiame bibliotekos funkcija printf,
tad jei nebūtume įtraukti stdio.h antraštės failą
nebūtų suteikta galimybė skambinti printf.
Ir aš tikiu, yra nukreipta rodyklė, kad gavo nukirto į% d,
kuris yra formatavimo eilutę printf.
Ji sako, kad atsispausdinti šį kintamąjį kaip skaičius,% d.
Ir kad tai 0 savaitės.
Dabar Lucas ketina tęsti.
Ei, vaikinai. Mano vardas yra Lukas.
Aš tikiu antrakursis geriausiu name miesteliu, Mather,
ir aš norėčiau pakalbėti šiek tiek apie savaitę 1 ir 2,1.
[Savaitė 1 ir 2,1!] [Lucas Freitas]
Kaip Lexi sakiau, kai mes pradėjome versti savo kodą nuo nulio iki C
vienas iš dalykų, kad mes pastebėjome, yra tai, kad jūs galite ne tik
rašyti savo kodą ir paleisti jį naudojant žalią vėliavą nebėra.
Tiesą sakant, jūs turite naudoti tam tikrus veiksmus, kad jūsų C programa
tapti vykdomąjį failą.
Esmės tai, ką jūs darote, kai rašote programą yra tai, kad
jums išversti savo mintis į kalbą, kad kompiliatorius gali suprasti,
todėl, kai jūs rašote programą C
tai, ką jūs darote, yra iš tikrųjų rašyti kažką, kad jūsų kompiliatorių supras,
tai kompiliatorius ketina išversti šį kodą
į kažką, kad jūsų kompiuteris bus suprasti.
>> Ir dalykas, kompiuteris iš tikrųjų yra labai kvailas.
Jūsų kompiuteris gali suprasti tik 0s ir 1s,
faktiškai pirmųjų kompiuterių žmonės paprastai užprogramuotas
0s ir 1s, bet ne daugiau, ačiū Dievui.
Mes neturime įsiminti dėl 0s ir 1s sekas
už linijos arba while cikle ir pan.
Štai kodėl mes turime kompiliatorius.
Kas sudarytojas ar tai iš esmės verčia C kodas,
mūsų atveju, į kalbą, kad jūsų kompiuteris bus suprasti,
, kuri yra objekto kodas, ir kompiliatorius, kad mes naudojame
vadinamas Apsukite metalinis garsas, todėl iš tikrųjų tai yra Apsukite metalinis garsas simbolis.
, Kai jūs turite savo programą, jūs turite daryti 2 dalykų.
Pirma, jūs turite sudaryti savo programą, ir tada jūs ketinate paleisti programą.
Norėdami sudaryti savo programą, jūs turite daug galimybių tai padaryti.
Pirmasis yra padaryti Apsukite metalinis garsas program.c
programa, kurioje yra jūsų programos pavadinimas.
Šiuo atveju jūs galite pamatyti, jie tiesiog sako: "Ei, sudaryti savo programą."
Jūs nesate sakydamas: "Aš noriu šį mano programos pavadinimą" ar ką nors.
>> Antroji galimybė vardą į savo programą.
Apsukite metalinis garsas-galima sakyti, o ir tada vardas, kurį norite
vykdomąjį failą bus pavadintas ir tada program.c.
Ir jūs galite taip pat padarysiu programą, ir pamatyti, kaip per pirmuosius 2 atvejais
Aš įdėti c, o trečiojoje dalyje turiu tik programas?
Taip, jūs iš tikrųjų neturėtų įdėti. C, kai jūs naudojate.
Priešingu atveju kompiliatorius iš tikrųjų vyksta klykauti ne jums.
Ir taip pat, aš ne žinoti, jei jus vaikinai prisiminti,
bet kartais mes taip pat naudojamas lcs50 arba lm daug.
, Kuris yra vadinamas susiejimas.
Jis tiesiog pasakoja kompiliatorių, kad jums naudoti šias bibliotekas teisę ten,
, todėl, jei norite naudoti cs50.h jūs iš tikrųjų turite įvesti
Apsukite metalinis garsas program.c-lcs50.
Jei jums nereikia daryti, kad sudarytojas nesiruošia žinoti
kad jūs naudojate šias funkcijas cs50.h.
Ir, jei norite paleisti programą, jūs turite 2 galimybes.
Jei tu Apsukite metalinis garsas program.c tu negali suteikti pavadinimą, kad jūsų programa.
Jūs turite paleisti jį naudojant / a.out.
A.out standarto pavadinimas, kad Apsukite metalinis garsas suteikia savo programą, jei jūs neturite suteikti jai pavadinimą.
Kitaip jūs ketinate daryti. / Programa, jei jūsų programa davė pavadinimą,
ir taip pat, jei programos pavadinimą, kad programa yra ketinate gauti
jau galima užprogramuoti tą patį pavadinimą kaip c failas.
Tada mes kalbėjome apie duomenų tipus ir duomenų.
>> Iš esmės duomenų tipai yra tas pats, kaip mažai dėžės, jie naudoja
saugoti vertybes, todėl duomenų tipai yra iš tikrųjų kaip ir pokemons.
Jie ateina visų dydžių ir tipų.
Aš nežinau, jei tai analogija prasminga.
Duomenų dydis iš tikrųjų priklauso nuo mašinų architektūros.
Visi duomenų dydžių, kad aš ketinu parodyti čia
iš tikrųjų yra 32-bitų mašina, kuri yra mūsų prietaiso,
tačiau, jei jūs iš tikrųjų kodavimo savo "Mac" arba "Windows" taip pat
tikriausiai jūs ketinate turėti 64-bitų mašina,
todėl nepamirškite, kad duomenų dydžių, kad aš ruošiuosi parodyti čia
32-bitų mašina.
Pirmasis, kad mes matėme int,
kuri yra gana paprasta.
Galite naudoti int saugoti sveikasis skaičius.
Taip pat matėme charakterį, char.
Jei norite naudoti raštą ar mažai simbolis jūs tikriausiai ketina naudoti char.
Char yra 1 baitas, o tai reiškia, 8 bitai, pavyzdžiui, Lexi sakė.
Iš esmės mes turime ASCII lentelę, kuri turi 256
galimų kombinacijų 0s ir 1s,
ir tada, kai įvesite char ji ketina versti
simbolių, kad žaliavos, jums skaičius, kad jūs turite ASCII lentelę, kaip Lexi sakė.
Mes taip pat turime svyravimas, kurį mes naudojame saugoti dešimtainių skaičių.
Jei norite pasirinkti 3,14, pavyzdžiui, jūs ketinate naudoti plūdę
arba dvigubai daugiau tikslumo.
Plūdė turi 4 baitų.
Dvigubai turi 8 baitų, todėl vienintelis skirtumas yra tikslumas.
Mes taip pat turime ilgai, kad su skaičiais,
ir jūs galite pamatyti 32-bitų mašina, int ir ilgai būti tokio pat dydžio,
, todėl ji nėra tikrai prasminga naudoti 32-bitų mašina.
>> Bet jei jūs naudojate "Mac" ir 64-bit mašina, iš tikrųjų ilgai dydis 8,
taip, tai tikrai priklauso nuo architektūros.
32-bitų mašina nėra prasmės naudoti ilgai tikrai.
Ir tada ilgai ilgai, kita vertus, yra 8 baitai,
todėl jis yra labai gerai, jei norite turėti ilgesnį sveikasis skaičius.
Ir, pagaliau, mes turime eilutę, kuris iš tikrųjų yra char *,
kuris yra rodyklė į char.
Tai labai lengva galvoti, kad eilutės dydis bus kaip
simbolių skaičių, kad jūs turite ten,
bet iš tikrųjų char *
rodyklė į char, kuris yra 4 baitų dydžio.
Char * dydis yra 4 baitų.
Nesvarbu, jei turite mažą žodį arba raidę arba nieko.
Tai bus 4 baitų.
Mes taip pat sužinojome šiek tiek apie liejimą,
, kaip jūs galite pamatyti, jei turite, pavyzdžiui, programa, kuri sako
int x = 3 ir tada printf ("% d", x / 2)
Ar jūs žinote, ką ji ketina atspausdinti ekrane?
>> Kas nors? >> [Studentai] 2.
1. >> 1, yeah.
Kai jūs darote 3/2 ji ketina gauti 1,5
bet kadangi mes naudojame sveikąjį skaičių ji ketina ignoruoti dešimtąją dalį,
ir jūs ketinate turėti 1.
Jei nenorite, kad taip atsitiktų, ką galite padaryti, pavyzdžiui,
paskelbti plūdę y = x.
Tuomet x, kurie būtų 3 dabar bus 3,000 y.
Ir tada jūs galite spausdinti y / 2.
Tiesą sakant, aš turėtų būti 2. ten.
Jis ketina padaryti, 3.00/2.00
ir jūs ketinate gauti 1,5.
Ir mes turime šį .2 f tiesiog paklausti 2 dešimtainių vienetų dešimtąją dalį.
Jei turite .3 f ji ketina iš tikrųjų 1,500.
, Jei tai 2 tai bus 1,50.
Mes taip pat turime šiuo atveju čia.
Jei jūs darote plūdę x = 3,14 ir tada jūs printf x
jūs ketinate gauti 3,14.
Ir jei jūs x = x int
, o tai reiškia, gydyti int x, kaip ir jums spausdinti X Dabar
jūs ketinate turėti 3,00.
Ar tai prasminga?
Nes jūs pirmą kartą gydant x kaip sveikasis skaičius, todėl jūs ignoruojant dešimtainę dalį,
ir tada jūs spausdinate x.
Ir pagaliau, jums taip pat gali tai padaryti,
int x = 65, ir tada jums paskelbti char c = x,
ir tada, jei spausdinti c jūs iš tikrųjų ketinate gauti
, Todėl iš esmės, ką darai čia
versti sveikasis skaičius į simbolį,
taip pat kaip ASCII lentelė.
Mes taip pat kalbėjo apie matematikos operatorių.
Dauguma jų yra gana paprasta, todėl +, -, *, /,
ir mes taip pat kalbėjo apie mod, kuris yra 2 numeriai skyriaus likusi.
Jei turite 10% 3, pavyzdžiui,
tai reiškia, kad 3 10 padalinti, ir kokia yra likusi?
Jis ketina būti 1, todėl jis iš tikrųjų labai naudinga daug programų.
Už Vigenere ir Cezaris, aš esu gana įsitikinęs, kad visi iš jūsų vaikinai naudojami mod.
Apie matematikos operatorių, turi būti labai atsargūs, kai derinant * ir /.
>> Pavyzdžiui, jei jūs (3/2) * 2 ką jūs ketinate įsigyti?
[Studentai] 2.
Taip, 2, nes 3/2 bus 1,5,
bet kadangi jūs darote 2 sveikųjų skaičių operacijas tarp
jūs iš tikrųjų tik ketina apsvarstyti 1
ir tada 1 * 2 bus 2, todėl būkite labai, labai atsargūs,
kai daro aritmetines operacijas su sveikaisiais skaičiais, nes
galite gauti, kad 2 = 3, kad šioje byloje.
, O taip pat būti labai atsargūs apie pirmumo.
Jūs paprastai turėtų naudoti skliaustelius būti tikri, kad žinote, ką jūs darote.
Kai kurios naudingos nuorodos, žinoma, vienas i + + arba i + = 1
arba naudojant + =.
Tai yra tas pats dalykas, kaip daro i = i + 1.
Taip pat galite padaryti i - arba i = 1,
kuris yra tas pats, kaip i = i -1,
tai, ką jūs vaikinai naudoti daug kilpų, bent jau.
Be to, *, jei jūs naudojate * = ir jei jūs, pavyzdžiui,
i * = 2 yra tas pats, kaip sakydamas, i = i * 2
ir tas pats dalykas pasidalijimas.
Jei tai padarysite i / = 2, tai tas pats, kaip i = i / 2.
>> Dabar apie funkcijas.
Jus vaikinai sužinojo, kad funkcijos yra labai gera strategija išsaugoti kodą
o jūs programavimas, todėl, jei norite atlikti tą pačią užduotį
code vėl ir vėl, tikriausiai jūs norite naudoti funkciją
tik tokiu būdu jūs neturite, nukopijuokite ir įklijuokite kodą, vėl ir vėl.
Tiesą sakant, pagrindinė funkcija, ir, kai aš parodyti jums funkcijos formą
jūs ketinate matyti, kad tai yra gana akivaizdus.
Mes taip pat naudojame funkcijas iš kai kuriose bibliotekose,
printf, pavyzdžiui, getin, kuris yra iš CS50 bibliotekoje,
ir kitas funkcijas, pavyzdžiui, toupper.
Visi iš šių funkcijų yra iš tikrųjų įgyvendinamos kitose bibliotekose,
ir kai jūs įtraukėte tas TETHER failus jūsų programos pradžioje
jūs sakote, Ar galite man duoti man tų funkcijų kodą
todėl aš neturiu juos įgyvendinti pats?
Ir taip pat galite rašyti savo funkcijas, todėl, kai jūs pradėti programavimo
jūs suprasite, kad bibliotekos neturi visas funkcijas, kad jums reikia.
Per pastaruosius pset, pavyzdžiui, mes parašėme piešti, scramble, ir peržvalgos,
ir tai labai, labai svarbu, kad būtų galima rašyti funkcijas
nes jie yra naudingi, ir mes naudojame juos visą programavimo laikotarpiui,
ir ji taupo daug kodo.
Funkcijos formatas yra šis.
Mes turime grįžties tipas pradžioje. Kas yra grįžimo tipo?
Tai tik tada, kai jūsų funkcija nesiruošia grįžti.
Jei turite funkciją, pavyzdžiui, faktorinė,
kad ketina apskaičiuoti sveikojo skaičiaus faktorialas,
tikriausiai jis ketina grįžti sveikasis skaičius.
Tada grįžti tipas bus int.
Printf iš tikrųjų turi grįžimo tipo negaliojančiu
, nes jūs nieko negrįžta.
Jūs tiesiog spausdinti ką į ekraną
ir mesti funkciją vėliau.
Tada jūs turite funkcija, galite pasirinkti vardą.
Jūs turite būti šiek tiek protingas, kaip nesirinkite kaip xyz pavadinimas
arba kaip x2f.
Stenkitės, kad pavadinimą, kuris turi prasmę.
>> Pavyzdžiui, jei tai faktorialas, tarkim faktorialas.
Jei tai funkcija, kuri ketina padaryti kažką, pavadinkite jomis pasinaudoti.
Ir tada mes turime parametrus, kurie taip pat vadinamas argumentai,
, kurie yra kaip išteklių, kad jūsų renginys turi
iš savo kodą, atlikti savo užduotį.
Jei norite apskaičiuoti skaičiaus faktorialas
galbūt jums reikia turėti numerį apskaičiuoti faktorialas.
Vienas iš argumentų, kad jūs ketinate turėti abonento numeris.
Ir tada jis ketina kažką daryti ir grąžinti reikšmę pabaigoje
nebent tai negalioja funkcija.
Pažiūrėkime pavyzdį.
Jei aš noriu parašyti funkciją, kad sumos, visus numerius sveikųjų skaičių masyvo,
visų pirma grįžimo tipo bus int
nes turiu sveikųjų skaičių masyvo.
Ir tada aš ruošiuosi funkcijos pavadinimą, pavyzdžiui, sumArray
ir tada ji ketina imtis masyvo pati, int nums,
ir tada taip, aš žinau, kiek numeriai turiu Apibendrinant masyvo ilgis.
Tada aš turiu inicijuoti kintamasis vadinamas sumą, pavyzdžiui, į 0,
ir kiekvieną kartą, kai matau masyvo elementą turėčiau pridėti jį suma, todėl aš už linijos.
Tiesiog kaip Lexi sakė, jūs padaryti int i = 0, i <ilgis ir i + +.
Ir kiekvienas masyvo elementas aš suma + = nums [i],
ir tada grįžau sumą, todėl tai labai paprasta, ir ji taupo daug kodo
jei jūs naudojate šią funkciją, daug kartų.
Tada mes priėmėme tokiomis sąlygomis, atrodo.
Mes turime, jei kitur, ir else if.
Pažiūrėkime, kas yra skirtumas tarp tų.
Paimkite pažvelgti į šiuos 2 kodai. Tai, kas yra tarp jų skirtumas?
Pirmasis iš esmės kodai nori jums pasakyti,
jei skaičius yra +, -, arba 0.
Pirmasis sako, kad, jei jis> 0, tada tai teigiamas.
, Jei tai = "0", tada tai 0, ir jei jis yra <0, tada tai neigiamas.
>> , O kitas daro, jei if, else.
Skirtumas tarp šių dviejų yra tai, kad tai vienas iš tikrųjų ketiname
patikrinti, ar> 0, <0 arba = 0 tris kartus,
todėl, jei turite 2 numeriu, pavyzdžiui, ji ketina ateiti čia ir pasakyti,
if (x> 0), ir jis ketina pasakyti "taip", todėl aš spausdinti teigiamas.
Tačiau, nors aš žinau, kad tai> 0, ir jis nesiruošia būti 0 arba <0
Aš vis dar ketinate daryti, tai 0, tai <0,
todėl aš iš tikrųjų vyksta viduje IF, kad aš neturėjo
nes aš jau žinau, kad jis nesiruošia patenkinti nors iš šių sąlygų.
Aš galiu naudoti, jei if, else.
Tai iš esmės sako, kad jei x = 0 spausdinti teigiamas.
, Jei jis nėra, aš taip pat išbandyti šį.
, Jei tai 2 ne aš ruošiuosi tai padaryti.
Iš esmės, jei aš turėjau x = 2 galėtumėte pasakyti
if (x> 0), taip, kad atsispausdinti šį.
Dabar, kad aš žinau, kad jis> 0, ir kad ji įvykdė pirma, jei
Aš net ketina paleisti šį kodą.
Kodas veikia greičiau, iš tikrųjų, 3 kartus greičiau, jei jūs naudojate šią.
Mes taip pat sužinojome apie ir.
Aš nesiruošia eiti per šią, nes Lexi jau kalbėjome apie juos.
Tai tiesiog && ir | | operatoriaus.
>> Vienintelis dalykas, aš pasakysiu, būkite atsargūs, kai jūs turite 3 sąlygas.
Naudokite skliaustelius, nes tai labai paini, kai sergate liga,
ir vienas, arba dar vienas.
Naudokite skliaustus tiesiog būti tikri, kad jūsų sąlygos prasmės
, nes tokiu atveju, pavyzdžiui, jūs galite įsivaizduoti, kad
tai gali būti pirmoji sąlyga ir vienas ar kitas
arba 2 dalyje nurodytas sąlygas, kartu ir
ir trečio, todėl tiesiog būkite atsargūs.
Ir, pagaliau, mes kalbėjome apie jungikliai.
Jungiklis yra labai naudinga, kai turite kintamąjį.
Tarkime, kad turite kaip n kintamąjį
kad gali būti 0, 1 arba 2, ir kiekvienoje iš šių bylų
jūs ketinate atlikti užduotį.
Galite pasakyti, pereiti kintamąjį, ir tai rodo, kad
vertė tada yra kaip reikšmė1 aš ruošiuosi tai padaryti,
ir tada aš pertrauka, o tai reiškia, aš nesiruošia pažvelgti į bet kitais atvejais
nes mes jau įsitikinusi, kad bylą
ir tada reikšmė2 ir tt, ir aš taip pat gali turėti numatytąjį jungiklį.
Tai reiškia, jei jis neatitinka atvejų, kad turėjau
kad aš ruošiuosi daryti ką nors kita, bet tai neprivaloma.
Štai ir viskas man. Dabar galime Tommy.
Viskas bus gerai, tai bus savaitė 3-ish ".
Tai tik keletas temų, mes, apimančią koduotės, masto, matricos ir tt.
Just a quick žodis kriptografijos. Mes neketiname su plaktuku šį namą.
>> Mes padarėme tai pset 2, bet viktorinoje įsitikinkite, kad jums žinoti skirtumą
tarp Cezario šifravimo ir Vigenere Šifro,
kaip tų šifrai darbą ir tai, ką reiškia užšifruoti
ir iššifruoti tekstą naudodami tuos 2 užkoduota.
Atminkite, kad Cezario šifras tiesiog sukasi kiekvieną simbolį, ta pačia suma,
tikrai mod abėcėlės raidžių skaičius.
Ir Vigenere šifras, kita vertus, sukasi kiekvieną simbolį
skirtingo dydžio, todėl, o ne sako
3 Vigenere Kiekvienas personažas pasukti pasukti kiekvieną simbolį
skirtingos dotacijos sumos, priklausomai nuo to kai kurie raktinių žodžių
, kur kiekvienas raktinį žodį laiškas yra šiek tiek kitokį kiekį
pasukti aiškų tekstą.
Tegul pirmasis kalbėti apie kintamo pobūdžio.
Yra 2 skirtingų tipų kintamaisiais.
Mes turime vietos kintamieji, ir jie bus apibrėžta
už pagrindinė ar ne bet kurią funkciją arba blokuoti,
, ir tai bus prieinama bet kur savo programą.
Jei turite funkciją ir tai veiklai yra while cikle
didelis pasaulio kintamasis yra prieinamas visur.
Vietos kintamąjį, o kita vertus, aprėptis, kad toje vietoje, kur ji yra apibrėžta.
>> Jei turite funkcija čia, pavyzdžiui, mes turime šią funkciją g,
viduje ir g yra kintamasis vadinamas y,
, o tai reiškia, kad tai yra vietos kintamąjį.
Nors šis kintamasis vadinamas y
ir šis kintamasis yra vadinamas y šiuos 2 funkcijas
neįsivaizduoju, ką vieni kitų kintamųjų.
Kita vertus, čia mes sakome, int x = 5,
ir tai ne bet kokią funkciją taikymo sritį.
Tai ne pagrindinis taikymo sritį, kad tai yra pasaulio kintamasis.
Tai reiškia, kad šių 2 funkcijų viduje, kai aš sakau, x arba x + +
Aš prie to paties X,, kuriuo ši y tai y yra skirtingi kintamieji.
Štai skirtumas tarp pasaulinį kintamąjį ir vietos kintamąjį.
Kiek dizainas yra susirūpinęs, kartais tai tikriausiai geriau idėja
išlaikyti vietos kintamieji, kai jūs galbūt galite
nuo globalių kintamųjų krūva gali gauti tikrai paini.
Jei turite krūva funkcijų pakeisti tą patį
galite pamiršti, ką daryti, jei ši funkcija netyčia pakeičia šis pasaulinis,
ir tai kitas funkcijas, nežino, apie tai,
ir ji gauti gana paini, kaip jums daugiau kodą.
Laikydami kintamieji vietos, kai jūs galbūt galite
yra tik geras dizainas.
Matricos, atminkite, kad yra tiesiog to paties tipo elementų sąrašus.
Viduje CI negali turėti kaip 1, 2,0, sąrašą, sveiki.
Mes tiesiog negali padaryti.
>> Kai mes skelbiame masyvą C visi elementai turi būti to paties tipo.
Čia aš turiu 3 sveikųjų skaičių masyvą.
Čia aš turiu masyvo ilgis, bet jei aš tiesiog nedeklaravę šia sintakse
kur galiu nurodyti, ką visi elementai yra ne techniškai reikia šį 3.
Kompiliatorius yra pakankamai protingas, kad išsiaiškinti, kaip didelis masyvas turi būti.
Dabar, kai aš noriu gauti ar nustatyti masyvo vertę
tai yra sintaksė, kaip tai padaryti.
Tai iš tikrųjų pakeisti antrą elementą iš masyvo, nes prisiminti,
numeracija prasideda nuo 0, o ne 1.
Jei aš noriu skaityti tą vertę aš galiu pasakyti kažką panašaus į int x = array [1].
Arba, jei aš noriu nustatyti tą vertę, kaip aš darau čia,
Galiu pasakyti, masyvas [1] = 4.
Prieigą prie elementus savo indeksą, kad laikas
arba jų padėtį arba kai jie yra masyve,
ir kad sąrašas prasideda 0.
Mes taip pat galime turėti masyvų masyvai,
ir tai vadinama multi-dimensional masyvo.
Kai mes turime multi-dimensional masyvo
tai reiškia, kad mes galime turėti kažką panašaus į eilučių ir stulpelių,
ir tai yra tik vienas būdas vizualizuoti tai ar galvoti apie tai.
Kai turiu multi-dimensional masyvas, tai reiškia, kad aš ruošiuosi pradėti kuriems
daugiau kaip 1 puslapis, nes jei aš turėti tinklelį
tiesiog pasakyti, ką eilutė esate nesuteikia mums numerį.
Tai tikrai tiesiog ketina duoti mums numerių sąrašą.
Tarkime, turiu šio masyvo.
Turiu masyve tinklelis, ir aš sakydamas, kad tai 2 eilučių ir 3 stulpelių,
ir todėl tai yra vienas būdas vizualizuoti.
Kai aš sakau, aš noriu gauti elementas [1] [2]
tai reiškia, kad, nes jie yra eilutės ir tada stulpeliai
Aš einu, kad pereitumėte prie 1 eilutėje, nes aš sakiau 1.
>> Tada aš ruošiuosi atvažiuoti čia 2 skiltyje, ir aš ruošiuosi gauti vertė Vertė 6.
Prasminga?
Multi-vienmačių masyvų atminkite, kad yra techniškai tik masyvų masyvas.
Mes galime turėti masyvų masyvų masyvai.
Mes galime nesustoti, bet tikrai vienas būdas galvoti apie
kaip tai buvo nustatyta ir tai, kas vyksta, vizualizuoti
kaip šis tinklelis.
Jei mes pro masyvų į funkcijas, jie ketina elgtis
šiek tiek kitaip, nei tada, kai mes pereiname reguliariai kintamuosius, funkcijas
kaip int ar float išlaikius.
Kai mes pereiname int arba char arba bet kurį iš šių kitų duomenų tipų
mes tiesiog paėmė, jei ši funkcija keičia išvaizdą
šio kintamojo vertė, kad pokyčiai vyksta ne propaguoti
Kviečiančiojo funkcijoms.
Masyvo, kita vertus, kad taip atsitiks.
Jei galiu perduoti masyvo tam tikrą funkciją, ir kad funkcijos pokyčiai, tam tikrus elementus,
kai aš atėjau atgal į viršų funkciją, pavadino jį
mano masyvas bus kitokie, ir kad žodynas
yra matricos yra priimtas atsižvelgiant, kaip matysime vėliau.
Tai susiję su kaip indikatoriniai darbą, kai šių pagrindinių duomenų tipai,
kita vertus, yra perduodama pagal vertę.
>> Mes galime galvoti, kad kai kurių kintamojo kopiją ir po to einančios kopijos.
Nesvarbu, ką mes darome su tuo kintamuoju.
Iš kurio skambinama, funkcija nebus žinoti, kad jis buvo pakeistas.
Matricos yra tik šiek tiek skiriasi šiuo klausimu.
Pavyzdžiui, kaip mes ką tik matė, pagrindinis yra tiesiog funkcija
kad gali imtis 2 argumentų.
Pirmasis argumentas, kad pagrindinė funkcija yra argc, ar daug argumentų,
o antrasis argumentas yra vadinamas argv
ir jie yra tikrieji šių argumentų reikšmės.
Tarkime, aš turiu programą, pavadintą this.c,
ir aš sakau, kad tai, ir aš ruošiuosi į komandų eilutę paleisti šią.
Dabar kai kuriais argumentais, į savo programą pavadino tai,
Galėčiau pasakyti kažką panašaus. / Tai yra CS 50.
Tai, ką mes įsivaizduoti Davidas daryti kiekvieną dieną į terminalą.
Bet dabar pagrindinė funkcija viduje tos programos
šias vertybes, todėl argc yra 4.
Tai gali būti šiek tiek painu, nes tikrai mes tik epizodiškai, CS 50.
Tai tik 3.
Bet atsiminkite, kad pirmasis elementas argv arba pirmasis argumentas
yra pačios funkcijos pavadinimas.
Taigi, tai reiškia, kad mes turime 4 dalykų čia,
ir bus. / tai pirmasis elementas.
, Ir tai bus atstovaujama eilutę.
Tada likę elementai yra tai, ką mes įvedėte po programos pavadinimu.
Taigi lygiai taip pat žemę, nes mes tikriausiai matė pset 2,
prisiminti, kad 50 eilutė ≠ sveikuoju skaičiumi 50.
Taigi mes negalime pasakyti kažką panašaus, "int x = argv 3."
>> Kad tiesiog nėra prasmės, nes tai yra eilutė, ir tai yra sveikasis skaičius.
Taigi, jei norite konvertuoti tarp 2, atminkite, kad mes einame į
ši stebuklinga funkcija vadinama atoi.
Kad mano eilutę ir grąžina sveikąjį skaičių, atstovaujama tos eilutės viduje.
Taip, kad lengvai klaidą padaryti viktorina,
tiesiog galvoju, kad tai bus automatiškai tinkamo tipo.
Bet tiesiog žinau, kad jie visada bus stygos
net jei eilutė yra tik sveikąjį skaičių ar simbolį ar apyvartinės lėšos.
Taigi, dabar pakalbėkime apie važiavimo laikas.
Kai mes turime visus šiuos algoritmus, kad padaryti visus šiuos crazy dalykų,
jis tampa tikrai naudinga užduoti klausimą: "Kaip ilgai jie?"
Mes atstovaujame, kad kažką vadinama asimptotinė notacijos.
Taigi, tai reiškia, kad - gerai, tarkime, mes suteikiame mūsų algoritmus
kai kurie tikrai, tikrai, tikrai didelis indėlis.
Mes norime užduoti klausimą, "Kaip ilgai jis ketina imtis?
Kiek žingsnių ji imsis mūsų algoritmas paleisti
įėjimo dydžio funkcija? "
Taigi pirmas būdas, kuriuo mes galime aprašyti vykdymo metu su dideliu O.
Ir tai yra mūsų blogiausio atvejo veikimo laikas.
Taigi, jei norime rūšiuoti masyvo, ir mes suteikiame mūsų algoritmas masyvą
tai mažėjančia tvarka, kai ji turėtų būti didėjančia tvarka,
kad bus blogiausiu atveju.
Tai mūsų viršutinė riba ilgiausią laiką, mūsų algoritmas.
Kita vertus, tai Ω apibūdinti geriausią "veikimo laiką.
Taigi, jei mes suteikiame jau surūšiuoti masyvo rūšiavimo algoritmą,
Kiek tai užtruks rūšiuoti ją?
Ir tai, tada, aprašoma apatinė veikia laiko.
Taigi čia yra tik keli žodžiai, kurie apibūdina tam tikrų bendrų rodymo laikus.
Tai yra didėjančia tvarka.
Greičiausias važiavimo laikas, mes turime vadinama konstanta.
>> Tai reiškia, kad nesvarbu, kiek elementų mes suteikiame mūsų algoritmus,
nesvarbu, kaip didelis mūsų masyvas yra, rūšiavimas
arba daryti tai, ką mes darome, į masyvą visada tą pačią sumą laiko.
Taigi, mes galime atstovauti tik su 1, kuris yra pastovus.
Mes taip pat pažvelgė logaritminis vykdymo metu.
Kad kažkas kaip dvejetainis paieškos yra logaritminė,
kur mes supjaustyti per pusę, kiekvieną kartą problemą
ir tada viskas tiesiog gauti daugiau iš ten.
Ir jei jūs kada nors rašyti O bet kokio Faktorialaus algoritmas,
jūs tikriausiai turėtų apsvarstyti tai, kaip savo darbo dieną.
Kai mes lyginti rodymo laikus svarbu nepamiršti, šiuos dalykus.
Taigi, jei aš turiu algoritmą, kad O (n), ir kažkas
buvo O algoritmas (2n) iš tiesų, tai yra asimptotiškai ekvivalentas.
Taigi, jei įsivaizduosime n būti didelis kaip eleventy skaičius mlrd
todėl, kai mes palyginti kažką panašaus eleventy mlrd + 3 mlrd eleventy
staiga, kad 3 nėra tikrai padaryti didelį skirtumą nebėra.
Štai kodėl mes ketiname pradėti galvoti apie šiuos dalykus, būtų lygiavertė.
Taigi dalykų, pavyzdžiui, šių konstantų čia, 2 x tai, arba pridedant 3,
tai yra tik konstantos, ir jie ketina mesti.
Štai kodėl visi iš šių 3 veikimo laikais yra tas pats, kaip pasakyti, kad jie yra O (n).
Be to, jei mes turime 2 kitas paleisti kartus, tarkim, O (n ³ + 2n ²), mes gali pridėti
+ N + 7, tada mes turime kitą veikimo laiką, kad tik O (n ³).
Vėlgi, tai yra tas pats, nes jie - tai ne tas pats.
Tai yra tie patys dalykai, atsiprašau. Taigi tai yra tas pats, nes
tai n ³ ketina dominuoti šį 2n ².
>> Kas yra ne tas pats, jei mes paleisti kartus kaip O (n ³) ir O (n ²)
, nes tai n ³ yra daug didesnis nei, n ².
Taigi, jei mes turime eksponatų, staiga pradeda, kad nesvarbu,
bet kai mes tik susijusius su faktoriais, kaip mes esame čia,
tada jis nesiruošia reikšmės, nes jie tik ketina mesti.
Leiskite pažvelgti į kai kuriuos algoritmus, mes matėme iki šiol atrodo
ir kalbėti apie jų vykdymo metu.
Pirmasis būdas ieško sąrašą, kad mes matėme, buvo linijinis paieška.
Ir linijinio paieška įgyvendinimas yra super paprasta.
Mes tiesiog turime sąrašą, ir mes ketiname pažvelgti į kiekvieno elemento sąraše
kol mes rasti numerį mes ieškome.
Taigi, tai reiškia, kad blogiausiu atveju, tai O (n).
Ir blogiausiu atveju čia galėtų būti, jei elementas yra
paskutinis elementas, tada tiesinio paiešką, mes turime pažvelgti į kiekvieno elemento
kol mes iki paskutinės tam, kad žinoti, kad jis iš tikrųjų buvo sąraše.
Mes negalime tiesiog atsisakyti pusės ir sako, "Tai tikriausiai nėra".
Su tiesiniu paieška turime pažvelgti į visa tai.
Geriausiu atveju veikimo laikas, kita vertus, yra pastovus
nes geriausiu atveju mes ieškome elementas yra tik pirmasis sąraše.
Todėl ji ketina imtis mums lygiai 1 lygio, nesvarbu, kaip didelis sąrašas
jei mes ieškome pirmojo elemento kiekvieną kartą.
>> Taigi, kai jums ieškoti, atminkite, kad ji nereikalauja, kad mūsų sąrašas būti rūšiuojami.
Nes mes tiesiog vyksta ieškoti per kiekvieno elemento, ir tai tikrai ne klausimas,
kas, kad šios sudedamosios dalys yra.
Daugiau pažangių paieškos algoritmas kažką panašaus dvejetainis paieškos.
Atminkite, kad įgyvendinimas yra dvejetainis paieškos, kai jūs ketinate
nuolat ieško sąrašo viduryje.
Ir todėl, kad mes ieškome ne viduryje, mes reikalaujame, kad sąrašas surūšiuotas
kitaip mes ne žinoti, kur viduryje yra, ir mes turime pažvelgti per
Visą sąrašą, jį rasti, ir tada tuo momentu mes tiesiog eikvoti laiko.
Taigi, jei mes turime surūšiuoti sąrašą, ir mes manome viduryje, mes ketiname palyginti viduryje
prie elemento, kurį mes ieškome.
Jei jis per didelis, tada mes galime pamiršti, dešinėje pusėje
nes žinome, kad, jei mūsų elementas jau yra per didelis
ir viskas, dešinėje šio elemento pusėje yra dar didesnis,
tada mums nereikia ieškoti ten nebėra.
Jei, kita vertus, jei mūsų elementas yra per mažas,
mes žinome viską, kad šio elemento kairėje yra pernelyg žemas,
, todėl ji nėra tikrai prasmės ieškoti ten, arba.
Tokiu būdu, kiekviename žingsnyje ir kiekvieną kartą, kai mes žiūrime į sąrašo Mediana,
mes ketiname sumažinti mūsų problemą per pusę, nes staiga mes žinome,
visa krūva skaičių, kuris negali būti vienas, mes ieškome.
>> Į pseudocode tai atrodytų kažką panašaus į tai,
ir todėl, kad mes per pusę kiekvieną kartą, pjovimo sąrašą
mūsų blogiausiu atveju skaičiuoti laiką šokinėja nuo linijinių logaritmas.
Taip staiga mes turime prisijungimo etapų nustatymu siekiant rasti sąrašo elementą.
Geriausiu atveju veikimo laikas, nors tai, nekintančiomis
nes dabar, tegul tiesiog pasakyti, kad mes ieškome elementas
visada tiksli viduryje į pirmąjį sąrašą.
Taigi, mes galime augti mūsų sąrašą kaip dideli, kaip mes norime, tačiau, jei elementas, mes ieškome yra viduryje,
vienintelė 1 žingsnis
Štai kodėl mes O (log n), o Ω (1) arba nuolatinis.
Leiskite paleisti dvejetainis paiešką šiame sąraše.
Taigi, tarkime, kad mes ieškome elemento 164.
Pirmas dalykas, kurį mes ketiname padaryti yra rasti šiame sąraše įpusėjo.
Jis tiesiog taip atsitinka, kad viduryje ketina patenka tarp šių 2 numeriai,
todėl galime tik savavališkai, kiekvieną kartą, viduryje yra tarp 2 numeriai,
tegul tik suapvalinti.
Mes tiesiog reikia įsitikinti, kad mes tai darome kiekvieną žingsnį kelyje.
Taigi, mes ketiname suapvalinti, ir mes ketiname pasakyti, kad 161 yra mūsų sąraše viduryje.
Taigi 161 <164, ir kiekvienas elementas su 161 kairėje
taip pat yra <164, todėl mes žinome, kad ji nesiruošia padėti mums ne visi
pradėti ieškoti čia, nes elementas mes ieškome negali būti ten.
Taigi, ką mes galime padaryti, mes galime tiesiog pamiršti apie tą visą kairę pusę sąrašo,
ir dabar tik atsižvelgti į dešinę iš 161 tolyn.
>> Taigi dar kartą, tai viduryje, galime tik suapvalinti.
Dabar 175 yra per didelis.
Taigi mes žinome, jis nesiruošia padėti mums čia arba čia,
todėl mes galime tiesiog mesti, kad toli, ir, galiausiai, mes nukentėjo 164.
Klausimų apie dvejetainis paieškos?
Pereikime ieškoti per jau rūšiuotų sąrašą
iš tikrųjų numerių sąrašą, bet kokia tvarka
ir šį sąrašą didėjančia tvarka.
Pirmas algoritmas, mes pažvelgė buvo vadinamas burbulas rūšiuoti.
Ir tai būtų paprastesnis algoritmų, mes matėme.
Burbulas tarsi sako, kad kai bet viduje sąraše yra 2 elementai iš vietos,
yra didesnis skaičius mažesniu skaičiumi kairėje,
tada mes ketiname apsikeitimo juos, nes tai reiškia, kad sąrašas bus
"Daugiau surūšiuoti", nei jis buvo anksčiau.
Ir mes tik ketina tęsti šį procesą vėl ir vėl ir vėl
kol galiausiai burbulas į teisingą jų vietą elementai natūra ir mes turime surūšiuoti sąrašą.
>> Vykdymo metu tai bus O (n ²). Kodėl?
Gerai, nes blogiausiu atveju, mes ketiname imtis kiekvienas elementas, ir
mes ketiname baigti, lyginant jį su kiekvieno kito elemento sąraše.
Tačiau geriausiu atveju, mes turime jau surūšiuoti sąrašą, burbulas rūšiuoti
tiesiog eiti per vieną kartą pasakyti "Ne aš nepadarė jokių apsikeitimo sandorius, todėl aš padariau".
Taigi, mes turime geriausiu atveju veikimo laiką Ω (n).
Leiskite paleisti burbulas rūšiuoti sąrašą.
Arba pirmiausia, galime tiesiog pažvelgti į kai pseudocode tikrai greitai.
Mes norime pasakyti, kad mes norime sekti kiekvieną kilpa iteracijos,
sekti, ar mes pakeitėme jokių elementų.
Taigi priežasties, kad yra, mes ketiname sustoti, kai mes ne pavertė jokių elementų.
Taigi mūsų kilpos pradžios mes ne pavertė nieko, todėl mes pasakyti, kad klaidinga.
Dabar mes ketiname eiti per sąrašą ir palyginkite i, kad elementas i + 1 elementas
ir jei jis yra, kad yra didesnis skaičius į kairę mažesnio skaičiaus,
tada mes tik ketina apsikeitimo juos.
>> Ir tada mes ketiname prisiminti, kad mes pavertė elementas.
Tai reiškia, kad turime eiti per sąrašą bent 1 kartą
nes būklė, kai mes sustojome, kai visa sąrašas jau yra surūšiuoti,
tai reiškia, mes neatliekame jokių apsikeitimo sandorius.
Štai kodėl mūsų sąlyga žemyn čia yra ", o kai kurie elementai buvo pavertė".
Taigi, dabar galime tik pažvelgti į tai veikia sąrašo.
Turiu sąrašą 5,0,1,6,4.
Burbulas rūšiuoti ketina pradėti visą kelią kairėje, ir tai vyksta palyginti
i elementai, kad nuo 0 iki i + 1, kuris yra elementas 1.
Jis ketina pasakyti, bei 5> 0, bet dabar 5 yra kairėje,
todėl man reikia sukeisti 5 ir 0.
Kai aš apsikeitimo juos, staiga gauti šią kitą sąrašą.
Dabar 5> 1, tai mes ketiname apsikeitimo juos.
5 nėra> 6, todėl mums nereikia nieko daryti, čia.
Bet 6> 4, todėl mums reikia sukeisti.
Vėlgi, mes turime paleisti per visą sąrašą, kad galų gale atrasti
, kad tai yra ne iš eilės, mes apsikeitimo juos,
, ir šiuo metu mes turime paleisti per sąrašą 1 daugiau laiko
įsitikinti, kad viskas savo nutartyje, ir šiuo metu burbulas rūšiuoti baigė.
Kitą algoritmą, atsižvelgiant į kai kuriuos elementus ir rūšiavimas jų atranka yra rūšiuoti.
Už atrankos rūšiuoti idėja yra ta, kad mes ketiname sukurti surūšiuoti sąrašo dalį
1 elementas vienu metu.
>> Ir tai, kaip mes ketiname daryti, kad kuriant kairįjį sąrašo segmentą.
Ir iš esmės, kiekvienas kiekvieną žingsnį, mes ketiname imtis mažiausią elementą, mes palikome
, kurie nebuvo surūšiuoti dar ir mes ketiname perkelti jį į tą rūšiuotų segmento.
Tai reiškia, kad mes turime nuolat rasti mažiausią nerūšiuotų elementas
ir tada imtis, kad minimalų elementą ir apsikeitimo jį su bet kokia
kairės labiausiai elementas, kuris yra surūšiuoti.
Paleisti laikas bus O (n ²), nes blogiausiu atveju
reikia palyginti Kiekvienas elementas kiekvieno kito elemento.
Nes mes sakydamas, kad jei mes pradėsime kairėje sąrašo pusėje, mes turime
eiti per visą dešiniajame segmente rasti mažiausią elementą.
Ir tada vėl, mes turime eiti per visą tinkamą segmente ir
nuolat vyksta per daugiau ir daugiau ir daugiau vėl.
Tai bus n ². Mes ketiname reikia kilpa viduje kitos kilpos
kuris rodo, n ².
Geriausiu atveju minties, tarkim, mes suteikiame jai jau surūšiuoti sąrašą;
mes iš tikrųjų nereikia daryti, bet geriau nei n ².
Kadangi pasirinkimas rūšiuoti neturi žinoti, kad
minimalus elementas yra tik vienas aš atsitiktų būti ieškote.
Tačiau vis dar reikia įsitikinti,, kad iš tikrųjų tai yra minimalus.
>> Ir vienintelis būdas įsitikinti, kad ji yra minimali, naudojant šį algoritmą,
dar kartą pažvelgti į kiekvieno elemento.
Ir tikrai, jei jūs suteikiate jai - jei jūs suteikiate ATRANKA rūšiavimas jau surūšiuoti sąrašą,
ji nesiruošia padaryti, bet geriau nei suteikiant jai sąrašą, kuris dar nėra rūšiuojamos.
Beje, jei tai atsitinka būti, kad kažkas yra O (kažkas)
ir omega apie kažką, mes galime tik pasakyti, daugiau glaustai, kad tai θ apie kažką.
Taigi, jei matote, kad sugalvoti bet kur, kad tai, ką, kad tik reiškia.
>> Jei kažkas yra teta n ², tai yra tiek didelis O (n ²) ir Ω (n ²).
Taigi geriausiu atveju ir blogiausiu atveju, tai nereiškia, kad skirtumas,
algoritmas ketinate daryti tą patį kiekvieną kartą.
Taigi tai yra kokio Pseudocode atrankos rūšiuoti galėtų atrodyti.
Mes iš esmės ketinate pasakyti, kad aš noriu, kad keistumėte sąrašą
iš kairės į dešinę, ir kiekvieną kilpa iteracijos, aš ketina perkelti
minimalus elementas į šį rūšiuotų sąrašo dalį.
Ir kai aš perkelti kažkas ten, aš niekada reikia iš naujo pažvelgti į šio elemento.
Nes kaip tik aš apsikeitimo elementas, į kairę sąrašo segmente, tai rūšiuojamos
nes mes darome viską, didėjančia tvarka naudojant minimum.
Taigi, mes sakėme, gerai, mes i padėtyje, ir mes turime pažvelgti į visus elementus,
i teise produktais tam kad rasti minimumą.
Taigi, tai reiškia, kad mes norime pažvelgti i + 1 į sąrašo pabaigoje.
Ir dabar, jei elementas, kad mes šiuo metu ieško yra mažesnis nei minimalus iki šiol,
atminkite, kad mes pradėti minimalią off tiesiog būti
kokia elementas mes šiuo metu, aš manyti, kad yra minimali.
Jei aš rasti elementą, kad mažesnis nei, tada aš ketina pasakyti, gerai,
gerai, aš rasiu naują minimumą.
Aš ruošiuosi prisiminti, kur ši minimali riba buvo.
>> Taigi dabar, kai aš atvyko per tą dešinėje nerūšiuotų segmente,
Galiu pasakyti, kad aš ruošiuosi apsikeitimo minimalų elementą su elementu, kuris yra i padėtyje.
Kad ketina sukurti savo sąrašą, mano surūšiuoti dalis sąrašo iš kairės į dešinę,
ir mes neturime kada nors reikės ieškoti elemento dar kartą, kai jis yra tos dalies.
Kai mes pavertė jį.
Todėl galime paleisti atrankos rūšiuoti į šį sąrašą.
Mėlyna elementas čia bus i ir raudona elementas bus minimalus elementas.
Taigi, aš prasideda visą kelią sąrašo kairėje, todėl 5.
Dabar mums reikia rasti mažiausią nerūšiuotų elementas.
Taigi, mes galime pasakyti, kad 0 <5 0 yra mano naujas minimalus.
>> Bet aš negaliu sustoti, nes nors mes galime pripažinti, kad 0 yra mažiausias,
mes turime paleisti per sąrašą ir įsitikinkite, kiekvieno kito elemento.
So 1 yra didesnis, 6 yra didesnis, 4 dalis, yra didesnis.
Tai reiškia, kad po to, kai žiūri į visus šiuos elementus, aš pasiryžęs 0 yra mažiausias.
Taigi, aš ruošiuosi sukeisti 5 ir 0.
Kai aš apsikeitimo sandorius, kurie, aš ruošiuosi gauti naują sąrašą, ir aš žinau, kad niekada nereikia vėl pažvelgti kad 0
nes kai aš pavertė jį aš surūšiuoti jį ir baigsime.
Dabar jis tiesiog taip atsitinka, kad mėlyna elementas vėl 5,
ir mes turime pažvelgti į 1, 6 ir 4 nustatyti, kad: 1
yra mažiausias minimalus elementas, todėl mes apsikeitimo 1 ir 5.
Vėlgi, mes turime pažvelgti į - palyginti 5 6 ir 4,
ir mes ketiname apsikeitimo 4 ir 5, ir, pagaliau, palyginti
tie 2 numeriai ir apsikeitimo juos, kol mes gauti mūsų surūšiuoti sąrašą.
Klausimų dėl atrankos Rūšiuoti?
Gerai. Pereikime iki paskutinės tema čia, ir tai yra rekursija.
>> Rekursija atminkite, kad tai tikrai meta dalykas, kai funkcija
keletą kartų raginama pati.
Taigi, tam tikru momentu, o mūsų fuction pakartotinai ragina save,
ten turi būti tam tikra vieta, kurioje mes sustabdyti skambinate save.
Nes jei mes nedarome, kad, tada mes tik ketina toliau tai daryti amžinai,
ir mūsų programa yra tik nesiruošia nutraukti.
Mes vadiname atveju ši sąlyga bazė.
Ir bazinį scenarijų, sako, o ne dar kartą paskambinus funkciją,
Aš tik ketina grįžti tam tikrą vertę.
Taigi, kai mes grįžo vertę, mes sustabdysime paskambinus save,
ir mes iki šiol buvo skambučius poilsio taip pat gali grįžti.
Priešingas bazine rekursinis atveju.
Ir tai yra, kai mes norime, kad kitą skambutį funkciją, kurią mes šiuo metu in
Ir tikriausiai, nors ne visada, nori naudoti skirtingus argumentus.
>> Taigi, jei mes turime funkcija vadinama f ir f tiesiog vadinamas 1 argumentą,
ir mes tiesiog paskambinę F (1), F (1), F (1), ir jis tiesiog taip atsitinka, kad
argumentas, 1 patenka į rekursinis atveju, mes dar niekada nesiruošia sustoti.
Net jei mes turime bazinę atveju, mes turime padaryti tikri, kad ilgainiui mes einame, kad pasiektų šį bazinį scenarijų.
Mes ne tik nuolat lankantis šioje grįžtamojo atveju.
Paprastai, kai mes vadiname save, mes tikriausiai bus turėti skirtingą argumentas kiekvieną kartą.
Rekursinis funkcija yra tikrai paprasta.
Todėl tai bus apskaičiuoti skaičiaus faktorialas.
Iki viršaus čia mes turime bazinį scenarijų.
Tuo atveju, kad n ≤ 1, mes nesiruošia skambinti faktorialas vėl.
Mes ketiname sustabdyti, mes tiesiog ketina grįžti tam tikrą vertę.
Jei tai nėra tiesa, tada mes ketiname smūgį rekursinis bylą.
Pastebėsite čia, kad mes ne tik paskambinus faktorialas (n), nes tai nebūtų labai naudinga.
Mes ketiname skambinti faktorialas apie ką nors kita.
>> Ir todėl jūs galite pamatyti, galų gale, jei mes pereiname Factorial (5) ar kažką,
mes ketiname skambinti faktorialas (4) ir tt, ir galiausiai mes ketiname pataikyti į šį bazinį scenarijų.
Taigi tai gerai atrodo. Pažiūrėkime, kas atsitinka, kai mes iš tikrųjų paleisti.
Tai kamino, ir tarkime, kad pagrindinis ketina iškviesti šią funkciją su argumentais (4).
Taigi, kai faktorialas mato ir = 4, faktorialas kreipsis.
, Staiga, dabar mes turime faktorialas (3).
Taigi šios funkcijos yra nuolat auga, kol galiausiai mes Hit mūsų bazės bylą.
Gražinama reikšmė yra šiuo metu, grąža (nx gražinama reikšmė),
grąžina vertė yra tai nx gražinama reikšmė.
Galiausiai mums reikia, kad pasiektų tam tikrą skaičių.
Viršuje čia, mes sakome, return 1.
Tai reiškia, kad, kai mes grįžtame šį skaičių, mes galime pop prie kamino.
Taigi tai faktorialas (1) daroma.
Kai 1 deklaracijos, tai factorial (1) deklaracijos, šią deklaraciją iki 1.
Gražinama reikšmė to, atminkite, kad nx gražinama reikšmė.
Taip staiga, šis vaikinas žino, kad aš noriu grįžti 2.
>> Taigi prisiminti, grįžti, vertė yra tai, tik nx gražinama reikšmė čia.
Taigi dabar mes galime pasakyti 3 x 2, ir, pagaliau, čia galime sakyti,
tai tiesiog bus 4 x 3 x 2.
Ir vieną kartą Tai grąžina, mes gauname vieną sveikojo skaičiaus viduje pagrindinis.
Bet kokie klausimai dėl rekursijos?
Gerai. Taigi čia daugiau laiko klausimus pabaigoje,
bet dabar Juozapas apims likusius temų.
>> [Džozefas Ong] Gerai. Taigi dabar, kad mes kalbėjome apie recursions
pakalbėkime šiek tiek apie tai, ką sujungti rūšiuoti.
Sujungti tarsi iš esmės kita numerių sąrašą rūšiavimo būdas.
Ir kaip ji veikia, sujungti rūšiuoti turite sąrašą, ir tai, ką mes darome, yra
mes sakome, Maksāsim tai į 2 dalis.
Mes pirmą kartą paleidus sujungti rūšiuoti vėl į kairę pusę,
tada mes paleisti sujungti rūšiuoti dešinėje pusėje,
ir tai suteikia mums dabar 2 puses, kurie yra surūšiuoti, ir dabar mes kartu sujungti šias puses.
Tai šiek tiek sunku įsivaizduoti, be Pavyzdžiui, kad mes pereiti per judesius ir pamatyti, kas atsitiks.
Taigi, pradėdami šį sąrašą, mes padalinti į 2 dalis.
Mes valdome Merge sort kairę pusę.
Taip, kad kairėje pusėje, ir dabar mes vėl paleisti juos per šį sąrašą
kuri pasireiškia patenka į Merge sort ir tada mums atrodo, vėl,
kairėje pusėje šio sąrašo ir mes paleisti sujungti rūšiuoti.
Dabar mes kibti į sąrašą 2 numeriai,
ir dabar yra kairėje pusėje yra tik 1 elementas ilgai, ir mes negalime
padalinti sąrašą, kad tik 1 elementas į pusę, todėl mes tiesiog pasakyti, kai mes turime 50,
kuri yra tik 1 elementas, tai jau surūšiuoti.
>> Kai baigsime su tuo, mes galime pamatyti, kad mes galime
pereiti prie šio sąrašo dešinėje pusėje,
ir 3 dalis, taip pat rūšiuojamos, ir kad dabar abi pusės yra šio sąrašo surūšiuoti
mes galime prisijungti prie šių numerių atgal kartu.
Taigi, mes pažvelgti į 50 ir 3, 3 yra mažesnis nei 50, todėl jis eina pirmas ir 50 Įgijusi
Dabar tai padaryta, mes einame atgal į tą sąrašą ir rūšiuoti Dešinė pusė.
42 yra jo paties, todėl jis jau rūšiuojamos.
Taigi dabar mes palyginti šių 2 ir 3 dalis, yra mažesnis nei 42, todėl, kad gauna įdėti į pirmąjį,
dabar 42 bus įdėti, ir 50 bus įdėti in
Dabar, kad rūšiuojamos, mes pereiti visą kelią atgal į viršų, 1337 ir 15.
Na, dabar mes pažvelgti į kairę pusę šio sąrašo; 1337 yra pats todėl rūšiuojami ir tas pats su 15.
Taigi dabar mes sujungti šias 2 numerius, rūšiuoti, kad pradiniam sąrašui, 15 <1337,
todėl jis eina pirmasis, tada 1337 eina.
Ir dabar mes rūšiuojamos abi puses, į pirmąjį sąrašą iki viršaus.
Ir visi mes turime padaryti, yra sujungti šias.
Mes pažvelgti į pirmus 2 numerius šiame sąraše, 3 mažiau nei 15, todėl jis patenka į rūšiavimo masyvo.
15 <42, tai jis eina in Dabar, 42 <1337, kad eina.
50 <1337, todėl jis eina. Pastebėti, kad mes tiesiog paėmė 2 numeriai šio sąrašo.
Taigi mes ne tik pakaitomis tarp 2 sąrašų.
Mes paprasčiausiai ieškome pradžioje, ir mes elementas
tai mažesni ir tada pradėti jį į mūsų masyvas.
Dabar mes susijungė visas puses ir baigsime.
>> Kokių nors klausimų apie sujungti rūšiuoti? Taip?
[Studentų] Jei tai suskaidymas į skirtingas grupes, tai kodėl ne jie tiesiog padalinti vieną kartą
ir jūs turite 3 ir 2 su grupe? [Kitos klausimas nesuprantamas]
Priežastis - todėl kyla klausimas, kodėl mes negalime tiesiog jas sujungti, kad pirmas žingsnis, po to, kai mes juos?
Priežastis, mes galime tai padaryti, pradėkite nuo kairiojo daugeliu elementų iš abiejų pusių,
ir tada imtis mažesnių, ir įdėti jį į tai, kad mes žinome, kad tai
atskiri sąrašai surūšiuoti užsakymus.
Taigi, jei aš žiūriu kairiojo abiejų per pusę elementų,
Aš žinau, jie ketina būti smulkiausi elementai iš šių sąrašų.
Taigi aš galiu įdėti į mažiausias elementas dėmės šio didelio sąrašo.
Kita vertus, jei aš pažvelgti į šių 2 sąrašus ten antro lygio
50, 3, 42, 1337 ir 15, tie kiekiai nebuvo išrūšiuoti.
Taigi, jei aš pažvelgti į 50 ir 1337, aš ketina pateikti 50 į savo sąrašą.
Bet tai nereiškia, tikrai prasminga, nes 3 yra mažiausias elementas, iš visų tų.
Taigi, vienintelė priežastis, mes galime tai padaryti derinant žingsnis, nes mūsų sąrašuose jau išrūšiuoti.
Kuris yra, kodėl mes turime gauti visą kelią į apačią
nes kai mes turime tik vieną numerį, žinote, kad vieną numerį
ir pati jau surūšiuoti sąrašas.
>> Turite klausimų? Ar ne?
Sudėtingumas? Na, jūs galite pamatyti, kad kiekviename etape galutiniai skaičiai,
ir mes galime padalinti sąrašą pusei log n kartų,
kuris yra, kai mes gauname šią n x log n sudėtingumą.
Ir pamatysite, sujungti rūšiuoti geriausiu atveju yra n log n, ir jis tiesiog taip atsitinka
, kad blogiausiu atveju, ar ten Ω, taip pat n log n.
Kažkas nepamiršti,.
Permainos, eikime keletas super pagrindinio failo I / O.
Jei jūs žiūrite scramble, jūs pastebėsite, mes turėjo kažkokią sistemos
kur galima rašyti į failą, jei jūs perskaitėte visą kodą.
Pažiūrėkime, kaip tai galite padaryti.
Na, mes turime fprintf, jūs galite galvoti kaip tik printf,
bet tiesiog spausdinti į failą, o ne, ir todėl pradžioje f.
Šis kodas čia rūšiuoti, ką ji daro, kaip jūs galėjote matyti scramble,
jis eina per savo 2-dimensional array spausdinimo eilės, kas numeriai iš eilės.
Šiuo atveju, printf spausdina savo terminalą arba, ką mes vadiname standartinį išvedimo skyriaus.
>> Ir dabar, šiuo atveju, viskas, ką turite padaryti, pakeisti printf su fprintf,
pasakyti, kokį failą, kurį norite spausdinti, ir šiuo atveju tai tiesiog spausdina jį į šį failą
, o ne spausdinant jį į savo terminalą.
Na, tada, kad kyla klausimas: Kur mes gauname šį failą rūšiuoti, tiesa?
Mes vyko prisijungti prie šio fprintf fuction, bet mes neturėjome supratimo, iš kur jis atėjo.
Na, anksti kodą, tai, ką mes buvo Šią dalį kodo čia,
, kuri iš esmės sako, kad atidaryti failo ragina log.txt.
Ką mes darome, Po to, kai mes turime padaryti, kad failas yra iš tikrųjų pradėjo sėkmingai.
, Todėl gali nepavykti dėl kelių priežasčių, jūs neturite pakankamai vietos ant jūsų kompiuterio, pavyzdžiui.
Taigi, tai visada svarbu, prieš jums padaryti jokių operacijų su failu
kad mes patikrinti, ar, kad failas buvo atidarytas sėkmingai.
Taigi, kas, kad, tai argumentas fopen, gerai, mes galime atidaryti failą įvairiais būdais.
Ką mes galime padaryti, tai mes galime perduoti jį w, o tai reiškia nepaisyti failą jei išeinant jau
Mes galime perduoti A, kurioje jie pridėti į failo pabaigą, o ne nuslopinti,
ar mes galime nurodyti r, o tai reiškia, galime atidaryti failą tik skaityti.
Taigi, jei programa bando atlikti bet kokius pakeitimus į failą,
klykauti ne jų ir neleiskite jiems tai padaryti.
Galiausiai, kai mes su failu, baigsite daryti operacijas,
mes turime padaryti, kad mes uždarykite failą.
Ir taip jūsų programos pabaigoje, jūs ketinate dar kartą perduoti juos
šį failą, kad jūs atidarėte, o tiesiog uždarykite ją.
Taigi tai yra kažkas, svarbu, kad jūs turite įsitikinti, kad jūs.
Taigi atminkite, jūs galite atidaryti failą, tada jūs galite rašyti į failą,
daryti operacijas bylos medžiaga, tačiau tada jūs turite nutraukti bylą pabaigoje.
>> Klausimų nuo pagrindinio failą I / O? Taip?
[Studento klausimas, nesuprantamas]
Čia. Kyla klausimas, kur iš tiesų ši log.txt failas atrodo?
Na, jei jūs tiesiog suteikti jai log.txt, ji sukuria jį į tą patį katalogą kaip vykdomąjį.
Taigi, jei! Galite - >> [Studento klausimas, nesuprantamas]
Taip. Tame pačiame aplanke, arba tame pačiame kataloge, kaip jūs ją vadina.
Dabar atmintis, kamino, o krūva.
Taigi, kaip tai išdėstyti kompiuterio atminties?
Na, galite įsivaizduoti, kaip rūšiuoti atminties šio bloko čia.
Ir atmintyje mes turime tai, kas vadinama krūvą įstrigo ten, ir kamino, kad ten.
Ir krūvos auga žemyn ir kamino auga į viršų.
Taigi, kaip Tommy paminėti - oh, na, ir mes turime šiuos ir kitus 4 segmentai, kurie aš gausiu per sekundę -
Kaip Tommy sakė anksčiau, jūs žinote, kaip jo funkcijas vadina save ir skambinti vieni kitiems?
Jie sukurti šią kamino rėmo rūšiuoti.
Na, jeigu pagrindinis ragina foo foo gauna įdėti ant kamino.
Foo ragina, baras įdėti kamino ir kad gauna įdėti į steką, po
Ir kaip jie grįžta, jie visi gauti nurašomas kamino.
Ką kiekvienas iš šių vietų ir atminties laikyti?
Na, į viršų, kuri yra teksto segmentas, yra pačią programą.
Taigi mašininiu kodu, tai ten, kai jūs sudaryti savo programą.
Be to, bet koks inicializuoti globalių kintamųjų.
>> Taigi jūs turite globalių kintamųjų jūsų programoje, ir jūs sakote, pavyzdžiui, A = 5,
kad gauna įdėti šiame segmente, ir iš karto po, kad,
turite niezainicjowanymi pasaulinius duomenis, kurie tiesiog LC,
, bet jūs neturite pasakyti, kad lygus nieko.
Suprantu, tai yra visuotiniai kintamieji, todėl jie už pagrindinis.
Taigi, tai reiškia, kad jokių globalių kintamųjų, kad būtų deklaruojami, bet ne inicijuoti.
Taigi, kas yra krūvos? Atminties skiriama naudojant malloc, kurį mes gauti šiek tiek.
Ir, pagaliau, kamino turite vietos kintamieji
ir funkcijos, kurias galima vadinti bet jų parametrų.
Paskutinis dalykas, jūs tikrai ne turi žinoti, ką aplinkos kintamieji,
kai paleidžiate programą, ten yra kažkas, susijęs, pavyzdžiui,
tai yra asmens vartotojo vardas, kuris vyko programą.
Ir tai bus tarsi apačioje.
Atminties adresai, kurie Šešioliktainis reikšmės,
vertės pusėje viršuje prasideda nuo 0, ir jie išeina visą kelią žemyn į apačią.
Šiuo atveju, jei jūs esate ant 32-bit sistemos
apačioje adresas bus 0x, AF, nes tai yra 32 bitų,
, o tai yra 8 baitų, ir šiuo atveju 8 baitai atitinka 8 šešioliktainių skaitmenų.
Tiek žemyn čia jūs ketinate turėti, kaip, 0xffffff, ir ten jūs ketinate turi 0.
Taigi, kas yra patarimų? Kai kurie iš jūsų negali apėmė tai skyriuje anksčiau.
bet mes eiti per jį paskaitą, kad žymeklis yra tik duomenų tipas
kuri saugo, o ne kažkoks vertės, pavyzdžiui, 50, ji saugo vieta tam tikru atminties adresą.
Patinka, kad atmintis [nesuprantamas].
Taigi, šiuo atveju, ką turime, yra mes turime žymiklį į sveikasis skaičius arba int *
ir jame yra 0xDEADBEEF šį šešioliktainį adresą.
>> Taigi, ką mes turime, yra dabar, tai rodyklės nurodo tam tikru atminties vietą,
ir tai tik, vertė 50 yra šią atminties vietoje.
Dėl kai kurių 32-bitų sistemų, visų 32-bitų sistemų, patarimų imtis 32 bitų arba 4 baitų.
Bet, pavyzdžiui, 64-bitų sistema, rodykles 64 bitų.
Todėl tai, ką jūs norite turėti omenyje,.
Taigi galutinio bitų sistemos, rodyklė yra galutiniai bitų ilgio.
Pointeriai yra tarsi sunkiai virškinami, be papildomų dalykų,
todėl eikime per dinaminės atminties paskirstymo pavyzdys.
Kas dinaminės atminties paskirstymo daro už jus, ar tai, ką mes vadiname malloc
ji leidžia paskirstyti kažkokią ne rinkinio duomenų.
Taigi šie duomenys yra tarsi visam laikui programos trukmę.
Nes, kaip žinote, jei jūs deklaruoti x viduje funkcijos, ir kad funkcija grąžina,
jums nebereikia turėti prieigą prie duomenų, saugomų x.
Patarimų darykime jie mums saugoti atmintyje arba parduotuvė reikšmes
į kitą atminties segmento, ty krūvos.
Dabar, kai mes grįžtame funkcijos, kaip ilgai, kaip mes turime rodyklę
tą atminties vietą, tada tai, ką mes galime padaryti, mes galime tiesiog pažvelgti ten vertybių.
Pažvelkime į pavyzdį: Tai yra mūsų atmintis išdėstymas vėl.
Ir mes turime šią funkciją, pagrindinis.
Kas tai yra - gerai, taip paprasta, tiesa? Int x = 5, tai tik kamino kintamasis pagrindinė.
>> Kita vertus, dabar mes paskelbti žymeklį, kuriame raginama funkcijos giveMeThreeInts.
Ir todėl dabar mes einame į šią funkciją ir mes sukurti naują kamino rėmus.
Tačiau šioje kamino rėmo, mes skelbiame int * temp,
kuris už mus mallocs 3 sveikieji skaičiai.
Taigi, int dydis duos mums, kiek baitų int yra,
ir malloc suteikia mums, kad daug erdvės baitų krūvos.
Taigi šiuo atveju, mes sukūrėme pakankamai vietos 3 sveikieji skaičiai,
ir krūvos ten yra būdas, kuris yra, kodėl aš sudarytas aukščiau.
Kai baigsite, mes vėl čia, jums reikia tik 3 int grįžo,
ir ji grąžina adresą, šiuo atveju daugiau kaip, kur, kad atmintis yra.
Ir mes rodyklė = jungiklį, ir ten mes turime tik dar vienas žymeklį.
Bet kas, kad funkcija grąžina yra sukrauti čia ir dingsta.
Taigi temp dingsta, bet mes vis dar išlaikyti adresą, kur
tie 3 sveikieji skaičiai yra viduje elektros tinklo.
Taigi šis rinkinys patarimų aprėptis vietoje sukrauti rėmo,
bet atminties, su kuriais jie susiję, yra krūvos.
>> Ar tai prasminga?
[Studentų] Gal galėtumėte pakartoti? >> [Juozapas] Taip.
Taigi, jei aš einu atgal, pamatysite, kad tik šiek tiek temp skiriama
kai kurie iki ten krūvos atminties.
Taigi, kai ši funkcija, giveMeThreeInts grąžina, tai kamino čia išnyks.
Ir su bet kintamuosius, šiuo atveju, tai rodyklė, kuri buvo skirta sukrauti rėmo.
Kad išnyks, bet kadangi mes grįžo temperatūra
ir mes nustatyti žymeklį = temp, rodyklė dabar ketina tą pačią atminties vietą, kaip temperatūra buvo.
Taigi dabar, nors mes prarasti temp, kad vietos rodyklę,
mes vis dar išlaiko atminties adresą, ką ji buvo nukreipta šio kintamojo rodyklė viduje.
Turite klausimų? Tai gali būti natūra paini tema, jei tu dar nesi per jį skyriuje.
Mes galime jūsų TF tikrai eiti per jį ir, žinoma, gali atsakyti į klausimus
peržiūros sesijos pabaigos.
Bet tai yra tarsi sudėtinga tema, ir aš turiu daugiau pavyzdžių, kurie ketina pasirodyti
, kuris padės išsiaiškinti, kas patarimų iš tikrųjų yra.
>> Šiuo atveju, patarimų yra lygiavertis masyvai,
todėl galiu tiesiog naudoti šį žymeklį kaip tą patį dalyką, kaip int masyvas.
Taigi, aš indeksavimo į 0, ir pakeisti pirmą sveikasis skaičius 1,
keisti antrąjį sveikasis skaičius 2, ir 3-iasis sveikasis skaičius 3.
Taigi daugiau rodykles. Na, prisiminti Binky.
Šiuo atveju mes skiriama rodyklę, ar mes paskelbta žymeklį,
bet iš pradžių, kai aš ką tik paskelbė rodyklę, tai ne nurodydama bet atmintyje.
Tai tik šiukšlių viduje vertybės.
Taigi, aš neįsivaizduoju, kur tai rodyklė būtų nukreipta.
Ji turi adresą, kuris yra tiesiog alsuoja 0 ir 1, kur jis iš pradžių buvo paskelbta.
Aš negaliu nieko daryti, kol aš vadinu jį malloc
ir tada jis man duoda mažai vietos ant krūvos, kur galiu įdėti viduje vertybes.
Tada vėl, aš nežinau, kas viduje šios atminties.
Taigi pirmas dalykas, ką turite padaryti, tai patikrinti, ar sistema turėjo pakankamai atminties
suteikti man atgal 1 pirmąją vietą sveikąjį skaičių, kuris yra, kodėl aš darau tai patikrinti.
Jei rodyklė yra niekinis, tai reiškia, kad ji neturėjo pakankamai vietos ar kokios nors kitos įvyko klaida,
todėl aš išeiti iš mano programos.
Bet jei jis pavyko, o dabar galiu naudoti, kad žymiklį
ir ką * rodyklė daro tai kur adresas
, kai ši vertė yra, ir tai išskiria jį lygus 1.
Taigi čia, mes patikrinti, jei tai atmintis.
>> , Kai jūs žinote, jis egzistuoja, galite įdėti į ją
kokią vertę jūs norite įdėti į ją; šiuo atveju 1.
Kai baigsime su juo, jums reikia nemokamai, kad žymeklį
nes mes turime grįžti prie sistemos, kad atminties, kad jūs paprašė į pirmąją vietą.
Nes kompiuteris nežino, kai baigsite su juo.
Šiuo atveju mes aiškiai nurodant, kad jį, gerai, mes su tos atminties.
Jeigu kai kurios kitos procesas turi kita programa reikia, nedvejodami eiti į priekį ir priimti jį.
Tai, ką mes taip pat galime tai padaryti, mes galime tik lokalūs kintamieji rinkinio adresą.
Taigi, int x viduje sukrauti rėmo Maino.
Ir kai mes naudojame šią ampersendo, tai ir operatorius, ką ji daro
ji mano, x, ir x yra tik keletas atminties duomenys, tačiau jis turi adresą.
Tai kažkur. Taigi, pašaukimas & x, Kas tai yra ji suteikia mums x adresą.
Tai darydami, mes darome rodyklė tašką, kur x yra atmintyje.
Dabar mes tiesiog kažkas panašaus * x, mes ketiname gauti 5 atgal.
Žvaigždė vadinama dereferencing jį.
Jums sekti adresą, ir jūs gaunate jį ten laikomi vertę.
>> Turite klausimų? Taip?
[Studentų] Jei jums nereikia daryti 3-smailiu dalykas, ar ji vis dar kaupia?
Taip. Jei jums nereikia daryti 3-jų rodyklė dalykas, jis vis dar ketina kaupti,
bet aš parodyti jums, kas atsitinka per sekundę, ir be daryti, kad,
kad tai, ką mes vadiname Atminties nutekėjimas. Jūs nesate sistemai suteikiamas
atsarginę savo atmintį, kad po kurio laiko programa kaupti
atminties, kad ji nenaudoja, ir nieko daugiau galite naudoti ją.
Jei jūs kada nors matė "Firefox" su 1,5 mln. Kilobaitų jūsų kompiuteryje,
Task Manager, kad tai, kas vyksta.
Turite Atminties nutekėjimas, kad jie ne tvarkymo programoje.
Taigi, kaip rodyklė aritmetinis darbas?
Na, rodyklė aritmetinis rūšiuoti panašaus indeksavimo į masyvą.
Šiuo atveju, turiu rodyklę, ir tai, ką darau, žymiklį nukreipkite žymiklį į pirmąjį elementą
šiame 3 sveikieji skaičiai, kad aš skiriamų masyvo.
Taigi dabar ką man daryti, žvaigždė žymeklis tiesiog pakeičia pirmasis elementas sąraše.
Žymiklis žvaigždutėmis 1 taškų čia.
Taigi žymeklis yra čia, rodyklė +1 yra čia, rodyklė 2 yra čia.
>> Taigi tiesiog pridėjus 1 yra tas pats, kaip juda išilgai šio masyvo.
, Ką mes darome, kai mes darome 1 žymeklį gausite adresą čia,
ir siekiant gauti čia vertė, galite įdėti žvaigždę iš visos išraiškos
į dereference jį.
Taigi, šiuo atveju, aš nustatyti pirmąją vietą šiame masyve 1,
antroji vieta 2, o trečioji vieta 3.
Tada, ką aš darau čia aš spausdinti mūsų žymeklį 1,
, kurie tik suteikia man 2.
Dabar aš incrementing žymiklį, kad žymiklis lygus žymeklį 1,
, kuri juda į priekį.
Ir todėl dabar, jei aš atsispausdinti žymeklį 1, rodyklė +1 dabar 3,
, kuris šiuo atveju spausdina 3.
Ir siekiant į laisvą kažkas, rodyklių, kad aš tau jį
turi būti nukreipta į masyvo, kurią aš gavau atgal iš malloc pradžioje.
Taigi, šiuo atveju, jei aš būčiau skambinti 3 čia, tai negali būti teisus,
, nes jis yra iš masyvo viduryje.
Turiu atimti patekti į pradinę vietą
pirmasis pradinis vietoje, kol aš galiu jį išlaisvinti.
Taigi, štai aktyviau dalyvauti pavyzdys.
Šiuo atveju, mes skirti 7 simbolių simbolių masyvas.
>> Ir šiuo atveju tai, ką mes darome, yra mes kilpų per pirmuosius 6 iš jų,
ir mes jas iki Z.
Taigi, int i = 0, i> 6, i + +,
Taigi, rodyklė + i tiesiog duoti mums, šiuo atveju,
rodyklė, rodyklė +1, +2, rodyklė rodyklė 3, ir tt, ir tt į kilpą.
Tai, ką jis ketina daryti tai pasireiškia tuo IP adresu, dereferences gauti vertę,
ir pokyčių, kurie vertė iki Z.
Tada pabaigoje prisiminti, tai yra eilutė, tiesa?
Visos eilutės turi baigtis null pabaigos simbolis.
Taigi, ką aš padaryti, tai 6 rodyklė aš įdėti null Terminatorius pobūdžio in
Ir dabar, ką aš iš esmės daro čia įgyvendina printf eilutę, tiesa?
>> Taigi, kai printf dabar, kai jis pasiekė eilutės pabaigą?
Kai tik ji pasieks nulinę pabaigos simbolis.
Taigi, šiuo atveju, mano originalus žymeklis nurodo, kad šio masyvo pradžioje.
Galiu atspausdinti pirmąją raidę. Aš jį perkelti per vieną.
Galiu atsispausdinti tą simbolį. Galiu perkelti jį per.
Ir aš nuolat tai daryti, kol aš pasiekti pabaigos.
Ir dabar galutinis * žymeklis bus dereference ir gauti null pabaigos simbolis.
Ir todėl mano, o kilpa veikia tik tada, kai ta vertė nėra null pabaigos simbolis.
Taigi, dabar aš išeiti iš šio ciklo.
Ir todėl, jei aš atimti 6 iš šio rodyklė
Aš einu atgal visą kelią į pradžią.
Atminkite, kad darau tai, nes aš turiu eiti į pradžią, siekiant atlaisvinti.
>> Taigi, aš žinau, kad buvo daug. Ar yra kokių nors klausimų?
Prašome, taip?
[Studento klausimas nesuprantamas]
Ar galite pasakyti, kad garsiau? Atsiprašau.
[Studentų] tiesiai prieš jus išlaisvintų žymiklį paskutinės skaidrės,
Kur tu buvai, iš tikrųjų keičiasi, kad rodyklė vertę?
[Juozapas] Taigi, čia. >> [Studentų] O, gerai.
[Juozapas] Taigi, turiu rodyklę minuso minuso, teisė,
kurie juda dalykas atgal vienu, ir tada aš atlaisvinti jį,
nes tai rodyklė turi būti nukreiptas į masyvo pradžioje.
[Studentų] Bet, kad nebūtų būti reikalinga, jei būtumėte sustojo po šios eilutės.
[Juozapas] Taigi, jei aš buvo sustabdytas po to, tai būtų laikoma Atminties nutekėjimas,
nes aš ne paleisti nemokamai.
[Studentų] [nesuprantamas] po pirmųjų trijų eilučių, kur jums teko žymeklį 1 [nesuprantamas].
[Juozapas] Aha. Taigi, kas ten klausimas?
Atsiprašau. Ne, ne. Eik, eik, prašau.
[Studentų] Taigi, jūs ne keisti rodykles vertę.
Nebūtų reikėję padaryti žymeklį minus minuso.
[Juozapas] Taip, būtent.
Taigi, kai aš padaryti žymeklį 1 ir 2 rodyklę,
Aš ne daryti žymeklį lygus žymeklį 1.
Taigi, rodyklė tiesiog lieka nukreipta į masyvo pradžioje.
Tai tik kai aš plius plius, kad ji nustato vertę atgal viduje rodyklė,
, kad ji iš tikrųjų juda kartu.
Gerai.
Daugiau klausimų?
>> Vėlgi, jei tai yra tarsi didžioji, tai bus įtraukti į sesijos.
Paklausti jūsų mokymo kolegos apie tai, ir mes galime atsakyti į klausimus pabaigoje.
Ir paprastai, kad mums nepatinka tai padaryti minuso dalykas.
Tai turi reikalauti, kad mane sekti, kiek aš kompensuoti masyve.
Taigi, apskritai, tai yra tik paaiškinti, kaip rodyklė aritmetines darbus.
Bet ką mes paprastai patinka daryti, mes norėtume sukurti rodyklė kopiją,
ir tada mes naudoti šią kopiją, kai mes judėti į eilutę.
Taigi, šių atveju jūs naudojate kopiją spausdinti visą eilutę,
tačiau mes negalime padaryti, kaip žymeklis minus 6 arba sekti, kiek mes persikėlė,
tik todėl, kad mes žinome, kad mūsų pradinis taškas dar atkreipė dėmesį į sąrašo pradžioje
ir visi, kad mes pakeisti ši kopija.
Taigi, apskritai, pakeisti savo originalaus rodyklė kopijas.
Nebandykite rūšiuoti kaip NeraŠykiTe pakeisti originalus.
Bandymas pakeisti tik kopijas jūsų originalus.
Taigi, jūs pastebėsite, kai mes pereiname eilutę į printf
jūs neturite įdėti žvaigždę priešais jį, kaip mes padarėme su visais kitais dereferences, tiesa?
Taigi, jei jums atspausdinti visą eilutę% s tikisi, adresas,
ir šiuo atveju rodyklių arba šiuo atveju, kaip simbolių masyvas.
>> Simbolių, char * s, ir masyvai yra tas pats dalykas.
Žymeklis yra simbolių ir simbolių matricos yra tas pats dalykas.
Ir taip, visi mes turime padaryti, tai perduoti rodyklė.
Mes neturime perduoti kaip ir * pointer ar ko nors panašaus.
Taigi, matricas ir rodyklės yra tas pats dalykas.
Kai jūs darote kažką panašaus x [Y] per čia masyvo,
ką jis daro po gaubtu, tai sako, gerai, tai skaitmenu rinkinys,
todėl rodyklė.
Ir taip x yra tas pats,
ir taip, ką ji daro, ji priduria, y x,
kuris yra tas pats, kaip juda į priekį, atminties, kad daug.
Ir dabar x + y suteikia mums tam tikrą adresą, rūšiuoti,
ir mes dereference adresą arba sekite rodyklę
, kur, kad atminties vieta, ir mes gauti naudą iš tos atminties vietą.
Taip, kad šie du dalykai yra lygiai tas pats.
Tai tik sintaksinė cukrus.
Jie padaryti tą patį. Jie tik skirtingi syntactics vienas kitą.
>> Taigi, ką gali suklysti su rodyklės? , Pavyzdžiui, daug. Gerai. Taigi, blogų dalykų.
Blogų dalykų, kuriuos galite padaryti, yra ne patikrinti,, jei jūsų malloc skambutis vėl nulis, tiesa?
Šiuo atveju, aš klausia sistemą duoti man - kas yra šis skaičius?
Kaip ir 2 milijardus kartų 4, nes sveikasis skaičius dydis 4 baitai.
Aš prašau jį kaip 8 milijardas baitų.
, Žinoma, mano kompiuteris yra nesiruošia būti gali duoti man, kad daug atminties atgal.
Ir mes ne patikrinti, ar tai yra niekinis, todėl, kai mes bandome dereference jį per ten
sekti rodyklę, kur jis ketina mes neturime, kad atmintis.
Tai, ką mes vadiname dereferencing NULL pointeris.
Ir tai iš esmės sukelia jums segfault.
Tai yra vienas iš būdų, kaip galite segfault.
Kitų blogų dalykų, kuriuos galite padaryti, - Oh well.
, Kuris buvo dereferencing NULL pointeris. Gerai.
Kitų blogų dalykų - taip pat, siekiant nustatyti, kad jūs tiesiog įdėti ten patikrinti
kuri patikrina, ar žymeklis yra niekinis
ir išeiti iš programos, jei tai atsitinka, kad malloc grąžina null žymeklį.
Tai xkcd komiška. Žmonėms jį suprasti dabar. Rūšiuoti.
>> Taigi, atmintis. Ir aš per šį.
Mes ragina malloc į kilpą, bet kiekvieną kartą, kai mes vadiname malloc
mes prarasti sekti, iš kur ši rodyklė yra nukreipta į
nes mes clobbering.
Taigi, pradinis kvietimas į malloc suteikia man atminties čia.
Mano žymeklis rodykles į tai.
Dabar aš neatleidžia, todėl dabar aš vadinu malloc dar kartą.
Dabar ji primena čia. Dabar mano atmintis yra nukreipta čia.
Nukreipta čia. Nukreipta čia.
Bet aš prarado stebėti visų per čia, kad aš skirta atminties adresus.
Ir todėl dabar aš neturiu jokios nuorodos į jų nebėra.
Taigi, galiu neatleidžia juos ne iš šio ciklo.
Ir todėl, siekiant nustatyti kažką panašaus į tai,
, jei pamiršite, kad atlaisvintumėte atminties, ir jūs gaunate šią atminties nutekėjimas,
Turite atlaisvinti atminties viduje šio ciklo, kai jūs baigsite su juo.
Na, tai, kas vyksta. Aš žinau, kad daug iš jūsų nekenčiu.
O dabar - yay! Jūs gaunate kaip 44.000 kilobaitų.
Taigi, jūs nemokamai ji kilpos pabaigoje,
ir tai vyksta tiesiog atlaisvinti atmintį kiekvieną kartą.
Iš esmės, jūsų programa neturi atminties nutekėjimas nebėra.
>> Ir dabar kažkas galite padaryti, tai atlaisvinti atminties, kad jūs paprašė du kartus.
Šiuo atveju, jūs malloc kažkas, galite pakeisti savo vertę.
Jums nemokamai ją vieną kartą, nes jūs sakėte, buvo padaryti su juo.
Bet tada mes išlaisvino jį iš naujo.
Tai yra kažkas, kad gana neblogai.
Jis nesiruošia iš pradžių segfault
tačiau po kurio laiko Kas tai yra dvigubai išlaisvinant ŠĮ gadina savo krūvos struktūrą,
ir jums sužinoti šiek tiek daugiau apie tai, jei jūs nuspręsite imtis klasės, kaip CS61.
Bet iš esmės po kurio laiko jūsų kompiuteris yra susipainioti
apie tai, kas atminties vietos yra, kur ir kur saugoma
kai duomenys yra saugomi atmintyje.
Ir taip atlaisvinti žymeklį du kartus yra blogas dalykas, kad jūs nenorite daryti.
>> Kitų dalykų, kurie gali suklysti nenaudoja sizeof.
Taigi, šiuo atveju jums malloc 8 baitai,
ir tai yra tas pats, kaip du sveikieji skaičiai, tiesa?
Taigi, tai visiškai saugus, tačiau tai?
Na, kaip Lukas kalbėjo apie skirtingų architektūrų,
sveikieji skaičiai yra skirtingų ilgių.
Taigi, ant prietaiso, kad jūs naudojate, sveikieji skaičiai yra apie 4 baitai,
tačiau dėl kokios nors kitos sistemos, jie gali būti 8 baitai, arba jie gali būti 16 baitų.
Taigi, jei aš tiesiog naudoti šį numerį čia,
ši programa gali dirbti ant prietaiso,
bet jis nesiruošia skirti pakankamai atminties kokios nors kitos sistemos.
Šiuo atveju, tai ką sizeof operatorius yra naudojamas.
Kai mes vadiname sizeof (int), Kas tai yra
ji suteikia mums sistemą, kad programa veikia sveikojo skaičiaus dydį.
Taigi, šiuo atveju, sizeof (int) grįš 4 kažką panašaus prietaiso,
Dabar tai 4 * 2, kuris yra 8,
kuri yra tik vietos reikia dviem sveikaisiais skaičiais suma.
Kitą sistemą, jei int kaip 16 baitų ar 8 baitų,
tai tik nesiruošia grįžti pakankamai baitų laikyti tą sumą.
>> Ir, pagaliau, structs.
Taigi, jei jūs norėjote saugoti sudoku lenta atmintyje, kaip galėtume tai padaryti?
Jūs manote, kaip kintamojo pirmas dalykas,
Antras dalykas, kintamasis, Trečias dalykas kintamasis,
blogai, tiesa - jau ketvirtą dalykas rodiklis?
Taigi, vienas pagerėjimas, kurį jūs galite padaryti ant to padaryti 9 x 9 masyvo.
Tai gerai, bet ką daryti, jei norėjo susieti kitų dalykų, su sudoku valdybos
patinka tai, ką valdybos sunku,
arba, pavyzdžiui, kaip jūsų rezultatas, ir kiek laiko ji ėmėsi, jums išspręsti šią lenta?
Na, ką galite padaryti, tai galite sukurti struct.
Ką aš iš esmės sakydamas, aš apibrėžti šią struktūrą čia,
ir aš Sudoku taryba, kurią sudaro valdyba, kuri yra 9 x 9.
>> Ir ką ji turi, ji turi patarimų lygio pavadinimą.
Ji taip pat turi X ir Y, kurie yra iš ten, kur aš esu dabar koordinatės.
Ji taip pat turi laikas, praleistas [nesuprantamas], ir ji turi iš viso juda, aš užregistruotų iki šiol.
Ir todėl šiuo atveju, aš gali grupuoti visa krūva duomenų į tik vieną struktūrą
vietoj to, kad, pavyzdžiui, plaukioja aplink kaip įvairių kintamųjų
kad aš negaliu tikrai sekti.
Ir tai leidžia mums turėti tik gražus sintaksė rūšies nuorodos skirtingus dalykus viduje šio struct.
Aš galiu tik padaryti board.board ir gaunu sudoku lenta.
Board.level, man, kaip sunku yra.
Board.x ir board.y duoti man, kur aš galiu būti valdybos koordinates.
Ir todėl aš prieigą prie,, ką mes vadiname struct laukai.
Tai apibrėžia sudokuBoard, kuris yra tipo, kad aš turiu.
Ir dabar mes čia. Turiu kintamasis vadinamas "lenta" tipo sudokuBoard.
Ir todėl dabar aš galiu gauti prieigą visus laukus, kurie sudaro šią struktūrą čia.
>> Bet apie structs klausimai? Taip?
[Studentų] int x, y, jūs pareiškė, tiek vienoje eilutėje? >> [Juozapas] Aha.
[Studentų] Taigi, gal jūs tiesiog padaryti, kad su visais iš jų?
Kaip ir x, y kableliais kartus, kad iš viso?
[Juozapas] Taip, galite tikrai padaryti, kad bet priežastis, kodėl aš toje pačioje eilutėje X ir Y -
ir kyla klausimas, kodėl mes galime tik tai padaryti toje pačioje eilutėje?
Kodėl ne mes tiesiog įdėti visi jie toje pačioje eilutėje yra
X ir Y yra susiję vieni su kitais,
ir tai tik stilistiškai teisinga, tam tikra prasme,
, nes jis du dalykus grupavimas toje pačioje eilutėje
, kad kaip ir tarsi į tą patį.
Ir aš tiesiog padalinti tai atskirai. Tai tik stiliaus dalykas.
Tai funkciškai, neturi reikšmės.
Visus kitus klausimus dėl structs?
Galite nustatyti Pokédex su struct.
Pokemon numerį ir jis turi laišką, savininkas, tipo.
Ir tada, jei turite Pokemon masyvo, galite sudaryti Pokédex, tiesa?
Gerai, kietas. Taigi, klausimai ant structs. Tie, kurie susiję su structs.
>> Galiausiai, GDB. Ką GDB jums tai padaryti? Jis leidžia jums derinti savo programą.
Ir, jei turite nenaudojama GDB, aš norėčiau rekomenduojama žiūrėti trumpas
tiesiog vyksta per ką GDB, kaip jūs su juo dirbti, kaip jūs galite naudoti ją,
ir išbandyti jį dėl programos.
Ir kas iš to GDB leidžia jums padaryti tai leidžia laikinai sustabdyti [nesuprantamas] Iki savo programą
ir praktinis linija.
Pavyzdžiui, aš noriu, kaip mano programa 3 eilutėje, norėdami laikinai sustabdyti vykdymo,
ir, o aš 3 eilutėje galiu atspausdinti visas vertes, kurios yra ten.
Ir taip, ką mes vadiname kaip pristabdžius linija
mes vadiname tai atskaitos tašką tos linijos
ir tada mes galime spausdinti kintamuosius programos būklę tuo metu.
>> Mes galime iš ten žingsnis per programą, eilutė po eilutės.
Ir tada mes galime pažvelgti į kamino būklę tuo metu.
Ir todėl, siekiant naudoti gdb, ką mes darome, mes vadiname Apsukite metalinis garsas C failą,
bet turime priimti-ggdb vėliava.
Ir vieną kartą baigsime su tuo mes tiesiog paleisti gdb gautame išvesties failo.
Ir tokiu būdu jūs gaunate, kaip šis, kai, pavyzdžiui, teksto masę
bet tikrai ne visi, ką jums reikia padaryti, tai tipo komandų pradžioje.
Break pagrindinis nurodo atskaitos tašką pagrindinis.
Sąrašas 400 išvardyti kodo linijomis aplink linija 400.
Ir todėl šiuo atveju galite tiesiog apsižvalgyti ir pasakyti, Oh,
Noriu nustatyti atskaitos tašką, 397 eilutėje, kurioje yra ši eilutė,
ir tada jūsų programa veikia į šio žingsnio ir ji ketina nutraukti.
Ji ketina pristabdyti ten ir galite atsispausdinti, pavyzdžiui, vertė maža, ar didelė.
Ir todėl yra komandų krūva, jums reikia žinoti,
ir tai skaidrių peržiūrą bus eiti į svetainę,
todėl, jei jūs tiesiog norite tai nuoroda ar kaip įdėti juos į savo Ruošinukai, jaustis laisvai.
>> Cool. Tai buvo Viktorina apžvalga 0, ir mes klijuoti aplink, jei turite kokių nors klausimų.
Gerai.
>> [Plojimai]
>> [CS50.TV]