[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 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]