[Powered by Google Translate] [Opis] [Kviz 0] [Lexi Ross, Tommy MacWilliam, Lucas Freitas, Joseph Ong] [Harvard University] [To je CS50.] [CS50.TV] Hej, vsi. Dobrodošli na pregledu seji za kviz 0, ki poteka v sredo. Kaj bomo nocoj, sem s 3 drugimi TF, in skupaj bomo šli skozi pregled, kaj smo naredili v letu doslej. To ne bo 100% celovit, vendar bi vam boljšo idejo tega, kar že imate dol in kaj je treba še preučiti, preden sredo. In vas prosimo, da dvigne roko z vprašanji, kot gremo skupaj, vendar ne pozabite, da bomo tudi malo časa na koncu če bomo končali z nekaj minut, da se rezervno storiti splošna vprašanja, tako da se vodijo v mislih, zato bomo začeli na začetku tedna z 0. [Kviz 0 mnenje!] [Part 0] [Lexi Ross] Toda preden to storimo, kaj je govoril o logistike kvizu. [Logistika] [Kviz poteka v sredo, 10/10 namesto predavanja] [(Glej http://cdn.cs50.net/2012/fall/quizzes/0/about0.pdf za podrobnosti)], je na sreda, 10. okt. To je v sredo, in če greš na ta URL tukaj, , ki je dostopen tudi iz CS50.net, tam je povezava na to- si lahko ogledate informacije o tem, kam iti na podlagi vaš priimek ali šole pripadnost kot tudi pripoveduje o tem, kaj bo kviz zajema in vrste vprašanj, ki jih boste dobili. Imejte v mislih, da boste imeli tudi priložnost za pregled za kviz v oddelku, Tako bi bilo vaše TFS se bo čez nekaj praktičnih problemov, in to je še ena dobra priložnost, da vidim, če ste še vedno treba preučiti pripravljen za kviz. Začnimo na začetku z bitov 'N' Bytes. Ne pozabite, malo je samo 0 ali 1, in bajt je zbirka teh 8 bitov. Oglejmo si to zbirko bitov tukaj. Morali bi biti sposobni ugotoviti, koliko bitov je. Če upoštevamo, da je samo 8 od njih 8 0 ali 1 enote. In ker tam je 8 bitov, to je 1 bajt, in naj se pretvori v šestnajstiško. Šestnajstiški je osnova 16, in to je zelo enostavno pretvorbo število v binarno, ki je tisto, kar pomeni, da je število v šestnajstiško. Vse mi je, da smo si na skupine po 4, in smo jih pretvoriti v ustrezno števko šestnajstiški. Začnemo z desne najbolj skupine 4, torej 0011. To bo še ena 1 in 1 2, tako skupaj, da naredi 3. In potem si oglejmo drugi blok 4. 1101. To bo še ena 1, 1 4 in 1 8. Skupaj ki bo v 13, kar pomeni, D. In ne pozabite, da bomo v šestnajstiškem ne bomo iti od 0 do 9. Gremo 0 do F, tako da po 9, 10 ustreza, 11 B, in tako dalje, kjer je F 15. Tukaj je 13 D, tako spremeniti, da decimalno vsi delamo, je, da smo dejansko zdravljenje vsakega položaja, moči 2. To je ena 1, 1 2, 4s nič, nič 8s, eden 16, in tako naprej, in to je malo težko izračunati v tvoji glavi, če pa gremo na naslednjo stran lahko vidimo odgovor na to vprašanje. V bistvu gremo nasproti nazaj na levo, in smo se pomnoži vsako številko z ustrezno močjo 2. In ne pozabite, za šestnajstiško označujemo te številke z 0x na začetku tako da ne bomo zamenjali z decimalno številko. Nadaljevanje je to ASCII tabela, in kaj bomo uporabili za ASCII je zemljevid od znakov, da numerične vrednosti. Ne pozabite na pset kriptografije smo široko uporabo ASCII tabele Za uporabo različnih metod kriptografije, Cezar in šifra Vigenère, pretvoriti različne črke v nizu po ključu, ki ga uporabnik. Oglejmo si malo ASCII matematiki. Če pogledamo na "P" + 1, v obliki znaka, ki bi bil Q, in ne pozabite, da '5 '≠ 5. In kako bi pretvorbo med temi oblikami 2? To dejansko ni preveč težko. Da bi dobili 5 odštejemo 0 " ker so 5 mest med 0 "in '5." Da bi šel v drugo smer smo samo dodati 0, tako da je nekako tako kot redni aritmetiki. Zapomnite si, da ko nekaj je narekovaje okoli nje je znak in tako ustreza vrednosti v ASCII tabeli. Selitev v bolj splošne teme računalništva. Izvedeli smo, kaj je algoritem in kako jih uporabljamo programiranje za izvajanje algoritmov. Nekateri primeri algoritmov so nekaj zelo enostavno, kot preverjanje, ali je število sodo ali liho. Za to smo se spomnite mod številko z 2 in preverite, če je rezultat 0. Če je tako, je še. Če ne, to je čudno. In to je primer res osnovni algoritem. Malo bolj vključene 1 je binarno iskanje, ki bomo šli čez pozneje v zvezi s pregledom seji. In programiranje je izraz, ki ga uporabljamo za sprejemanje algoritem in se lahko pretvori kodo, da računalnik bere. 2 Primeri programiranja je na praske, , ki je tisto, kar smo storili v tednu 0. Čeprav pravzaprav ne tip iz kodeksa je način izvajanja Ta algoritem, ki tiska številke 1-10, in tu storiti enako v programskem jeziku C. To so funkcionalno enakovreden, tako napisana v različnih jezikih ali sintakse. Nato smo se naučili o matematičnih izrazov, in boolean je vrednost, ki je bodisi resnična ali neresnična, in tukaj velikokrat boolean izrazi Vstopimo pogojev, tako da, če (x ≤ 5), No, smo že x = 5, tako da je pogoj, da se bo ocenila, da res. In če je res, kar je koda pod pogojem, bo treba oceniti z računalnikom, tako da je niz se bo natisnjen na standardni izhod, in izraz stanja se nanaša na vse, kar je v oklepajih if stavku. Ne pozabite, vse izvajalce. Ne pozabite, da je && in | |, ko poskušamo sestavljena iz 2 ali več pogojev, == Ne = bi preverili, ali so 2 stvari enako. Ne pozabite, da je za dodelitev = ker je == logična operater. ≤, ≥ nato končno 2 sta samoumevna. Splošen pregled boolean logike tukaj. In boolean izrazi so pomembni tudi zank, ki bomo šli več kot sedaj. Izvedeli smo približno 3 vrste zank doslej CS50, za, medtem ko je, in ne časa. In to je pomembno, da veste, da medtem ko je v večini primerov lahko dejansko uporablja nobene vrste zanke na splošno obstajajo določene vrste razlogov ali splošnih vzorcev pri načrtovanju programov, ki so posebej klic za eno od teh zank da bi bilo najbolj učinkovito in eleganten to kodo na ta način. Pojdimo nad tem, kaj vsaka od teh zank kaže, da je za najbolj pogosto. V zanka smo na splošno že veš, kolikokrat želimo ponoviti. To je tisto, kar smo se v stanju. Za i = 0, i <10, na primer. Mi že vemo, da želimo narediti nekaj 10-krat. Zdaj, za nekaj časa zanke, na splošno ne nujno vem kolikokrat želimo zanka teči. Vemo pa, nekakšen pogoj, da želimo, da vedno res, ali vedno napačna. Na primer, nastavite časa. Recimo, da je to logična spremenljivka. Čeprav je to res želimo koda za ocenjevanje, Tako malo bolj razširiti, nekoliko bolj splošna kot za zanke, vendar pa lahko vsaka zanka tudi pretvori v while zanko. Končno, medtem ko je zank, ki so lahko najtezje razumeti takoj, se pogosto uporablja, kadar želimo ovrednotiti kodo 1. Pred prvo preverimo stanje. Skupna raba primeru, medtem ko je zanka je, ko želite, da se vnos uporabnika, in veste, da ste želeli vprašati uporabnika Za vnos vsaj enkrat, če pa vam ne dajejo dober prispevek takoj želite, da jih prosi, dokler ne dam dober znak. To je najpogostejša uporaba ne while zanko, in si oglejmo dejanske strukture teh zank. Navadno vedno običajno sledijo teh vzorcev. Na zanke za notranje imate 3 komponente: inicializacijo, ponavadi nekaj takega int i = 0, kjer je i števec, stanje, kjer želimo povedati teči ta zanka, dokler ta pogoj še vedno velja, Kot sem <10, nato pa na koncu, posodobitvi, ki je, kako smo prirastek števec spremenljivka za vsako točko v zanko. Običajna stvar, da vidite, da je ravno i + +, Kar pomeni, da prirastek po 1 vsak čas. Lahko bi tudi kaj takega i + = 2, kar pomeni, dodamo 2 do i vsakič, ko gredo skozi zanko. In potem se to nanaša samo na kodo, ki dejansko poteka kot del zanke. In za nekaj časa zanke, tokrat smo dejansko imeli inicializacijo zunaj zanke, Tako, na primer, recimo, da skušamo narediti isto vrsto zanke, kot sem opisal. Mi bi rekli, int i = 0, preden se zanka začne. Potem lahko rečemo, medtem ko je i <10 to, Tako isti kode, kot prej, in tokrat posodobitev del kode, na primer, i + +, dejansko gre znotraj zanke. In končno, za to pa, da je podobno kot while zanko, vendar se moramo zavedati, da bo koda oceni enkrat preden se preveri pogoj, tako da naredi veliko bolj smiselno če gledate na to, da od vrha do dna. V to zanko, medtem ko je koda ocenjuje, preden ga sploh pogledal while pogoj, ker while zanko, da najprej preveri. Izjave in spremenljivke. Ko smo želeli ustvariti novo spremenljivko želimo najprej inicializacijo. Na primer, int vrstica inicializira spremenljivko bar, vendar pa ne daje vrednost, tako da tisto, kar je vrednost bara je zdaj? Ne vemo. Lahko bi bilo nekaj smeti vrednost, ki je bil prej shranjen v spomin tam, in ne želimo, da bo uporabil ta spremenljivka dokler ne bomo dejansko dal to vrednost, zato smo jo razglaša tukaj. Potem smo inicializirati, da je 42 spodaj. Zdaj seveda vemo, to pa je mogoče v eni vrstici, int vrstica = 42. Ampak samo zato, da bi očistili več korakov, ki se odvijajo, deklaracija in inicializacija ločeno dogaja. To se zgodi v enem koraku, in naslednjič, int BAZ = vrstica + 1, To spodaj navedeno izjavo, da korakih Baz, tako da na koncu te kode bloka če smo bili za tiskanje vrednost Baz bi bilo 44 ker smo jih razglasi za inicializacijo za 1> bar, in potem smo ga prirastek še enkrat z + +. Šli smo v tem precej kratko, vendar je dobro, da ima splošno razumevanje tega, kar niti in prireditve so. Mi v glavnem je to storila v Scratch, Tako si lahko zamislite niti kot več zaporedij z oznako teče ob istem času. V resnici pa verjetno ne teče ob istem času, ampak nekako abstraktno lahko razmišljamo o tem na tak način. V Scratch, na primer, smo imeli več sprites. Lahko bi se izvršilni drugačno kodo ob istem času. Lahko bi se peš, medtem ko drugi je rekel nekaj V drugem delu zaslona. Dogodki so še en način izloči logiko med različnimi elementi kodo, in Scratch smo lahko simulirajo dogajanja z uporabo oddajanje, in to je pravzaprav, ko dobim, ne, ko slišim, v bistvu pa je to način za prenos podatkov od enega do drugega Vilenjak. Na primer, boste morda želeli poslati v igro, in če še sprite prejme igre konec, se odziva na določen način. To je pomemben zgled za razumevanje za programiranje. Samo, da gredo nad osnovno 0. teden, kar sva šla čez tako daleč, Oglejmo si ta preprost program C. Besedilo je lahko malo majhen od tukaj, ampak bom šel nad njim res hitro. Mi smo tudi 2 header datoteke na vrhu, cs50.h in stdio.h. Mi smo potem opredelitev stalnega imenovano mejo za 100. Mi smo potem uresničili našo glavno funkcijo. Ker ne uporabljamo argumente v ukazni vrstici, tukaj moramo postaviti praznino kot argumente za glavni. Bomo videli zgoraj int main. To je vrnitev tip, zato se vrnete 0 na dnu. In mi smo z uporabo CS50 knjižnično funkcijo dobili int da od uporabnika zahteva za vnos, in jo shranite na to spremenljivko x, Tako izjavljamo x zgoraj, in jo inicializirati z x = GetInt. Nato smo preverite, če je uporabnik nam je dal dober znak. Če je ≥ LIMIT želimo, da vrne kodo napake za 1 in natisniti sporočilo o napaki. In končno, če je uporabnik nam je dal dober prispevek bomo sprijazniti številko in natisnite ta rezultat. Samo se prepričajte, da so vsi hit domov si lahko ogledate nalepke različnih delih kode tukaj. Omenil sem konstantno, header datoteke. Oh, int x. Prepričajte se, da se spomnimo, da je lokalna spremenljivka. To je v nasprotju z globalno spremenljivko, ki se bomo pogovorili o Malo pozneje v zvezi s pregledom zasedanju in smo poklical knjižnično funkcijo printf, tako da če ne bi vključevala stdio.h glavo datoteke ne bi mogli poklicati printf. In mislim, da je puščica, da imam prekinil tukaj kaže na% d, ki je oblikovanje niz v printf. Pravi natisnete to spremenljivko, številka% d. In to je za 0. teden. Zdaj Lucas se bo nadaljevala. Hej, fantje. Moje ime je Lucas. Jaz sem v drugem letniku v najboljšem hiši v naselju, Mather, in bom še malo govorim o tednu 1 in 2,1. [Teden 1 in 2,1!] [Lucas Freitas] Kot Lexi je rekel, ko smo začeli prevajati kodo iz nič na C ena od stvari, ki smo opazili, je, da lahko ne samo napišite kodo in jo zagnati z zeleno zastavo več. Pravzaprav, boste morali uporabiti nekaj korakov, da bi vaš C programa, postala izvršljiva datoteka. V bistvu, kaj storiti, ko pišete program, ki je prevesti zamisli v jeziku, ki ga razumejo prevajalnik, tako da, ko pišete program v C kaj delaš, je dejansko pisanje nekaj, da vaš prevajalnik bo razumel, in potem prevajalnik bo prevesti to kodo v nekaj, kar bo vaš računalnik razume. In stvar je, računalnik je pravzaprav zelo neumno. Računalnik lahko razumem le 0s in 1s, Tako je dejansko v prvih računalnikov ljudje običajno programira z 0 in 1s, vendar ne več, hvala bogu. Nimamo zapomniti zaporedja za 0s in 1s Za zanka ali while zanko in tako naprej. Zato imamo prevajalnik. Kaj prevajalnik pa je v bistvu prevaja kodo C, v našem primeru, v jeziku, ki ga bo vaš računalnik razume, ki je predmet kodo in prevajalnik, ki smo ga uporabljate se imenuje Jek, tako da je to pravzaprav simbol za Jek. Ko imate program, moraš narediti 2 stvari. Najprej morate pripraviti svoj program, nato pa boste teči vaš program. Za pripravo svojega programa, da imate veliko možnosti, da to stori. Prva je, da to Jek program.c Program, v katerem je ime vašega programa. V tem primeru lahko vidite, oni samo rekel: "Hej, sestavi svoj program." Saj ne pravim, "Hočem to ime za svoj program" ali kaj podobnega. Druga možnost je kar ime vašega programa. Lahko rečemo, Jek-o in nato ime, ki ga želite izvedljivo datoteko, da bo imenovan kot in nato program.c. In lahko storite tudi, da program, in videli, kako je v prvih 2 primerih Sem dal c. In v tretjo imam samo programe? Ja, pravzaprav ne bi smelo postaviti C, če boste uporabili narediti.. Sicer prevajalnik se dejansko dogaja, da kričati na vas. In tudi ne vem, če se vi spomnite, ampak veliko krat smo uporabili tudi lcs50-ali-lm. To se imenuje povezovanje. To samo pove prevajalniku, da boste uporabili te knjižnice tam, tako da, če želite uporabljati cs50.h boste dejansko morali vnesti Jek program.c-lcs50. Če tega ne boste storili, da prevajalnik ne bo vedel da uporabljate te funkcije v cs50.h. In če želite zagnati svoj program imate 2 možnosti. Če ste Jek program.c nisi dal ime vašega programa. Moraš teči z. / A.out. A.out je standardno ime, ki Jek daje svoj program, če ne ji dati ime. Drugače boš naredil. / Program, če je dal ime vašega programa, in tudi, če bi naredil programa ime programa, ki bo dobil se že dogaja, da je treba programirati isto ime kot datoteka c. Potem sva se pogovarjala vrste podatkov in podatkov. V bistvu podatkovni tipi so ista stvar kot majhne škatle, ki jih uporabljajo za shranjevanje vrednosti, tako da podatkovni tipi so dejansko tako kot pokemons. Pridejo v vseh velikosti in vrst. Ne vem, če je analogija smiselna. Podatki velikost je dejansko odvisna od stroja arhitekture. Vsi podatki, velikosti, ki jih bom tukaj prikaz dejansko za 32-bitni stroj, ki je v tem primeru naše naprave, ampak, če ste dejansko kodiranje Mac ali Windows tudi v Verjetno boš imel 64-bitni stroj, zato ne pozabite, da so podatki, velikosti, ki jih bom tukaj prikaz so za 32-bitni stroj. Prvo, kar smo videli, je int, kar je precej preprosta. Uporabite int za shranjevanje celo število. Videli smo tudi značaj, je char. Če želite uporabiti črke ali malo znak, da ste verjetno, da bo uporabila znak. Char ima 1 bajt, kar pomeni 8 bitov, kot Lexi dejal. V bistvu imamo ASCII tabelo, ki ima 256 možne kombinacije 0s in 1s, in potem, ko vnesete znak, da gre za prevajanje znak, da se vložki ste številko, ki jih imate v ASCII tabeli, kot je dejal, Lexi. Imamo tudi plovec, ki ga uporabljamo za shranjevanje decimalne številke. Če želite izbrati 3,14, na primer, boste za uporabo float ali dvakrat, da ima večjo natančnost. Plovec je 4 bajte. Dvakrat je 8 bajtov, tako da je edina razlika je natančnost. Imamo tudi dolgo, da se uporablja za cela števila, in si lahko ogledate za 32-bitno strojno int in dolgo so enake velikosti, tako da ne res smiselno uporabiti dolgo v 32-bitni stroj. Toda, če uporabljate Mac in 64-bitni stroj, pravzaprav dolgo je velikost 8, tako da je res odvisno od arhitekture. Za 32-bitnih računalnikih, da ni smiselno uporabljati dolgo res. In potem dolgo dolgo, na drugi strani pa je 8 bajtov, tako da je zelo dobro, če hočeš imeti daljše celo število. In končno, imamo niz, ki je pravzaprav char * , ki je kazalec na znak. To je zelo enostavno, da misliš, da je velikost niza se bo kot število znakov, ki jih imajo tam, ampak dejansko char * sam je velikost kazalec na char, kar je 4 bajte. Velikost char * je 4 bajte. Ni važno, če imate majhne besedo ali pismo ali kaj podobnega. To se dogaja, da je 4 bajte. Prav tako smo se naučili nekaj o litje, Kot lahko vidite, če imate na primer program, ki pravi, int x = 3 in nato printf ("% d", x / 2) Ali veste, kaj se dogaja za tiskanje na zaslonu? Nekdo? >> [Dijaki] 2. 1. >> 1, ja. Ko boste to storili 3/2, da bo dobil 1,5, ker pa smo s celo število, da bo prezreti decimalni del, in boste imeli 1. Če ne želite, da se to zgodi, kaj lahko naredite, na primer, se razglasi plovec y = x. Nato x, ki se uporabljajo za 3 je sedaj bo 3,000 za y. In potem si lahko natisnete y / 2. Pravzaprav bi moral imeti 2. tam. To bo storil 3.00/2.00, in boš dobil 1,5. In imamo to 0,2 f samo prositi za 2 decimalni enot v decimalni del. Če imate 0,3 f da se bo dejansko imajo 1,500. Če je to 2 se bo 1.50. Imamo tudi ta primer tukaj. Če boste to storili float x = 3,14, nato pa vas printf x boste dobili 3,14. In če x = int x, kar pomeni, da zdravljenje x kot notr in tiskate x zdaj boste imeli 3,00. Ima to smisel? Ker ste 1. obravnava kot celo število x, tako da ste ignoriranje decimalni del, in nato tiskate x. In končno, lahko tudi to, int x = 65, nato pa razglasi char c = x, in potem, če tiskate c ste dejansko dogaja, da se , Tako da v bistvu, kaj delaš tukaj uresničuje celo število v znak, tako kot ASCII tabela ne. Pogovarjali smo se tudi o matematičnih operaterjev. Večina od njih so precej enostavna, tako +, -, *, /, in prav tako smo se pogovarjali o Ministrstvo za obrambo, ki je preostanek delitve 2 številk. Če imate 10% 3, na primer: to pomeni, da delite 10 z 3, in kaj je ostalo? To bo 1, tako da je dejansko zelo uporaben za veliko programov. Za Vigenère in Cesar sem prepričan, da so vsi fantje uporabljajo mod. O matematiki subjektov, biti zelo previdni pri združevanju * in /. Na primer, če vam (3/2) * 2, kaj boš dobil? [Dijaki] 2. Ja, 2, saj 3/2 se bo 1,5, ker pa delaš operacij med 2 celih ste dejansko šele tekoč, da razmisli 1, in potem 1 * 2 se bo 2, tako zelo, zelo previdni pri tem aritmetike s števil, saj boste morda dobili, da 2 = 3, v tej zadevi. In tudi biti zelo previdni glede prednosti. Moral bi običajno uporabljajo oklepaje, da se prepričajte, da veste, kaj počnete. Nekaj ​​uporabnih bližnjic, seveda, ena je i + + ali i + = 1 ali z + =. To je isto, kot počne i = i + 1. Prav tako lahko storim - ali i - = 1, kar je enako kot i = i -1, nekaj vi uporabljate veliko v for zanke, vsaj. Tudi za *, če uporabljate * = in če ne, na primer, i * = 2, je isto, kot piše, da imam = i * 2, in ista stvar za delitev. Če boste to storili i / = 2 je isto kot i = i / 2. Zdaj pa funkcijami. Ste se naučili, da so funkcije zelo dobra strategija, da shranite kodo ko ste programiranje, tako da, če želite izvesti isto opravilo V kodeksu znova in znova, verjetno želite uporabiti funkcijo samo zato, da vam ni treba kopirati in prilepiti kodo znova in znova. Pravzaprav je glavna funkcija je, in ko sem vam pokazal obliko funkcije boste videli, da je to zelo očitno. Uporabljamo tudi naloge iz nekaterih knjižnic, na primer, printf, getin, ki je iz knjižnice CS50, in druge funkcije, kot so toupper. Vse te funkcije so dejansko izvajajo v drugih knjižnicah, in ko si dal privezati tiste datoteke v začetku svojega programa praviš, da si lahko prosim dajte mi kodo za te funkcije tako da mi ni treba, da jih izvajati sam? In lahko tudi napišete svoje naloge, tako da, ko začnete programiranje Se zavedaš, da knjižnice nimajo vse funkcije, ki jih potrebujete. Za zadnje pset, na primer, smo pisali pripravi, hitrostno in iskanje, in to je zelo, zelo pomembno, da bi lahko napisali nalog ker so koristni, in ki jih uporabljamo jih ves čas v načrtovanje, in prihrani veliko kode. Oblika funkcije je to ena. Imamo vrsto vrnitev na začetku. Kaj je vrnitev tip? To je samo, ko bo funkcija vrača. Če imate funkcijo, na primer, faktorsko da se bo za izračun fakulteto celo število, Verjetno pa se bo vrnil tudi celo število. Nato se je donosnost vrsta se bo int. Printf dejansko ima neveljavno vrsto povratno ker si ne vrne ničesar. Ti si samo tiskanje stvari na zaslonu in zapustil funkcijo kasneje. Potem imate ime funkcije, ki jih lahko izberete. Moral bi biti malo razumni, tako kot ne izbrati ime, kot je xyz ali kot x2f. Poskusi, da bi se ime, ki ima smisel. Na primer, če je to fakulteto, pravijo fakulteto. Če je funkcija, ki se dogaja, da pripravi nekaj, poimenujte ga pripravi. In potem imamo parametrov, ki se prav tako imenujejo argumenti, ki so kot viri, ki svoje delovanje potrebuje s kodo za opravljanje svojih nalog. Če želite izračunati fakulteto števila Verjetno boste morali imeti številko izračuna fakulteto. Eden od argumentov, ki jih boste morali število sam. In potem se dogaja, da nekaj storiti in vrne vrednost na koncu razen če je nična funkcija. Poglejmo primer. Če hočem napisati funkcijo, ki sešteje vse številke v vrsto števil, Najprej se je donosnost vrsta se bo int ker imam niz celih števil. In potem bom imela ime funkcije, kot sumArray, in potem se dogaja, da array samo, da int nums, in potem je dolžina niza, tako da vem, koliko številk moram povzeti. Potem sem moral inicializirati spremenljivko z imenom vsoto, na primer, za 0, in se vsakič, ko vidim element v matriki sem ga dodala na vsoto, tako da sem za zanko. Tako kot je rekel Lexi, vam int i = 0, i 0, potem je to pozitivno. Če je = 0, da potem je 0, in če je <0, potem je negativna. In druga počne, če pa če drugega. Razlika med njima je, da je ta dejansko dogaja, da preveri, če> 0, 0 <= 0 ali 3-krat, tako da, če imate številko 2, na primer, da se bo tu prišel in rekel if (x> 0) in to bo rekel ja, zato sem natisniti pozitiven. Toda čeprav vem, da je> 0 in je ne bo 0 ali <0 Še vedno sem storil je 0, je <0, tako da sem dejansko dogaja znotraj investicijskih skladov, ki sem jih ni bilo ker že vem, da ne bo izpolnjeval nobenega od teh pogojev. Lahko uporabite, če drugega, če drug izjavo. V bistvu pravi, da če je x = 0 tiskam pozitivno. Če je ne, bom tudi preizkusiti. Če je 2 ne bom za to. V bistvu, če sem imel x = 2, bi rekli, if (x> 0), ja, tako natisniti. Zdaj, ko vem, da je> 0, in da se prepriča, če 1. Jaz sploh ne gre za izvajanje tega kodeksa. Kodeks deluje hitreje, pravzaprav, 3-krat hitreje, če boste uporabili to. Prav tako spoznali in in ali. Ne bom šel skozi to, ker Lexi že govorila o njih. To je samo && in | | operaterja. Edino, kar bom povedal, bodite previdni, če imate 3 pogoje. Uporabljajte oklepaje, ker je zelo zmedeno, če imate bolezen in še eno, ali še eden. Uporaba oklepajev samo, da se prepričajte, da so vaši pogoji smisla ker v tem primeru, na primer, si lahko predstavljate, da je da bi se lahko prvi pogoj in ena ali druga ali 2 Pogoji, povezani v in ali tretja, zato bodi previden. In končno, smo se pogovarjali o stikali. Stikalo je zelo koristno, če imate spremenljivko. Recimo, da imate spremenljivke, kot n da je lahko 0, 1 ali 2, in za vsako od teh zadev boš za izvedbo naloge. Lahko rečemo izbrati spremenljivko, in to pomeni, da vrednost pa je kot value1 bom za to, potem pa sem prekinil, kar pomeni, da ne bom videti v kateri koli od drugih primerih ker smo že prepričan, da zadevo in lahko potem value2 in tako naprej, prav tako pa imajo privzeto stikalo. To pomeni, da če ne izpolnjujejo nobenega od primerov, ki sem jih imel da bom naredil kaj drugega, ampak to je opcija. To je vse za mano. Zdaj pa so Tommyja. V redu, to se bo Teden 3-ish. To so nekatere od tem bomo lahko zajemajo, kripto, obseg, nizi, in tako naprej. Samo hiter beseda o Kripto. Ne bomo, da kladivo te domov. To smo storili v pset 2, ampak za kviz poskrbite, da boste vedeli razliko med cesarjem in šifra šifra Vigenère, kako oba dela teh šifer in kako je za šifriranje in dešifriranje besedila z uporabo teh 2 šifer. Ne pozabite, da Cezarjeva šifra preprosto vrti vsak znak za enak znesek, pazite, da mod s številom črk v abecedi. In šifra Vigenère, na drugi strani pa se vrti vsak znak po drugi znesek, tako kot pravi Vsak lik zavrti s 3 Vigenère bodo menjavali vsak znak po drugi znesek glede na nekatere ključne besede kjer je vsaka črka na ključno besedo predstavlja nekaj drugačnega zneska zavrteti jasno besedilo, ki ga. 1. Naj govori o spremenljivo področje. Obstajata 2 različni tipi spremenljivk. Imamo lokalne spremenljivke, in te se bodo opredeljene izven glavne ali zunaj katerekoli funkcije ali bloka, in bo to dostopen kjerkoli v vašem programu. Če imate funkcijo, in v tej funkciji, je pa zanka velika globalna spremenljivka je dostopna povsod. Lokalna spremenljivka, na drugi strani pa je zajeta na mesto, kjer je določeno, da. Če imate funkcijo sem, na primer, imamo to funkcijo g, in notranjost g je spremenljivka y tukaj imenujejo, in to pomeni, da je to lokalna spremenljivka. Čeprav je ta spremenljivka y imenuje in to se imenuje spremenljivka y te 2 naloge Nimam pojma, kaj drug drugemu lokalne spremenljivke so. Po drugi strani pa je tu rečemo, int x = 5, in to je zunaj področja uporabe katerekoli funkcije. To je zunaj obsega glavni, tako da je to globalna spremenljivka. To pomeni, da znotraj teh 2 funkcij, ko sem rekel x - ali x + + Jaz sem dostopajo do istega x, s katerim je ta in ta y y so različne spremenljivke. To je razlika med globalne spremenljivke in lokalne spremenljivke. Kar se tiče oblikovanja, včasih pa je verjetno boljša ideja voditi lokalne spremenljivke, ko boste morda lahko saj imajo lahko kup globalnih spremenljivk zares zmedeno. Če imate kup funkcij, vse spreminja isto stvar Morda vam bodo pozabili, kaj če je ta funkcija naključno spreminja ta globalni, in to drugo nalogo, ne ve o tem, in ne dobite precej zmedeno, kot ste dobili več kode. Vodenje lokalne spremenljivke, ko boste morda lahko je samo dober dizajn. Polja, zapomni si, preprosto seznam elementov istega tipa. Znotraj industrije ne more imeti seznama, kot je 1, 2,0, zdravo. Mi samo ne more storiti. Ko smo se razglasi matriko C vsi elementi morajo biti istega tipa. Tukaj imam niz 3 cela števila. Tukaj imam dolžino niza, če pa sem samo razglasitvi te sintakse kje natančno, kaj vse elemente, ki so mi tehnično ni treba tega 3. Prevajalnik je dovolj pameten, da ugotovimo, kako velika naj bo matrika. Zdaj, ko hočem, da bi dobili ali pa nastavite vrednost matrike To je sintaksa za to. To bo dejansko spremeni drugi element matrike, saj se spomnite, številčenje se začne pri 0, 1 sploh ne. Če želim, da se glasi, da je vrednost lahko rečem kaj takega int x = array [1]. Ali pa, če želim nastaviti te vrednosti, tako kot delam tukaj, Lahko rečem, matrika [1] = 4. Ta čas dostop do elementov, ki jih njihov indeks ali na njihov položaj ali če so v polju, in seznam se začne pri 0. Mi lahko tudi nizi nizov, in to se imenuje večdimenzionalni array. Ko imamo večdimenzionalni array to pomeni, da lahko kaj takega vrstic in stolpcev, in to je le eden od načinov za ponazoritev tega, ali razmišljate o tem. Ko sem imel večdimenzionalni array to pomeni, da bom za začetek potrebovali več kot 1 Indeks ker če imam omrežje Samo pravim, kaj ste v vrstici nam ne da več. To je res samo dogaja, da nam seznam številk. Recimo, da imam ta niz tukaj. Imam niz imenovano omrežje, in sem rekel, da je 2 vrstic in 3 stolpcev, in zato je to eden od načinov, da vizualizacijo. Ko sem rekel, da želim, da bi dobili vsaj en sestavni del [1] [2] to pomeni, da zato, ker so vrstice in šele nato stolpci Bom skočil na vrstico 1, saj sem rekel 1. Potem bom prišel sem v stolpcu 2, in jaz bom dobil vrednost 6. Smiselno? Večdimenzionalni nizi, ne pozabite, so tehnično le niz polj. Mi lahko nizov nizi nizi. Mi lahko naprej, ampak res eden od načinov, da razmišljajo o Kako se je to določeno in kaj se dogaja, je, da ga vizualno v mreži, kot je ta. Ko smo mimo polja za funkcije, ki jih bomo obnašali malo drugače kot takrat, ko se peljemo redne spremenljivk, funkcij kot uspešno int ali float. Ko se peljemo v int ali char ali katerokoli drugo vrst podatkov sva si ogledal če je funkcija spremeni Vrednost te spremenljivke, da se spremembe ne bodo širijo navzgor da kliče funkcijo. Z matriko, na drugi strani pa se bo to zgodilo. Če omedlim v matriki do neke funkcije in funkcije, ki spreminja nekatere elemente, Ko sem prišel nazaj na funkcijo, ki jo imenuje moja matrika je zdaj tekoč, da je drugačen, in za to besednjak je nizi so opravili s sklicevanjem, kot bomo videli kasneje. To je povezano s tem, kako dela kazalci, kadar so ti osnovni podatkovni tipi, Na drugi strani pa so opravili z vrednostjo. Mi lahko zamislite, da so izdelavo kopije neke spremenljivke, nato pa poteka v kopiji. Ni važno, kaj počnemo s to spremenljivko. Kličoča funkcija ne bo vedel, da je prišlo do spremembe. Polja so malce drugačna v tem pogledu. Na primer, kot smo pravkar videli, glavno je le funkcija da lahko v 2 argumentov. Prvi argument za glavno funkcijo je argc ali več trditev, in drugi argument imenovan argv, in to so dejanske vrednosti teh trditev. Recimo, da imam program, imenovan this.c, in sem rekel, da je to, in bom teči to v ukazni vrstici. Zdaj prenesti v nekaterih trditev, da moj program se imenuje to, Lahko bi rekel kaj takega. / To je 50 cs. To je tisto, predstavljamo David narediti vsak dan na terminalu. Toda zdaj je glavna funkcija znotraj tega programa ima te vrednosti, tako da argc je 4. Mogoče je malo zmedeno, ker smo res le mimogrede v je 50 cs. To je samo 3. Ampak ne pozabite, da je prvi del argv ali prvi argument je ime same funkcije. To pomeni, da imamo 4 stvari tukaj, in prvi del se bo. / to. In bo ta predstavljen kot niz. Potem preostale točke, kar smo vnesli po imenu programa. Torej, tako kot prahi, kot bomo verjetno videli v pset 2, ne pozabite, da je niz 50 ≠ celo število 50. Torej ne moremo reči kaj takega, "int x = 3 argv". To je le ne bo imelo smisla, ker je to niz, in to je celo število. Torej, če želite spremeniti med 2, zapomni si, da bomo da je to čarobno funkcijo imenovano atoi. To traja niz in vrne celo število predstavlja znotraj tega niza. Torej, to je preprosto narobe, če bi na kvizu, Samo razmišljal, da bo ta samodejno pravilne vrste. Ampak samo vem, da ti bo vedno strune tudi če niz vsebuje samo celo število ali znak, ali lopatico. Torej, zdaj pa govorimo o teče čas. Ko imamo vse te algoritme, ki naredijo vse te nore stvari, postane zelo koristno vprašati vprašanje, "Kako dolgo traja?" Predstavljamo nekaj, kar ti da s asimptotična zapis. Torej to pomeni, da je - no, recimo, da damo algoritem nekateri res, res, res velik vložek. Želimo postaviti vprašanje: »Kako dolgo bo trajalo? Koliko korakov bo trajalo naš algoritem za vodenje v odvisnosti od velikosti vhodnih? " Torej, prvi način lahko opisali teči, ko je z velikim O. In to je naš najslabši časa vožnje. Torej, če želite razvrstiti array, in smo dali naš algoritem niz To je po vrstnem redu, ko bi moralo biti v naraščajočem vrstnem redu, da se bo v najslabšem primeru. To je naša zgornja meja v največji čas naš algoritem bo. Po drugi strani pa je to Ω gre za opis najboljšem primeru teče čas. Torej, če bi že urejen matriko za razvrščanje algoritem, kako dolgo bo trajalo, da ga rešiti? In to potem, opisuje spodnja meja za vodenje čas. Torej, tukaj je le nekaj besed, ki opisujejo nekatere skupne vožnjo krat. To so v naraščajočem vrstnem redu. Najhitrejši čas delovanja smo se imenuje konstantna. To pomeni, da ne glede na to, koliko elementov damo algoritem, ne glede na to kako velika je naša matrika, razvrščanje ali počne karkoli delamo z matriko bo vedno enako količino časa. Tako bomo lahko pomenijo, da samo z 1, ki je konstantna. Ogledali smo si tudi logaritemskem času izvajanja. Torej nekaj podobnega binarnega iskanja je logaritemska kjer smo zmanjšali težave v 1/2 vsakem trenutku in potem se stvari priti višje od tam. In če ste kdaj pišete O vseh faktorski algoritem, verjetno ne bi smeli upoštevati, da je to vaš dan službo. Ko smo primerjali vožnjo krat, da je pomembno imeti v mislih te stvari. Torej, če imam algoritem, ki je O (n), in nekdo drug je algoritem O (2n) so dejansko asimptotično enakovredni. Torej, če si predstavljamo, da je n velika številka, kot eleventy milijard: tako da, ko smo primerjali eleventy milijard ali kaj podobnega eleventy + 3 milijarde EUR, Nenadoma that 3 resnici ne naredi veliko razliko več. Zato bomo začeti razmišljati te stvari za enakovredne. Torej stvari, kot so te konstante tu, tam je 2 x tem, ali dodatkom 3, to so le konstante, in ti so padli gor. Torej, to je, zakaj vsi 3 te čase delovanja so enaki kot pravijo oni O (n). Podobno je, če imamo 2 ostalih časa delovanja, recimo O (n ³ + 2n ²), lahko dodamo + N + 7, potem pa imamo še čas delovanja, ki je samo O (n ³). še enkrat, to so ista stvar, saj to - to ni isto. To so iste stvari, žal. To je torej enaka, saj this ³ n bo prevladovala this 2n ². Kaj ni ista stvar je, če smo teči večkrat kot O (n ³) in O (n ²) ker je to ³ n je veliko večja od te ² n. Torej, če imamo eksponenti, nenadoma se to začne važno, ko pa smo pravkar ukvarjajo z dejavniki, kot smo tukaj, potem ne bo važno, ker so le, da bo izstopiti. Oglejmo si nekaj algoritmov, ki smo jih videli do sedaj in govori o svojem času izvajanja. Prvi način iščejo več na seznamu, ki smo ga videli, je bila linearna iskanje. In izvajanje linearnega iskanja je zelo enostavna. Pravkar smo imeli seznam, in bomo pogled na vsakem en element na seznamu dokler ne najdemo številko, ki jo iščete. To pomeni, da v najslabšem primeru, to O (n). In lahko v najslabšem primeru tukaj, če je element zadnji element, nato pa z uporabo linearne iskanje moramo gledati na vsako posamezno elementa dokler ne pridemo do zadnjega, da bi vedeli, da je bilo dejansko na seznamu. Ne moremo odreči na pol poti in reče: "To je verjetno ni." Z linearno iskanju moramo gledati na celotno stvar. Najboljši primer časa vožnje, na drugi strani pa je stalno ker je v najboljšem primeru je element, ki ga iščemo, je le prvi na seznamu. Torej se dogaja, da nam točno 1 korak, ne glede na to, kako velik je seznam če iščemo prvi element vsakič. Torej, ko iščete, ne pozabite, da ne zahteva, da se razvrstijo naš seznam. Ker smo preprosto bo, da si v vsakem sam element, in to sploh ni pomembno kaj bi ti elementi so noter Bolj inteligenten iskanje algoritem, ki je nekaj podobnega kot binarno iskanje. Ne pozabite, da je izvajanje binarnega iskanja je, ko boste da si na sredini seznama. In ker smo iskali na sredini, zahtevamo, da je urejen seznam ali pa ne veste, kje je sredina in moramo gledati kot celoten seznam, da ga najdejo, in potem na tej točki smo samo zapravljaš čas. Torej, če imamo urejen seznam, in smo našli na sredini, bomo primerjali sredino na element, ki ga iščemo. Če je previsoka, potem lahko pozabimo na desni polovici saj vemo, da če je naš element je že prevelik in vse na desni strani tega elementa je še večja, potem nam ni treba iskati tam več. Če je na drugi strani, če je naš element je prenizka, Vemo vse, kar je levo od tega elementa je tudi prenizka, tako da ne res smiselno, da tam videti, bodisi. Na ta način, z vsakim korakom in vsakič, ko se ozremo na sredini seznama, bomo zmanjšali naš problem na pol, ker se nenadoma vemo, Cel kup številk, ki ne more biti tisti, ki ga iščemo. V psevdokod bi to videti nekako takole, in ker smo rezanje seznam v pol vsak čas, naša najslabšem primeru teče čas skoči iz linearnega v logaritemsko. Torej imamo nenadoma prijavo v korakih, da bi našli element na seznamu. Najboljši primer teče čas, čeprav je še vedno stalno ker zdaj, recimo, da je element, ki ga iščemo, je vedno točna sredina prvotnega seznama. Tako smo lahko raste naš seznam tako velika, kot smo želeli, če pa element, ki ga iščemo, je na sredini, Potem je samo še, da se nam 1 korak. Torej, to je, zakaj smo O (log n) in Ω (1) ali stalna. Poglejmo resnici vodi binarno iskanje na tem seznamu. Torej, recimo, da iščemo element 164. Prva stvar, ki smo jih naredili, je najti srednjo vrednost tega seznama. Samo tako se zgodi, da je sredina se bo padec med temi številkami 2, tako da je le arbitrarno reči, vsakič, ko sredina spada med 2 številk kaj je samo zaokroži navzgor. Vedeti pa je treba, da poskrbite, da to počnemo vsak korak s poti. Tako bomo zaokrožili, in bomo rekli, da 161 je sredi našega seznama. Torej 161 <164, in vsak element, na levi strani 161 je tudi <164, tako da vemo, da to ne bo, da nam pomagajo na vseh , da začnete iskati tukaj, ker je element, ki ga iščemo, ne more biti tam. Torej, kaj lahko storimo, je, da lahko samo pozabiti, da je celoten levi polovici seznama, in zdaj mislijo samo z desno od 161 dalje. Torej, še enkrat, to je sredina, kaj je samo zaokroži navzgor. Zdaj 175 je prevelika. Torej vemo, da to ne bo nam pomagajo videti tukaj ali tukaj, tako da bomo lahko samo vrgel stran, in na koncu bomo zadeli 164. Vsa vprašanja v zvezi binarnem iskanju? Gremo naprej z iskanjem skozi že razvrščen seznam dejansko ob seznam številk, v poljubnem vrstnem redu in ponujanje tega seznama v naraščajočem vrstnem redu. Prvi algoritem smo pogledal je bil imenovan bubble sort. In to ne bi bilo enostavnejše od algoritmov smo jih videli. Bubble sort, ko pravi, da je vse 2 elementi v seznamu, so na svojem mestu, kar pomeni, da je večje število na levi strani manjše število, Nato se bomo, da jih swap, ker to pomeni, da bo seznam »Več razporejene", kot je bilo prej. In smo le, da bo ta proces nadaljevati znova in znova in znova dokler sčasoma elementi vrste balona na njihovo pravo mesto in imamo urejen seznam. Čas delovanja tega se bo O (n ²). Zakaj? No, saj v najslabšem primeru, da bomo lahko vse elemente in bomo na koncu ga primerja z vsakim drugim elementom v seznamu. Toda v najboljšem primeru imamo že urejen seznam, bubble sort je Samo šel skozi enkrat rekel "Ne. nisem naredil nobene zamenjave, zato sem naredil." Torej imamo najboljše sodno delovni čas Ω (n). Naj teče mehurček vrste na seznamu. Ali pa najprej, kaj je samo pogled na nekatere psevdokod res hitro. Želimo, da smo želeli, da bi spremljali, v vsaki ponovitvi zanke, spremljate na to, ali smo spremenili nobenih elementov. Torej, razlog za to je, bomo ustavi, ko nismo zamenjali nobenih elementov. Torej na začetku našega zanke nismo zamenjali ničesar, zato bomo rekli, da je lažna. Zdaj smo šli skozi seznam in primerjajte element i element i + 1 in če je tako, da je večje število na levi strani manjše število, potem greš samo, da jih swap. In potem se bomo, da se spomnimo, da smo zamenjali element. To pomeni, da moramo iti skozi seznam najmanj 1 več časa ker je stanje, v katerem smo se ustavili, ko je celoten seznam že urejen, kar pomeni, da niso dosegli nobenega zamenjavo. Torej, to je, zakaj naš pogoj tukaj je ", medtem ko so bili zamenjani nekateri elementi." Torej, zdaj pa je samo pogled na to tekmovanje v teku na seznamu. Imam seznam 5,0,1,6,4. Bubble sort se bo začela vso pot na levi strani, in to se dogaja za primerjavo i so elementi, tako med 0 in i + 1, ki je sestavni 1. To bo sicer tudi 5> 0, a zdaj 5 je na levi, tako da moram zamenjali 5 in 0. Ko sem jih zamenjal, kar naenkrat sem dobil to drug seznam. Zdaj 5> 1, zato se bomo, da jih swap. 5 ni> 6, tako da nam ni treba storiti ničesar. Toda 6> 4, tako da moramo zamenjati. Spet moramo teči skozi celoten seznam na koncu odkril da so v drugačnem vrstnem redu, jih bomo zamenjali, in na tej točki moramo teči po seznamu 1 več časa se prepričajte, da je vse v redu, in na tej točki vrste mehurčkov je končan. Drugačen algoritem za sprejetje nekaterih elementov, in njihovo razvrščanje je izbira sort. Ideja je, da se uredi izbire bomo vzpostaviti urejen del seznama 1 element naenkrat. In kako bomo to, da je z oblikovanjem levi segment na seznamu. In v bistvu je vsak - na vsakem koraku, da bomo lahko najmanjši element, ki smo jih ostalo ki ni bil razvrščen še, in bomo premaknili v to razvrščene segment. To pomeni, da moramo nenehno našli minimalno neurejen element in nato vzemite tega minimalnega element in ga zamenjali s koli levo Najbolj element, ki ni urejen. Čas delovanja tega se bo O (n ²), saj v najslabšem primeru moramo primerjati vsak element z vsakim drugim elementom. Ker smo si rekel, da če začnemo na levi polovici seznama, moramo iti skozi celoten desni segmentu najti najmanjši element. In potem spet, moramo iti čez celotno desno segment in nadaljuj več, da znova in znova in znova. To bo N, ². Bomo potrebovali za notranje zanke drugega za zanke kar kaže n ². V najboljšem primeru misli, recimo, da damo že razvrščen seznam; smo dejansko ne delajo nič bolje kot ² n. Ker je izbor sort ni mogel vedeti, da minimalni element je samo ena sem se zgodi, da bo gledal. Še vedno je treba prepričati, da je to pravzaprav minimalna. In edini način, da se prepričajte, da je minimalno, z uporabo tega algoritma, je pogled na vsako posamezno element znova. Torej res, če jo dal - če daš izbirnem razvrstite že urejen seznam, to ne bo naredil nič bolje, kot mu daje seznam, ki ni razvrščen še. Mimogrede, če se zgodi, da bo v primeru, da je nekaj O (nekaj) in omega nečesa, lahko samo rečem bolj na kratko, da je to θ nečesa. Torej, če ste videli, da pride do kamorkoli, to je tisto, ki samo pomeni. Če je nekaj theta n ², je tako velik O (n ²) in Ω (n ²). Torej, najboljši in najslabši primer, da ne bi razliko, algoritem bo naredil isto stvar vsak čas. Torej, to je tisto, kar bi lahko psevdokod za razvrščanje izbor izgledal. Mi smo v bistvu reči, da želim ponoviti čez seznam od leve proti desni, in na vsaki ponovitvi zanke, grem, da se premaknete minimalni element v ta izločen del seznama. In ko sem premakniti nekaj tam, nikoli nisem morali gledati na ta element ponovno. Ker je takoj, ko sem zamenjal element za na levi segment na seznamu, se razvrstijo it saj delamo vse, kar je v naraščajočem vrstnem redu z najnižjimi. Zato smo rekli, v redu, smo v položaj I, zato moramo gledati na vse elemente na desni strani i, da bi našli minimum. Torej to pomeni, da želimo videti od i + 1 do konca seznama. In zdaj, če je element, ki ga trenutno gledaš je manjše od našega vsaj do sedaj, ki Zapomnite si, da začenjamo minimalno dol da se samo ne glede na del smo trenutno, bom domnevala, da je minimalna. Če najdem element, ki je manjša od tiste, potem bom rekel, v redu, No, sem našel nov minimum. Bom se spomnite, kjer je bila ta najnižja. Torej, zdaj, ko sem šel skozi te pravice, nesortirani segment, Lahko rečem, da bom zamenjal minimalni element z elementom, ki je v položaj I. To se dogaja, da zgraditi svoj seznam, moj razporejene del seznama, od leve proti desni, in ne bomo nikoli treba gledati na element znova, ko je v tem delu. Ko smo jo zamenjali. Torej, kaj je teči izbiro vrste na tem seznamu. Modri ​​element tukaj se bo i in rdeča element se bo minimalna element. Torej, jaz se začne vso pot na levi strani seznama, tako da v 5. Zdaj moramo najti minimalno neurejen element. Tako smo rekli 0 <5, tako da je 0 moja nova minimalna. Ampak ne morem se ustaviti, ker čeprav lahko spoznamo, da je najmanjša 0, moramo teči z vsakim drugim elementom seznama in se prepričajte. Torej 1 je večja, je večja 6, 4 večji. To pomeni, da ko gledaš vse te elemente, sem se določijo 0 je najmanjše. Torej bom, da bi zamenjali 5 in 0. Ko sem zamenjal, da bom dobil nov seznam, in vem, da mi nikoli ni treba pogledati v tistem 0 znova ker ko sem ga zamenjal, sem ga sortirajo in smo končali. Zdaj je prav tako se zgodi, da je modra element je ponovno 5, pa moramo gledati na 1, je 6 in 4 določiti, 1 je najmanjši element minimalna, tako da bomo zamenjali 1 in 5. Ponovno moramo pogledati - primerjava 5 do 6 in 4, in bomo zamenjali 4 in 5, in končno, primerjati ti 2 številke in jih menjajo, dokler ne bomo dobili naše urejen seznam. Vsa vprašanja v zvezi neke izbire? Ok. Naj se premaknete na zadnjo temo tukaj, in da je rekurzija. Rekurzija, zapomni si, je to res stvar, meta, kjer funkcija večkrat kliče sama. Torej, na neki točki, medtem ko je naš fuction je večkrat klical samega sebe, mora obstajati neki točki, na kateri smo se ustavili sebe kliče. Ker če tega ne bomo storili, potem smo le, da bo še naprej, da to stori vedno, in naš program, se le ne bo odpovedala. Temu pravimo stanje osnova drži. In osnovna pravi, namesto da bi funkcijo spet Grem vrne neko vrednost. Torej, ko smo vrnili vrednost, smo ustavili sebe kliče, in lahko ostali razpisov, ki smo jih do sedaj tudi vrne. Nasproti osnovne zadeve je rekurzivni primer. In to je, če želimo, da bo še en klic funkcije, ki jih trenutno noter In mi verjetno, čeprav ne vedno, želeli uporabiti različne argumente. Torej, če imamo funkcijo imenovano f in f pravkar klical da trditev 1, in mi kar naprej kliče f (1), f (1), f (1), in to samo zato, da se zgodi, da argument 1 pade v rekurzivni primeru, še vedno ne bo konec. Tudi če imamo osnovno zadevo, moramo poskrbeti, da sčasoma bomo zadel tisto osnovno zadevo. Ne samo da med bivanjem v tem primeru rekurziven. Na splošno, ko bomo klic, bomo verjetno dogaja, da imajo drugačno argumenta vsakič. Tu je zelo preprosta rekurzivna funkcija. Tako bo ta izračun fakulteto števila. Do vrha tukaj imamo osnovno zadevo. V primeru, da n ≤ 1, ne bova poklicati fakulteto znova. Bomo ustaviti, smo le, da bo vrnil nekaj vrednosti. Če to ni res, potem bomo zadeli naš rekurzivni primer. Obvestilo tukaj, da ne bomo samo opozarjajo fakulteto (n), ker to ne bi bilo zelo koristno. Mi jo bomo imenovali fakulteto nekaj drugega. In tako si lahko ogledate, če bomo na koncu opraviti faktorsko (5) ali nekaj, bomo klic fakulteto (4) in tako naprej, in na koncu bomo zadeli osnovno zadevo. Torej, to je v redu. Poglejmo, kaj se zgodi, ko smo dejansko vodijo to. To je sklad, in recimo, da se bo glavni poklicati to funkcijo s trditvijo (4). Torej, ko vidi in fakulteto = 4, se bo fakulteta sama poklicala. Zdaj pa kar naenkrat imamo fakulteto (3). Torej te funkcije se bodo še naprej naraščale, dokler na koncu smo zadeli naš osnovni primer. Na tej točki se vrne vrednost tega pa je donos (nx Vrnjena vrednost tega), Vrnjena vrednost tega je nx vrnjeno vrednost tega. Končno moramo zadeti nekaj več. Na vrhu tukaj, smo rekli vrnitev 1. To pomeni, da ko se bomo vrnili to številko, lahko to pop off dimnika. Torej, to fakulteto (1) se opravi. Ko se vrne 1, ta faktorski (1), se ta vrne vrnitev na 1.. Vrnjena vrednost tega, ne pozabite, je nx vrnjeno vrednost tega. Tako nenadoma, ta človek ve, da želim, da se vrnete 2. Torej, ne pozabite, vrne vrednost tega je ravno nx vrnjena vrednost tukaj. Sedaj lahko rečemo, 3 x 2, in končno, tu lahko rečemo, To je le, da bo lahko 4 x 3 x 2. In ko bo ta vrne, pridemo do ene same notranjosti celo glavnih. Vsa vprašanja v zvezi rekurzije? V redu. Torej ni več časa za vprašanja, na koncu, zdaj pa bo Joseph pokrivajo preostale teme. [Joseph Ong] V redu. Torej, zdaj, ko smo se pogovarjali o recursions, kaj je govoril malo o tem, kaj je nekako združiti. Spajanje vrsta je v bistvu še en način razvrščanja seznam številk. In kako deluje, je z neke spajanja imate seznam, kaj moramo storiti, je rečemo, kaj je to v delih 2 polovici. Mi bomo prvi vožnji z zlivanjem spet na levi polovici, potem bomo teči z zlivanjem na desni polovici, in da nam zdaj 2 polčasih, ki so razvrščeni, in zdaj bomo združiti tiste polovici skupaj. To je malce težko razumeti, ne da bi na primer, da bomo šli skozi predloge in videli, kaj se bo zgodilo. Torej, začnete s tega seznama, smo ga razdelili na 2 polovici. Vodimo z zlivanjem na levi polovici prvega. Torej, to je leva polovica, zdaj pa jih vodijo skozi ta seznam še enkrat , ki pride mimo vrste v spajanja, potem pa poglej, spet, na levi strani tega seznama in vodimo z zlivanjem na njej. Sedaj pa pridemo na seznam 2 številk in zdaj leva polovica je le 1 element časa, in ne moremo razdeljen seznam, ki je le 1 element na pol, tako da smo pravkar rekel, ko bomo imeli 50, ki je le 1 element, je to že urejeno. Ko bomo končali s tem, lahko vidimo, da smo lahko premaknete na desni polovici tega seznama in 3 tudi sortirajo in tako zdaj, ko so razporejene obe polovici tega seznama bomo lahko pridruži se te številke skupaj. Torej gledamo na 50 in 3, 3 je manjši od 50, tako, da gre v prvi in ​​nato 50 pride noter Zdaj naj bi to storili, bomo šli nazaj na ta seznam in jih razvrstite, da je desna polovica. 42 je, da je lastna številka, tako da je že urejeno. Zdaj smo primerjali teh 2 in 3 je manjši od 42, tako da dobi dal na eni strani, Zdaj dobi dal v 42 in 50 postane dal noter No, to je razvrščenih, gremo vso pot nazaj na vrh, 1337 in 15. No, zdaj si na levi polovici tega seznama; 1337, je sam po sebi, tako da se sortirajo in enako velja 15 let. Torej, zdaj združimo ti 2 številk vrste, ki prvotni seznam, 15 <1337, tako, da gre v prvi, potem gre noter 1337 In zdaj smo razporejene v obeh polčasih prvotnega seznama gor. In vse, kar morate storiti, je združevanje teh. Upamo, da bomo v prvih 2 številke s tega seznama, 3 <15, zato gre v nekakšen niz prvi. 15 <42, tako, da gre noter Zdaj, 42 <1337, ki gre noter 50 <1337, tako da gre noter in ugotovili, da smo pravkar vzel 2 številke izven tega seznama. Torej ne bomo samo izmenično med 2 seznamov. Mi smo samo gledaš na začetku, in mi smo vzeli element To je manjši, nato pa ga je dala v naši matriki. Zdaj pa smo združili vse polovic in smo gotovi. Vsa vprašanja v zvezi z zlivanjem? Ja? [Študent] Če je razdeljeno na različne skupine, zakaj ne bi ti samo po delih once in imate 3 in 2 v skupini? [Ostali nepojmljivega vprašanje] Razlog - tako je vprašanje, zakaj se ne moreva ju združi v tej prvi fazi, ko smo jih imeli? Zato smo lahko storite, začnite na levi večina elementov na obeh straneh, in nato z manjšo ribo in jo dal v, je, da vemo, da so ti Posamezne liste so razvrščeni naročil. Torej, če gledam na levi večini elementov obeh polčasih, Vem, da si bo najmanjši elementi teh seznamov. Torej, da jih bom lahko dal v najmanjši element kotov pri tem velikem seznamu. Po drugi strani pa, če gledam na tiste 2 seznamov v drugem nivoju tam, 50, 3, 42, 15 in 1337, so tisti, ki niso razvrščeni. Torej, če gledam na 50 in 1337, bom dal 50 v mojem seznamu prvi. Ampak to ni res smiselno, ker 3 je najmanjši element od vseh teh. Torej je edini razlog, da smo lahko to združuje korak je, ker so naše sezname že urejeno. In zato moramo dol vse do dna ker ko smo imeli samo eno številko, veste, da je enotna številka sama po sebi je že razvrščenih seznam. Kakšno vprašanje? Ne? Kompleksnost? No, vidite, da je na vsakem koraku pa je konec številke, in lahko delimo na seznam v dnevniku 1/2 n-krat, ki je, če dobimo to n x n dnevnik zahtevnost. In boste videli, najboljši primer za spajanje vrste, n log n, in je prav tako se zgodi da je v najslabšem primeru, ali Ω tam je tudi n log n. Nekaj, da v mislih. Gremo naprej, gremo na nekaj super osnovno datoteko I / O. Če ste pogledal Scramble, boste opazili, smo neke vrste sistema kjer bi lahko napisali, da log datoteko, če ste prebrali kodo. Pa poglejmo, kako lahko to storite. No, imamo ovrednotenj, ki jih lahko mislili, da samo printf, ampak samo tiskanje v datoteko namesto, in zato je f na začetku. Ta vrsta kodo tu gor, kaj počne, je, kot ste verjetno videli v Scramble, gre skozi 2-dimenzionalni tisk diod ven po vrsticah, kaj so številke. V tem primeru printf natisne na svoj terminal ali kot temu pravimo standardni izhod oddelka. In zdaj, v tem primeru je vse, kar morate storiti, je zamenjati z printf ovrednotenj, povej, kaj jo želite natisniti, in v tem primeru je samo natisne do te datoteke namesto da bi ga natisnili na vaše terminal. No, potem se postavlja vprašanje: Kje bomo dobili to vrsto datoteke iz, kajne? Smo šli pa se prijavite na ta ovrednotenj fuction, vendar nismo vedeli, od kod je prišel. No, na začetku kode, kar smo imeli je bil ta kos kode tukaj, ki v bistvu pravi, da imenuje odprta datoteka log.txt. Kaj moramo storiti, potem je, da moramo zagotoviti, da se datoteka dejansko začela uspešno. Zato bi bilo ne za več razlogov, nimate dovolj prostora na vašem računalniku, na primer. Torej je vedno pomembno, preden to storite vse operacije z datoteko da preveri, ali je bila ta datoteka odpre uspešno. Torej, kaj je to, da je trditev, da fopen, no, lahko se nam odpre datoteko na več načinov. Kaj lahko storimo, je, da lahko peljemo je w, kar pomeni, da prepišete datoteko, če že izhodi, Mi lahko opraviti A, ki jih dodajte na konec datoteke, namesto da bi ga preglasil, ali pa lahko določite r, kar pomeni, dajmo odpreti datoteko samo za branje. Torej, če se program poskuša spreminjati datoteke, kričati na njih, in ne dovolite, da to storite. Nazadnje, ko sva končala z datoteko, končali dela operacije na to, moramo prepričati, da smo zaprite datoteko. In tako na koncu svojega programa, boste, da gredo še enkrat To datoteko, ki ste jo odprli, in šele zapreti. Torej, to je nekaj pomembno, da se prepričajte, veš. Torej, ne pozabite, da lahko odprete datoteko, potem lahko pišete na datoteko, ne operacije v datoteko, nato pa boste morali zapreti datoteko na koncu. Vsa vprašanja v zvezi osnovne datoteke / I? Ja? [Student vprašanje, nerazumljiv] Prav tukaj. Vprašanje je, kje je ta datoteka log.txt zdi? No, če si ji log.txt, jo ustvarja v isto mapo, kot izvedljive. Torej, če Menda - >> [Student vprašanje, nerazumljiv] Da. V isti mapi, ali v istem imeniku, kot jo imenuješ. Zdaj spomin, kup in kup. Torej, kako je spomin določena v računalniku? No, lahko si predstavljate spomin kot nekakšno tega bloka tukaj. In v spomin imamo, kar se imenuje kopico obtičal tam, in kup, ki je tam. In kup raste navzdol in stack raste navzgor. Tako kot Tommy omenjeno - oh, no, in smo te druge segmente 4, ki bom v 2. - Kot je Tommy povedal že prej, saj veš, kako se imenujejo njegove funkcije in klic med seboj? Gradijo to vrsto dimnika okvirja. No, če je glavna zahteva foo, dobi foo dal na kup. Foo poziva, bar se postavimo na sklad, in da dobi dal na sklad kasneje. In ko se vrnejo, dobijo vsak vzletelo sklada. Kaj vsaka od teh mest, in spomin držite? No, na vrhu, ki je del besedila, ki vsebuje program sam. Torej strojno kodo, to je tam, ko pripravijo svoj program. Nato vsak inicializiran globalnih spremenljivk. Torej imate globalne spremenljivke v programu, kot pravite, a = 5, da dobi dal v ta segment, in prav na podlagi, da imate nezaceto globalnih podatkov, ki jih je le int, vendar ne boste rekli, da je enaka nič. Zavedaj se, to so globalne spremenljivke, zato so zunaj glavnega. Torej to pomeni, da vse globalne spremenljivke, ki so prijavljene, vendar se ni inicializiran. Torej, kaj je v kup? Spomin razdelijo z malloc, ki jih bomo dobili v malo. In končno, z dimnika imate lokalne spremenljivke in bi vse funkcije, ki jih zahtevajo v katerem koli od njihovih parametrov. Zadnja stvar, ne boste res moral vedeti, kaj storiti spremenljivke okolja, ampak vsakič, ko zaženete program, je povezano nekaj, kot je to je uporabniško ime osebe, ki je potekal program. In to se dogaja, da je nekako na dnu. V zvezi s pomnilniških naslovov, ki so šestnajstiških vrednosti, vrednosti v zgornjem začetku na 0, in gredo vso pot navzdol do dna. V tem primeru, če ste na 32-bitnem sistemu naslov na dnu se bo 0x, nato af, ker to je 32 bitov, kar je 8 bitov, in v tem primeru 8 bitov ustreza 8 šestnajstiških števk. Torej, tukaj boste morali, kot so, 0xffffff, in tam boste imeli 0. Torej, kaj so kazalci? Nekateri izmed vas morda ni zajeta v točki pred tem. vendar smo si šel čez to v predavanju, tako da kazalec je samo podatkovni tip trgovin, ki, namesto da bi neke vrste vrednosti, kot so 50, shranjuje naslov neke lokacije v pomnilniku. Kot tisti spomin [nerazumljiv]. Torej v tem primeru, kar smo se, da imamo kazalec na celo število ali int *, in vsebuje Ta šestnajstiški naslov 0xDEADBEEF. Torej, kaj imamo, je, zdaj, ta kazalec kaže na določene lokacije v spominu, in da je samo, vrednost 50 je v tem pomnilniško mesto. Na nekaterih 32-bitnih sistemih, v vseh 32-bitnih sistemov, kazalci traja do 32 bitov ali 4 bajte. Vendar pa, na primer, na 64-bitnem sistemu, kazalci so 64 bitov. Torej, to je nekaj, kar boste želeli obdržati v mislih. Torej, na koncu-bitni sistem, kazalec je konec bitov dolgo. Kazalci so nekako težko prebavljive brez dodatnih stvari, tako da je šel skozi primer dinamično dodeljevanje pomnilnika. Kaj dinamično dodeljevanje pomnilnika naredi za vas, ali tisto, čemur pravimo malloc, vam omogoča, da dodeli neke vrste podatkov zunaj nabora. Torej so ti podatki nekako bolj trajna v času trajanja programa. Ker, kot veste, če ugotovi x notranjost funkcije, in da funkcija vrne, ne boste več imeli dostopa do podatkov, ki so shranjeni v x. Kaj kazalci storimo, je, da nam shrani spomin ali shranjevanje vrednosti v drugem segmentu pomnilnika, to je kup. Zdaj, ko se vrnemo iz funkcije, dokler imamo kazalec na to mesto v pomnilniku, potem kaj lahko storimo, je, da lahko samo pogled na vrednote tam. Oglejmo si primer: To je naš spomin postavitev znova. In imamo to funkcijo, glavni. Kaj pa je - prav tako preprosto, kajne? - Int x = 5, ki je samo spremenljivka na stack v glavni. Po drugi strani pa je zdaj izjavljamo kazalec, ki pokliče funkcijo giveMeThreeInts. In zdaj gremo v to funkcijo in smo ustvarili novo žetonov okvir za to. Vendar pa v tem okviru dimnika izjavljamo, int * temp, ki mallocs 3 števil za nas. Torej bo velikost notr nam, koliko bajtov je to int je, in malloc nam omogoča, da veliko bajtov prostora na kup. Torej v tem primeru, smo ustvarili dovolj prostora za 3 cela števila, in kup je pot do tja, zato sem prišla na podlagi višje. Ko končamo, smo prišli sem gor, morate samo 3 ints vrne, in vrne naslov, v tem primeru več kot če je ta spomin. In smo postavili kazalec = stikalo, in tam imamo samo še en kazalec. Toda kaj, da se funkcija vrne kup tukaj in izgine. Torej temp izgine, vendar smo še vedno ohranili naslov, kjer tiste 3 cela so znotraj omrežja. Torej, v tem sklopu so zajeta kazalci za lokalno zloženega okvirja, ampak spomin, na katerega se nanašajo, na kup. Ima to smisel? [Študent] Lahko ponovite? >> [Joseph] Da. Torej, če se vrnem samo malo, boste videli, da je temperatura dodeljena nekaj pomnilnika na kup up there. Torej, ko je funkcija, giveMeThreeInts vrne ta sklad tu bo izginila. In z njim vseh spremenljivk, v tem primeru je to namig, da je bila dodeljena v okviru zloženi. To bo izginila, ker pa smo se vrnili temp in smo postavili kazalec = temp, kazalec se zdaj dogaja s točko isto mesto kot spomin na temp bil. Torej sedaj, čeprav smo izgubili, da lokalni temp kazalec, še vedno ohranjajo spomin naslov, kar je bilo kaže na notranjo stran te spremenljivke kazalca. Vprašanja? To je lahko nekako zmedeno temo, če še niste šli preko njega v oddelku. Mi lahko, bo vaš TF definitivno šel nad njo in seveda bomo lahko odgovorili na vprašanja Na koncu pregleda seji za to. Ampak to je neke vrste kompleksno temo, in imam več primerov, ki se bodo prikazala , ki bo pomagal pojasniti, kaj pravzaprav so kazalci. V tem primeru kazalci so enakovredni nizi, tako da sem lahko uporabite ta kazalec se ista stvar kot int array. Torej sem indeksiranje na 0 in spreminjanje prvo celo število za 1, spreminjanje 2. celo število za 2 in 3. celo do 3. Torej, več o kazalca. No, spomnim Binky. V tem primeru smo namenili kazalec, ali pa razglasi kazalec, ampak na začetku, ko sem razglasila kazalec, da je ne kaže, da kjerkoli v pomnilniku. To je samo smeti vrednosti znotraj njega. Torej, ne vem, če je to kazalec, ki kaže na. To je naslov, ki je pravkar napolnjene z 0 in 1, kjer je bila prvotno prijavljena. Ne morem storiti ničesar s tem, dokler nisem poklical malloc na njej in potem mi daje malo prostora na kup, kjer sem lahko del vrednosti znotraj. Potem spet, ne vem, kaj je notri tega spomina. Torej prva stvar, ki sem storiti, je preveriti, ali je sistem imel dovolj pomnilnika da mi vrne celo število 1 na prvem mestu, zato to počnem preveriti. Če kazalec nič, kar pomeni, da ni dovolj prostora ali druge napake, zato sem izhod iz mojega programa.  Ampak, če vam uspe, zdaj lahko uporabim ta kazalec in kaj je * kazalec pa je naslednji, kjer je naslov , kjer je ta vrednost, in določa, da je enak 1. Torej, tukaj, smo preverjanje, če je pomnilnik obstajala. Ko veš, da obstaja, lahko vanjo kakšno vrednost želite, da bi v njej, v tem primeru 1. Ko bomo končali z njim, morate sprostiti, da kazalec ker moramo priti nazaj v sistem, ki pomnilnika, ki ste ga zahtevali na prvem mestu. Ker računalnik ne ve, kdaj bomo končali z njo. V tem primeru smo to izrecno povedal, v redu, smo opravili s tem spomin. Če kak drug postopek, ki ga potrebuje, nekateri drugi program potrebuje, vas prosimo, da gredo naprej in ga sprejeti. Kaj lahko naredimo je, da lahko samo dobil naslov lokalnih spremenljivk na množici. Torej, int x je v notranjosti zloženega okviru main. In ko smo uporabi ta znak, to in izvajalec, kaj počne, je je potrebno x in x je le nekaj podatkov v pomnilniku, vendar pa ima naslov. To je nekje nahaja. Torej ga kliče in x, kaj pa je to nam daje naslov x. S tem delamo kazalec točko, kjer je x v spominu. Zdaj smo pač nekaj podobnega * x, bomo dobili 5 nazaj. Zvezda se imenuje ga Dereferenciranje. Slediš naslov in dobiš vrednost njej shranjene tam. Kakšno vprašanje? Ja? [Študent] Če ne naredite 3-konico stvar, pa še vedno prevedite? Da. Če ne naredite 3-kazalec stvar, bo to še vedno v pripravi, pa ti bom pokazal, kaj se dogaja v 2. in brez dela, da To je tisto, čemur pravimo pomnilnika. Nisi dati sistemu nazaj svoj spomin, tako da po nekaj časa program bo kopičijo pomnilnika, ki je ne uporabljate, in nič drugega lahko uporabite. Če ste že kdaj videli Firefox z 1,5 milijona kilobajtov na vašem računalniku, v upravitelja opravil, da je to, kar se dogaja. Imate pomnilnika v programu, da oni ne obdelujejo. Torej, kako je kazalec aritmetična deluje? No, kazalec aritmetična je neke vrste, kot so kazala v matriko. V tem primeru imam kazalec, in kaj sem naredil je, da sem lahko kazalec točko prvega elementa tega sklopa 3 celih da sem dodeljena. Torej, kaj zdaj delam, star le kazalec spremeni prvi element na seznamu. Star Kazalec 1 točke več kot tukaj. Torej kazalec tja, je kazalec 1 tukaj, kazalec 2 je tukaj. Torej samo dodal 1 je ista stvar kot se premikajo po tem polju. Kaj moramo storiti, je, ko mi kazalec 1 dobiš naslov tukaj, in da bi dobili vrednost, ti dal zvezdo od celotnega izraza ga dereference. Torej, v tem primeru, sem o prvo mesto v tem polju na 1, 2. mesto na 2. in 3. mesto na 3. Torej, kaj počnem tukaj je jaz tiskanje naše kazalec 1, ki mi daje samo 2. Zdaj sem povečevanje kazalca, tako da kazalec kazalec enak 1, , ki jo premika naprej. In sedaj, če sem izpisal kazalec 1, kazalec 1 je trenutno 3, , ki je v tem primeru natisne 3. In da brez nečesa, kazalec, ki sem ga dal mora biti obrnjena na začetku niza, ki sem ga dobil nazaj iz knjižnične funkcije malloc. Torej, v tem primeru, če bi bil jaz poklical 3 tukaj, to ne bi bilo prav, ker je v sredini polja. Moram odšteti priti do izvirnega mesta začetna 1. mesto, preden ga lahko rešil. Torej, tukaj je bolj vključeni primer. V tem primeru, bomo dodeljevanje 7 znakov v znakovni niz. In v tem primeru, kar delamo, je, da smo v prvem zanka 6 od njih, in smo jih nastavite do Z. Torej, za int i = 0, i> 6, i + +, Torej, kazalec + bom samo nam, v tem primeru, kazalec, kazalec 1, 2 kazalca, kazalec 3, in tako naprej in tako naprej v krogu. Kaj bo naredil, je, da postane ta naslov, dereferences, da bi dobil vrednost, in spremembe, ki vrednost na Z. Potem pa na koncu ne pozabite, da gre za niz, kajne? Vse niti je končala z ničelno zaključku značaja. Torej, kaj sem naredil je kazalec 6 sem dal noter null Terminator značaja In zdaj, kaj sem v bistvu počne tukaj je printf izvedbenih za niz, kajne? Torej, če ne zdaj, ko je printf je dosegel konec niza? Ko zadene null zaključni znak. Torej, v tem primeru moj originalni kazalec kaže na začetku tega polja. Tiskam prvi znak ven. Jaz ga premaknite na eno. Sem izpisal znak ven. Sem ga premakni se. In jaz vztrajati početje to, dokler ne pridem do konca. In zdaj je konec * kazalec se bo to dereference in dobili null zaključni znak nazaj. In tako sem pa zanka deluje le, če je ta vrednost ni null zaključku značaj. Torej, zdaj sem izhod iz te zanke. In tako, če odštejemo 6 tega kazalca, Grem nazaj vse do začetka. Ne pozabite, da to delam zato, ker moram iti na začetek, da bi ga rešil. Torej, vem, da je veliko. Kakšno vprašanje? Prosim, ne? [Student vprašanje nerazumljivo] Lahko rečemo, da glasneje? Žal mi je. [Študent] Na zadnji prosojnici tik preden se je sprostila kazalec, kje ste dejansko spreminja vrednost kazalca? [Joseph] Torej, tukaj. >> [Študent] V redu. [Joseph] Torej, imam kazalec minus minus, desno, ki premika stvari nazaj 1, potem pa sem jo osvobodil, ker je ta kazalec je treba opozoriti, da na začetku niza. [Študent] Ampak to ne bi bilo potrebno bi ga ustavil po tej progi. [Joseph] Torej, če sem ustavil po tem, bi se to šteje pomnilnika, ker nisem teči brezplačno. [Študent] I [nerazumljivo] po prvih treh vrsticah, kjer ste imeli kazalec 1 [nerazumljivo]. [Joseph] Aha. Torej, kaj je vprašanje tam? Žal mi je. Ne, ne. Gremo, gremo, prosim. [Študent] Torej, ne boš spremembi vrednosti kazalca. Ne bi moral storiti kazalec minus minus. [Joseph] Da, točno tako. Torej, ko sem naredil kazalec 1 in 2 kazalec, Ne delam kazalec kazalec enaka 1. Torej, kazalec ostane samo kaže na začetku niza. Šele ko sem naredil plus plus, da določa vrednost kazalca nazaj noter, da je dejansko premika to skupaj. V redu. Še vprašanja? Tudi, če je to nekakšna velika, bo to zajeto v seji. Vprašajte svojega poučevanja kolegi o tem, mi lahko odgovorite na vprašanja na koncu. In ponavadi ne maramo, da to stori minus stvar. To mora zahtevati me sledenja, koliko sem odmik v polje. Torej, na splošno, to je samo, da pojasni, kako deluje aritmetične kazalec. Toda tisto, kar ponavadi radi naredili je, da smo želeli ustvariti kopijo kazalca, in potem bomo uporabili kopijo, ko smo se gibljejo v nizu. Torej, v teh Če uporabljate izvod natisniti celoten niz, vendar pa ne bi bilo treba storiti, kot kazalec minus 6 ali spremljate, koliko smo se preselili v to, samo zato, ker vemo, da je naša prvotna točka še vedno opozarjajo na začetku seznama in vse, kar smo spremenili je to kopija. Torej, na splošno spremeni kopije izvirnega kazalca. Ne poskušajte nekako podobno - Ne spremeni izvirne kopije. Poskus, da spremeni samo kopije originala. Torej, ste opazili, ko se peljemo niz v printf vam ni treba dati zvezdo pred njim, kot smo naredili z vsemi drugimi dereferences, kajne? Torej, če si natisnete celoten niz% s pričakuje, da je naslov, in v tem primeru kazalca ali v tem primeru, kot je niz znakov. Znaki, char * s, in polja so ista stvar. Kazalec je znakov, znakov nizi so ista stvar. In tako je vse, kar moramo storiti, je minil v kazalec. Mi ne bi bilo treba prenesti v kot kazalec * ali kaj podobnega. Torej, nizi in kazalci so ista stvar. Ko delaš nekaj podobnega x [y] tukaj za matriko, kaj počne pod pokrovom je je rekel, ok, to je znak array, tako da je kazalec. In tako x so ista stvar, in kaj počne, je to dodaja y na x, kar je isto, kot korak naprej v spominu, da je veliko. In zdaj x + y nam daje neko naslov in smo dereference naslov ali slediti puščico da če se ta lokacija v pomnilniku je in smo dobili vrednost iz tega mesta v pomnilniku. Torej, da gre za dve popolnoma ista stvar. To je samo skladenjsko sladkor. Prav to isto stvar. Oni so samo različni syntactics za seboj. Torej, kaj lahko gre narobe s kazalci? Recimo, veliko. Ok. Torej, slabe stvari. Nekatere slabe stvari, ki jih lahko storite, ne preverja, če je vaš klic malloc vrne null, kajne? V tem primeru vas prosim, da sistem mi dali - kaj je to številka? Kot 2000000000 krat 4, saj je velikost celo število je 4 bajte. Jaz sem ga prosil za podobno 8000000000 bajtov. Seveda je moj računalnik ne bo mogel, da mi toliko nazaj pomnilnika. In mi ni preveril, če je to nič, tako da, ko smo poskušali ciljne datoteke tam - sledite puščice, da če se bo - nimamo ta pomnilnik. To je tisto, čemur pravimo Dereferenciranje null kazalec. In to v bistvu povzroči, da segfault. To je eden od načinov, kako lahko segfault. Drugi slabe stvari, ki jih lahko storite - oh dobro. To je bilo Dereferenciranje null kazalec. Ok. Drugi slabe stvari - no, da se določi, da si dal ček tam da preveri, ali je kazalec null in izhod iz programa, če se zgodi, da malloc vrne null kazalec. To je xkcd strip. Ljudje razumejo zdaj. Tako nekako. Torej, spomin. In sem šel čez to. Mi smo kliče malloc v zanki, ampak vsakič, ko pravimo malloc smo izgubili sledi, kje je ta kazalec kaže na, zato, ker smo ga clobbering. Torej, prvi razpis za knjižnične funkcije malloc mi daje spomin tukaj. Moje kazalec napotke za to. Zdaj, jaz ne osvobodi, tako da zdaj kličem malloc znova. Zdaj pa opozarja tukaj. Zdaj moj spomin je obrnjen tukaj. Miške tukaj. Miške tukaj. Ampak sem izgubil občutek za naslove vseh spomina več tukaj, da sem dodeljena. In zdaj nimam nobenega sklicevanja na njih več. Torej, ne morem osvoboditi izven te zanke. In tako, da se določi nekaj takega, Če ste pozabili prostega pomnilnika in dobiš to pomnilnika, Moraš osvoboditi spomina znotraj te zanke, ko ste končali z njo. No, to je tisto, kar se dogaja. Vem, da je veliko vas sovražijo to. Ampak zdaj - yay! Dobiš kot 44.000 kilobajtov. Torej, ti je obtičalo na koncu zanke, in da se bo tako osvobodil na pomnilniško vsakič. V bistvu, vaš program nima več pomnilnika. In sedaj nekaj drugega, kar lahko naredite, je sprostiti nekaj pomnilnika, ki ste jih prosil za dvakrat. V tem primeru boste malloc nekaj, spremenite svojo vrednost. Si ga osvobodi enkrat, ker si rekel, da si naredil z njim. Ampak potem smo ga osvobodili še enkrat. To je nekaj, kar je zelo slabo. To se ne bo sprva segfault, ampak ko pa kaj ne je dvojno osvoboditev s tem pokvari vaš kup strukturo, in boste izvedeli nekaj več o tem, če se odločite, da razred, kot CS61. Ampak v bistvu po ko je vaš računalnik se bo zbunjeni kaj pomnilniške lokacije, kjer in kadar je shranjen - kjer se podatki shranjujejo v pomnilnik. In tako sprostila kazalec dvakrat je slabo, če ne želite storiti. Druge stvari, ki lahko kaj narobe, ne uporabljate sizeof. Torej, v tem primeru boste malloc 8 bajtov, in to je isto kot dveh celih števil, kajne? Torej, to je popolnoma varen, vendar je to? No, kot Lucas govoril o različnih arhitektur, cela, so različnih dolžin. Torej, na aparatu, ki ga uporabljate, cela okoli 4 bajte, ampak na nek drug sistem, bi morali biti 8 bajtov ali pa morda 16 bajtov. Torej, če sem to številko tukaj, ta program bi lahko delovala na napravi, vendar to ne bo dovolj pomnilnika za dodelitev na nekaterih drugih sistemih. V tem primeru, to je tisto, kar mora upravljavec sizeof uporablja. Ko pravimo sizeof (int), kaj to počne, je  nam daje velikost celo število v sistemu, da program teče. Torej, v tem primeru bo sizeof (int) vrne 4 na kaj takega aparata, in zdaj bo to 4 * 2, kar je za 8, ki je le, koliko prostora je potreben za 2 cela števila. Na drugem sistemu, če je kot 16 int bajte ali 8 bajtov, to je le, da bo dovolj, da se vrnete bajta za shranjevanje tega zneska. In končno, konstrukti. Torej, če boste želeli shraniti Sudoku deska v spomin, kako bi lahko to storimo? Morda si mislite o kot spremenljivko za prvo stvar, spremenljivka za drugo stvar, spremenljivka za tretjo stvar, spremenljivka za četrto stvar - slabo, kajne? Torej, ena izboljšava si lahko na vrhu je to, da bi 9 x 9 matriko. To je v redu, kaj pa če bi želel povezati tudi druge stvari s svetom sudoku všeč, kaj težavnost ladji, ali, na primer, kaj je tvoj rezultat je, ali koliko časa je trajalo, da bi rešili ta forum? Torej, kaj lahko naredite, je, da lahko ustvarite struct. Kaj sem rekel je, v bistvu sem opredelitev te strukture tukaj, in sem opredelitvi Sudoku odbora, ki je sestavljen iz krovu, ki je 9 x 9. In kaj ima to je namig na ime ravni. Prav tako ima X in Y, ki so koordinate, kjer sem zdaj. To je tudi čas, porabljen [nerazumljiv], in ima skupno število potez sem vnesenih doslej. In tako se v tem primeru lahko združite cel kup podatkov v eno samo strukturo namesto da bi ga ob tako plujejo okoli v tako različnih spremenljivk da ne morem slediti. In to nam omogoča imeti samo lepo sintakso za nekakšno sklicevanje različne stvari znotraj tega struct. Pravkar sem lahko naredil board.board, in sem dobil Sudoku krovu nazaj. Board.level, dobim kako težko je. Board.x in board.y mi koordinate, kjer bi moral biti v vozilu. In tako sem dostopu, kar imenujemo polja v struct. Ta opredeljuje sudokuBoard, ki je tip, ki ga imam. In zdaj smo tu. Imam spremenljivko, imenovano "svet" v sudokuBoard tipa. In sedaj lahko dostopate do vseh področij, ki sestavljajo to strukturo tukaj. Vsa vprašanja v zvezi s konstrukti? Ja? [Študent] Za int x, y, ste prijavljeni tako v eno vrstico? >> [Joseph] Aha. [Študent] Torej, bi si naredil, da z vsemi od njih? Tako kot v X, Y vejica čas, da skupaj? [Joseph] Ja, lahko zagotovo storiti, toda razlog, zakaj sem dal x in y na isti liniji - in vprašanje je, zakaj smo lahko le to na isti liniji? Zakaj ne bi samo dal vse to na isti liniji x in y sta povezani med seboj, in to je samo stilistično bolj pravilno, v smislu, saj je združevanje dveh stvari na isti liniji ki se je kot vrsta se nanašajo na isto stvar. In jaz sem ti razdeliti narazen. To je samo ime nekaj. Je funkcionalno nobene razlike kakršno. Kakršna koli druga vprašanja o konstrukti? Določite lahko Pokédex s struct. Pokémon je število in ima pismo, lastnika, tip. In potem, če imate niz Pokémon, lahko tvorijo Pokédex, kajne? V redu, v redu. Torej, vprašanja o konstrukti. Tisti, ki so povezane s konstrukti. Končno, GDB. Kaj GDB kaj si naredil? To vam omogoča, da debug vaš program. In če niste uporabili GDB, jaz bi priporočil gledal kratek in šele tekoč, kaj GDB je, kako delate z njim, kako bi ga uporabili, in ga preizkusite na programu. In kaj GDB lahko storite, je, da omogoča pavzo [nerazumljivo] do vašega programa in praktično črta. Na primer, želim izvedbo pavzo na liniji kot 3 svojega programa, in medtem ko sem na liniji 3 lahko natisnete vse vrednote, ki so tam. In tako pravimo, kot premori v skladu se temu lahko rekli dajanje odmerka ob tej črti in potem bomo lahko natisnete spremenljivk stanja programa v tistem času. Mi lahko potem od tam korak skozi program line-by-line. In potem bomo lahko ogledate na stanje dimnika v tistem času. In tako, da se uporabi GDB, kar počnemo, je pravimo Jek na datoteko C, vendar pa moramo dajati-ggdb zastavo. In ko bomo končali s tem smo pravkar teče gdb ustvarjeno datoteko izhod. In tako boste dobili nekaj podobnega maso besedila, kot je ta, ampak res vse, kar morate storiti, je tip v poveljstvih na začetku. Break glavni postavlja Prelomne na glavne. Seznam navaja 400 vrstic kode, okoli vrstice 400. In tako se v tem primeru lahko samo pogledajo okoli sebe in rekel, oh, Želim, da nastavite prekinitveno točko na liniji 397, ki je v tej vrstici, in potem je vaš program teče v ta korak in da se bo zlomil. To se dogaja, da ustavite tam, in si lahko natisnete na primer vrednost nizka ali visoka. In tako obstaja kup ukazov, kar morate vedeti, in bo to slideshow šel na spletni strani, tako da, če si želite referenčna ti je všeč ali pa jih postaviti na vaš goljufija stanja, vas prosimo. Kul. To je bilo Kviz Pregled 0, in bomo ostal, če imate kakršnakoli vprašanja. V redu.  [Aplavz] [CS50.TV]