[Predvaja glasba] DAVID J. Malan: To je všeč novinec seminar danes. V REDU. Tako zelo deževno ven. To kaže, da se zgodi ob sredah, vendar toliko bolj priložnost za vprašanja danes. Torej začnimo dejansko s filmom v samo trenutek. Ampak bomo začeti grandly kot vedno. To je CS50, in to je konec 4. tedna. Torej, če ste kdaj gledali TV ali film, kjer tam je nekaj računalniški strokovnjaki in policija, ali FBI, ali nekatere agencija poskuša ujeti nekaj Nasprotnik, no, ste verjetno slišali izraz "povečanje" s katerimi je ta tehnik nekako čudežno približa neskončno daleč videti kriminalci identitete ali številka registrske tablice v celo šimrom ogledalom ali lesket od nekoga oči. Torej res, dajmo si oglejte nekaj takih prizorov iz Hollywooda. [VIDEO PREDVAJANJE] -OK, Zdaj pa je dobil dober pogled na vas. -Drži. Run to nazaj. -Počakaj minuto. Pojdi desno. -Ni, Zamrzniti. -Celozaslonski način. -OK, Zamrzniti. Omejilo gor na tem, boste? -Vector V naprej, da tip z zadnjim kolesom. -Zoom V prav tukaj na tem mestu. -z Pravo opremo, slika bi se lahko razširil in oster. -Kaj je to? -To Program izboljšava. -Ali Ste jasno, da se vsaka? Ne vem. Naj ga izboljšali. -Enhance Oddelek A6. -I Okrepljeno podrobnosti, in-- Mislim, da je dovolj za izboljšanje, ga spustite na mojem zaslonu. -I Povečala odsev v očeh. -Naj Je ta teče skozi video opremo. -Edgar, Lahko okrepi to? -Drži se. -Nikoli Delali na tem razmisleku. Odsev -Someone je. -Reflection. -Ni Je odsev moškega obraza. -V Refleksija. -Ni Je odsev. -Zoom V na ogledalu. Saj vidim odsev. -Ali Si izboljšati podobo od tu? Si ga -Ali povečati tukaj? -Ali Ga izboljšati? Lahko si ga povečati? -Ali Moramo okrepiti to? -Ali Ga izboljšati? -Drži Na sekundo, bom okrepila. -Zoom V na vratih. -Times 10. -Zoom. -Vseliti se. -Več. -Wait, Stop. -Stop. Ga -Pause. -Rotate Nam 75 stopinj okoli navpičnice, prosim. -Stop. Pojdi nazaj na delu o vratih, spet. -Got Slikovno ojačevalec, ki lahko bitno sliko? Hej, morda bomo lahko uporabite Pradeep Sen metoda za prikaz v oknih. -To Programska oprema je stanje tehnike. -V Lastnih vrednosti je izklopljen. -z Desno Kombinacija algorithm-- Sprejeti odprava -Je algoritmi na naslednjo stopnjo, in sem jih lahko uporabite za krepitev tega fotografijo. -Lock Na in povečavo Z-osi. -Enhance. -Enhance. -Enhance. -Freeze In okrepiti. [END PREDVAJANJE] DAVID J. Malan: V redu, tako da vsi od teh so dejansko besede. Oni samo nanizani združijo v Tako da je dejansko ni smiselna. In v resnici, CS50 in tečaji všeč skuša uničiti veliko TV in filmi zate. Ker če ti računalniški strokovnjaki so rožljanje off izrazov in rekel fancy stvari, kot lastni vektorji, in z-os, in poljubno število drugih dejansko bolj tehnični izrazi, oni so res samo zavezovanja Besede skupaj vse prepogosto. Je, da je eden od naših upanju, da kot stranski učinek jemanja tečajev kot je ta, bo več ljudi v svet dejansko lahko tehtajo v in samo vedno tako malo vplivajo na Kakovost in natančnost teh filmov? V resnici pa si oglejte realnosti. Torej, tukaj je fotografija osebje Mary, eden od naših učnih štipendistov. In domnevam, ona je sum nečesa. In vendar, tam je kanček nekatere dokaz v svojem očesu, ali v odsevu njenih očala. No, če smo storili natanko tako, kot v filmih predlaga, pri čemer smo zoom in "okrepi", to je, koliko informacij V Marijinega obraza ko posnamete sliko s tem originalni ločljivosti. In v resnici, si lahko ogledate te pike. In ti so, kaj so imenovane pik, P-I-X-E-L-S, ki je le kvadratni tipično da je pika, ki sestavlja sliko. In nazaj v dan, in dejansko tudi je danes z nekaterimi današnjega LED televizorji ali LCD televizorji, če imaš ena v svoji sobi ali doma, če greš gor zelo blizu njega, in še posebej, če je nekoliko starejši TV, si verjetno lahko celo videli te pike in to je tisto, sestavite sliko. In ni več informacij, kot to. Lahko bi "okrepi", v smislu glajenje stvari znova in nekako sklepalo vrste, nekako kar Barva mora biti zraven Marijine oči tako da je dejansko ni tako pixelated. Ampak, če sem vedno povečave, tam je slab človek v svojem očesu. Všeč, da je vse informacije, ki jih imajo. Ne morete ustvariti Podatki iz nič. Tam je samo končna število bitov tam. Torej Problem Set 4, kjer imate priložnost igral s tovrstno svetu. V problema Set 4, boste raziskati svet grafike in forenzike, in dejansko napisati kodo da povrne izgubljenih slik. Boste napisati kodo, ki manipulira obstoječih slik in končno razumem, kaj je dogaja pod pokrovom. In se izkaže, da je dejansko ni vse tako zapleteno. Na primer, če smo želeli predstavljajo smeška kjer teh črnih pik, ali pa te črne pike, dobro, smo lahko enostavno predstavljajo jim kot resnično bitmap. In če ste že kdaj slišali, da izraz bitmap, morda zdaj začne narediti danes malo več smisla. Mi že vemo, kaj malo je. To je 0 ali 1. In zemljevid je le nekaj kot kos papirja ki vam daje navodila in ima morda mrežo x in y koordinatah. Torej, tukaj je bitmap. To je zemljevid bitov katerim 1 je očitno tekoč predstavljata belo slikovno točko, in 0 se dogaja, da predstavlja črno piko. Vendar pa bi prav gotovo flip okoli. To pa res ni važno, tako Dokler smo dosledni. In tukaj je, kako v binary-- notranjosti pomnilnika računalnika, ali celo v notranjosti datoteke na trdem drive-- lahko shranite najpreprostejši smeška slik. Toda kaj smo, seveda, manjka v tej sliki? Color, kajne? To je očitno naslednji korak ali povečanje za izboljšanje tega z barvo. Torej, žal s samo en bit, 0 ali 1, smo lahko predstavljajo barvo. To je lahko rdeče ali modre ali črna ali bela ali zelena ali roza, ali kateri koli parov barv. Ampak zavoljo enostavnosti je, da bomo le domnevati, črni in beli barvi. Torej, kaj logično potrebujemo, če želimo želijo izvajati barvo v sliki? Kaj moramo storiti? Like, če je omejevalni dejavnik tukaj je, da z enega bita lahko samo predstavljata dve stanji, 0 ali 1, bel ali črn, kaj želiš, da storim? OBČINSTVO: Več podatkov. DAVID J. Malan: Več bitov, yeah več podatkov, več bitov. In, seveda, to je točno, kako barvne slike so zastopani. Namesto uporabo enotnega bit, A 0 ali 1 za vsak piksel, vsaka pika, ki ste jo pravkar uporabljate več. Morda uporabite 8, morda, bolj pogosto uporabite 24, in res, v Problem Set 4, se igrate z datoteko format, ki uporablja 24 bitov običajno. Vendar je večina od vas verjetno seznanjeni z JPEG. Če ste kdaj sprejeti fotografija na vašem telefonu, ali naložili ali videla nekaj na Facebook ali Flickr, vsaka številka spletnih strani, foto osnovi, ki ste jih verjetno videl sliko JPEG prej. In se je izkazalo, da je to datoteka format bomo uporabili v PSet 4, s katerim boste morali obnoviti slike ki sem jih pomotoma izbrisali od A poškodovan pomnilniško kartico v fotoaparatu, če hočete. In se izkaže, da je, čeprav JPEG je precej sophisticated-- to je veliko bolj prefinjene od črnih in belih pik smo videli pred nekaj trenutki, kajti tam je dejansko fancy algoritmi, ki se uporabljajo za stiskanje JPEG, tako da lahko imajo res lepo, kakovost slike, vendar z uporabo relativno malo bitov. In bomo prišli nazaj stiskanje pred dolgo. Izkazalo se je, da je prvi trije bajti v image-- JPEG ne glede na to, kaj ste posneli fotografijo of-- so vrednosti 255, 216, 255. Z drugimi besedami, če vas le glej, da se vzorec bitov, tukaj zastopali trije bajtov ali 24 bitov skupaj, z veliko verjetnostjo lahko sklepamo, da iščete na njem je to prva tri bajtov JPEG. In to je tisto, kar je znano kot podpisu JPEG. Veliko formatov tam ponavadi začnejo z določenimi vzorci 0s in 1s, tako da Windows in Mac OS, in iOS, in Android vem, kakšne datoteke, ki jih so poleg tako imenovanega spisa razširitev, ki imajo veliko datotek. Če ste .jpg, da je en namig na računalnik. Torej Dovolite zdaj poglej tole malo bolj tehnično. Vemo decimalko Sistem je 0 do 9. Vemo, binarna 0 in 1. In če mislite, da nazaj na PSet 0, smo imeli ste Rvati, za malo, nekaj imenuje šestnajstiški, kjer imate 16 številk, namesto 10 ali namesto 2. In te številke, po dogovoru, so številke od 0 do 9 in nato do f, kjer je f predstavlja, kaj decimalno število, prav tako hitro sanity ček? Torej, 15. In mora predstavljati 10, samo z narava naročanja, ki sem jih dal. To je samo poljubna konvencija, ampak to je precej standardno. Torej, če se ozremo na tem vzorcu treh bytes-- Dovolite Samo začeti gledati v skladno s tem, kako računalniški znanstveniki na splošno poglej in razmišljati o datotekah. Lahko zagotovo pomislite datoteke v 0s in 1s in desetiško, ampak v resnici, smo nagnjeni k uporabi binarno ali bolj običajno hexadecimal-- nazaj od PSet 0. Torej mi predlagamo, da 255, 216 in 255 so le ti vzorci 0s in 1s. In to lahko preverite, če ste želite storiti math od 0 tedna. Ampak, za zdaj, le domnevati, da je to res drži. Pravkar sem prepisovati tri decimalna številke kot tri binarne vrednosti. Zdaj, kaj bom storiti, je preprosto dodajte nekaj belega prostora, samo zavoljo berljivost je. In obvestilo, da sem šele tekoč premakniti stvari narazen. Torej, pred, po, pred, po. Delam nič zanimivo drugo kot le širi stvari tako da obvestilo vsak niz osmih bitov je zdaj dva kompleta štirih bitov. To je koristno, ker heksadecimalno je še posebej v modi ker vsak šestnajstiški mestna 0 skozi f, ali natančneje 0 do 15, lahko predstavimo z natanko štiri bitov. Z drugimi besedami, v šestnajstiškem če vas želijo predstavlja 0, to je samo 0000, štiri ničle. In če želite, da predstavljajo 15, to je 1111, kar je štiri bitov. In če vam matematika, če je to tisti kraj, to je 16s mesto, da se dogaja, da you-- namesto da se dogaja to-- žal, v binarno, da se dogaja, da vam 15, tisti kraj, dvojke mestu, štiric in osmice mesto. Torej mi predlagamo, da se ta niz štirih bitov na levi je tisto, kar bomo, da pokličete f. To je največje število, ki ga lahko predstavlja s štirimi bitov. In smo že vedeli iz šestnajstiško, f je največja številka v šestnajstiški. Imava še eno f tam, dva več tam. In za zdaj, vzemite na veri da sem naredil math pravico in da levo polovico tistih bitov, 1101, je ista stvar kot d šestnajstiško. In desno roko, 1000, je le 8. In da je eden je težko videti, kajne? 8 represents-- je prav pod tem osmice mestu. Torej imamo eno v stolpcu osmic in nič v štirih, dvojke in enice. Torej, zdaj bolj konvencionalno, ljudje se nagibajo pisati šestnajstiških števk, kot je ta, ste jih pravkar Mljackati skupaj, in potem jih predpono 0x. To ne pomeni nič drugega kot vizualni namig na human-- tukaj prihaja hexadecimal value-- ker morda drugače ne bo očitno. Kar pomeni, navsezadnje, da vzorec ničel in enic, ali vzorec heksadecimalno številke ekvivalentno, da ste bodo začeli iskati V Problem Set 4 this-- ter Problem Set 4 spec bodo hodili ste skozi to v več detail-- toda zavedati kot nekakšno skrivnostno, kot je to morda videti na prvi pogled, boste lahko videli to veliko. In v resnici tudi v GDB je razhroščevalnik smo uvedli v ponedeljek Dan uvaja v PSet 3, se dogaja vam pogosto kažejo šestnajstiških vrednosti samo zato, ker so bolj konvencionalne kot decimalno ali binarni V svetu računalnikov. Zdaj kaj je dal to v kontekst. Mnogi od vas bi to zapomniti slika tukaj, ki je prišel iz česa? Vista, tako da tudi prej, kot je da, Windows XP naredil to prvenec. Torej je to lepa pokrajina. In v resnici, če suniti okrog online-- Mislim, da je članek Wikipedia, kjer je nekdo zelo presenetljivo šel ven našel to mesto v svetu, ustanovljen njegov fotoaparat ravno prav place-- in ta danes izgleda like-- vendar to je točno isto nastavitev. Ta slika, čeprav je v datoteki format se imenuje bitna, b-m-p. In bomo vzeli super Bežen pogled na kaj to pomeni. Ampak bitmap je le drugačen način predstavljajo podobe še vedno uporabljajo pik v 0s in 1s, na koncu. Toda na hiter pogled, da ima bolj zanimivo podpis na začetku spisa. To ni samo tri bajtov, ne obstaja cel kup vzorcev bajtov ki so vnaprej določene pomene. Na primer, nekje v Prvih nekaj bajtov bitmap slike se bo z velikostjo slika, je širina slike, višina slike, zato uporabne metapodatke, če hočete. Koristne informacije, da je Photoshop ali katere koli grafičnem programu, ki ga uporabljate lahko dejansko skrbi. Torej, več o tem v Problem set 4, vendar je to Samo reči, da Na koncu dneva vsi formati datotek, ki jih že uporabljajo za years-- Microsoft Word datoteke, Številke datoteke, datoteke Excel, poljubno število datotečnih formatov da bi imeli nekateri znana končnica datoteke so le 0s in 1s pod njim pokrovom. In ljudje so se odločili, kaj konvencij, kaj vzorci 0s in 1s predstavljajo Word datoteka versus datoteko Excel, versus poljubno število drugih formatih. Torej, v PSet 4, boste imeli priložnost igrati s tem. Ampak kaj to pomeni, da imajo struct. To je pravzaprav lepo segue zdaj v C, ki je le nekaj za dodatne funkcije, ki Vam ni pogledal še. To je zelo majhen jezik in eden od lepo funkcije okoli C je struct. Na primer, če vas želel represent-- dovolimo da ste želeli, da imajo spremenljivke, ki predstavlja študent v nekem programu. Morda ste pisali tečaj Program za registracijo, ali jedro nakupovanje Orodje, ali nekaj takega. Kaj so koščki podatkov, povezanih študent, ki pride na misel? Tako kot študent je zastopana s katere vrednosti? Ja? Imate ime kot študenta. Kaj drugega tipični študent? OBČINSTVO: [neslišno] DAVID J. Malan: Torej, žal. OBČINSTVO: Age. DAVID J. Malan: An starost ali rojstni dan enakovredno, ja. Kaj drugega? OBČINSTVO: ID številka? DAVID J. Malan: Torej številke ID, morda telefonsko številko, morda domu ali hišo, ali višja šola, ali nekaj takega. Poljubno število kosov podatkov, morda imate v imeniku je tisto, kar bi lahko določite študenta. Torej, če smo želeli, da to stori, v kodi, bomo morda narediti nekaj preprostega, kot je ta. Morda bomo imeli program tako, da ima recimo, int main (praznino). In če želim predstavljata študent, da imam, na primer, niz se imenuje ime za tega študenta, niz pozval domu za tega študenta, Mogoče int imenuje ID za tega študenta. In ker sem z vrvico, I morali iti nazaj in dal gor CS50.h. Mogoče bom potreboval stdio.h. Zato mi dovolite, preemptively storiti tisti, in sem dogaja, da to imenujemo student.c za zdaj in shranite to. In zdaj ne morem narediti nekaj, s temi spremenljivkami. In smo le, da bo napisal da kot komentar v pseudo kodo, ker to ni zanimivo kaj storimo za zdaj. OK, tako da je to program, ki nekako shranjuje študenta. Kaj želim storiti, če sem želite shraniti dve študente? Torej, moj prvi instinkt se dogaja da bo vse v redu, počakaj malo, če imam še en študent, zakaj ne jaz pač niz ime 2, niz domu 2, int ID2. In smo naredili Gone po tej cesti pred in kaj je naša rešitev, kar se zdi biti nekakšen hekerske copy paste delo tu? OBČINSTVO: Matrika. DAVID J. Malan: Ja, bi lahko uporabili celo paleto. Right to zelo hitro postane okoren. Moraš nekako samovoljno začeti poimenovanje vseh teh spremenljivkah. In ti, človek, morali voditi skladbo, da OK NAME2 ustreza z dorm2 ustreza ID2. To samo postane nered. Torej, to je veliko lažje, odpokličejo od pred nekaj tedni, samo da bi zmerjali niz in nam morda dajejo trije izmed njih. In potem pa imamo niz dorms in imajo tri od tistih, ali s konstantno, int ids in imajo tri od teh. Ampak tudi zdaj ta občutek malo površen, kajne. Govorimo o študentov in še Res sem stanovanje na nizki ravni Podrobnosti o izvajanju. Študent je ime in domu in ID. Zakaj samo ne morem razglasi spremenljivko imenuje študent in poklicati to je to. In če želim še en študent, Zakaj ne bi samo call it t. Ali pa, če želim cel kup študentov, zakaj ne sem povedati, da sem imel cel razred študentov, in to je tri izmed njih. Z drugimi besedami, zakaj ne morem priti z mojo lastno vrsto podatkov, ki se imenuje Študenti, znotraj katerih je ime, je ID, ki je na domu, je poljubno število drugih področjih. In se izkaže, vas more storiti prav to. Torej C ima to funkcijo, imenovano struct. To je jezik, funkcija, ki nam omogoča, da naredite točno to. Grem, da gredo naprej in odpirajo structs.h kjer bomo videli po definiciji študenta. Izkazalo se je - in to je še enostavnejši od tistega, ki vključuje ID pred nekaj trenutki. Če želite, da bi prišli do vaša domača vrsta podatkov, in poleg ZU, in zoglenelega in float in vse te druge, ki obstajajo, lahko storite tako, da dobesedno pisanje typedef struct, potem nekateri zaviti oklepaji, znotraj katerega ste Seznam spremenljivk, ki jih želite povezujejo s tem novim podatkov po meri tip kot ime in domu, in nato po zavitih oklepajih daš ime za nov podatkovni tip. Tako, na primer, študent. In kaj je zdaj lepo o tem je, da če se ozremo na ustrezno oznako, konvencija, prvi od vseh, je, da to v datoteki imenovani nekaj dot h, datoteke glave, ki imamo ne začel uporabljati sebe preveč. Ampak bomo za začetek uporabljajo zelo malo zdaj. In kaj lahko storimo s tem, v končni fazi, v teh nekaj vrstic kode se razglasi točno to vrsta podatkov, študent. In zdaj pa si ga uporabljate. Bom zdaj šel v datoteka z imenom structs1.c. In vzemimo si na Nekaj ​​značilnosti tukaj. Torej stvari, tu je večinoma poznajo, in bomo prišel nazaj na to, kar se ne pozna vsak trenutek. To je seveda tudi moja header datoteke, ki je nov, kot tudi, razen PSet 3, kjer odpoklic, imamo helpers.h. Torej boste morda spomni #include helpers.h. Zakaj čeprav sem z uporabo narekovajev namesto kotnih oklepajih? Kdaj izbrati med njimi? Skoraj vedno sem se zdi, uporabljati kotne oklepaje. In potem, kar naenkrat na linija šestih Jaz sem z uporabo dvojne narekovaje. Zakaj bi to bilo? Ja? OBČINSTVO: [neslišno] DAVID J. Malan: To je dejansko, kaj? OBČINSTVO: To je v vašem IDE. DAVID J. Malan: Ja, da je v moji dejanski IDE. In naj ne živijo na IDE, saj da je samo orodje, ki sem uporabo. To je po mojem tok imenik, posebej. Torej structs.h je moja lastna datoteka ni nameščen v IDE, v sam operacijski sistem, namesto, da je v mojem trenutnem imeniku. Torej konvencija je, če želite vključiti svoj header datoteko, samo uporabite dvojne narekovaje. Kaj pravimo to stvar v vrstica 8, na splošno? To je kaj? #define nekaj. To predstavlja konstante, kajne? Če želite imeti vrednost v vašem programu da uporabljate celota kup časov, to je dober dogovor, da se faktor ven, jo razglasi, s simbolom sekljalni opredeliti, nato pa po dogovoru, v vseh velike črke word-- čeprav to ni nujno potrebno, vendar to je človeška konvencija izkoristiti konstante tako da skoči ven na vas visually-- prostor in potem je vrednost hočeš biti enakovredna nenehnega imenom. Ne podpičje, vendar si preprosto upoštevajte, da je vzorec tam. Torej, kaj sem počel v tem dejanskem kodo. Torej, dajmo si oglejte glavni program tukaj. V vrstico 12, ker sem so vključeni structs.h, Sedaj imam čudežno v mojih odstranjevanje nov podatkovni tip. Nimam samo dostopa do int, in char in float, in niz, in modre in drugi. Imam zdaj dostop do podatkovni tip študent. Torej, v vrstico 12, sem združevanje dveh ideas-- eno podatkovni tip po meri in dva, uporabo array. In tako v tem programu, če Hočem, da dejansko podpirajo trije različni študenti v mojem programu, sem lahko preprosto reči, da mi spremenljivko imenovane študentov, pri čemer vsaka je študentov tipa, ki je moj tip podatkov po meri. In, še posebej, daj mi tri od teh v moji array. Torej, zdaj, kaj naj storimo v tem programu? Tukaj je samo za zanko ponavljanjem od 0 do 3, ker je to kakšna je vrednost študentov. Jaz sem samo da bi od uporabnika Daj mi ime študenta. In nato v vrstici 17, smo imajo večinoma poznajo linijo. Imamo starega prijatelja GetString na desni strani. In kaj kos sintakse je očitno nov, če ste nikoli programirati v C pred, in nikoli niso uporabili konstruktov? Ja? OBČINSTVO: The .name. DAVID J. Malan: The .name. Toda to ni preveč preskok, ker zdaj študenti oklepati i vam daje študentu i-th. In če želite, da se potopite znotraj te strukture, ste pravkar uporabite eno obdobje in nato ime spremenljivke znotraj, ali premoženje v notranjosti, ki želite, da bi dobili dostop do. Podobno je potem, če sem potem morala spodbuditi uporabnik, daj mi študenta domu, lahko podobno shranite, da niz v spremenljivki domu notranjosti te študentske strukture. In zdaj se stvari malo izmišljeno. In to se dogaja, da poiščete na morda veliko dokaj kmalu. Ampak boste videli to veliko bolj v PSet 4, tako da je samo pogled na to zdaj. Izkazalo se je, da je v skladu s 23 38, kaj misliš, da sem morda delaš? Sem odstranili pripombe za danes, ampak različici kode na spletu za sklicevanje ima vse komentarje. Kaj mi zdi, da se delaš? OBČINSTVO: Shranjevanje datoteke z vsemi informacije, ki jih uporabnik vnese. DAVID J. Malan: Ja, točno, to je nov način da smo videli dva, Druga značilnost C, s katerim sem lahko ustvarite svoje lastne datoteke. Tako daleč, skoraj vsak program, ki ste jih napisal, je brez državljanstva. Takoj, ko je to storjeno teče, to je to. Ni spomin ali spomin nanj. Ni shranjene datoteke. Ampak, če bi želeli shranite vnos, ki ima se je zgodilo, tako kot v igri ali program kot je ta, se je izkazalo, da lahko to storijo. In boste videli to bolj v PSet 4 in v oddelku. Toda ta linija 23 v bistvu ustvari datoteko imenovano students.csv. In morda so to prej videl. Tudi če ste nikoli študiral CS prej, CSV je z vejico ločen spremenljivke. To je kot zelo slab človek je različica Excelove datoteke, kar pomeni, da ga je mogoče odpreti v Excelu in Apple številkah, in ima vrstice in stolpce. Ampak to ni lastniški format, kot so Microsoft ali Apple. To je le nekaj vejic ločuje vrednote, ki jih bomo videli v trenutku. In vzemite ugibati. V vrstici 23, v zelo konec, moj drugi argument s to novo funkcijo imenovano f odprta za odprto datoteko je w. Kaj bi w pomenijo? Ja? OBČINSTVO: To vam omogoča, da pišete v spis? DAVID J. Malan: Omogoča pišete na datoteko. Torej je nekaj variant da bomo lahko priključite tukaj. Ampak, če si želite prebrati datoteka, da je pogled na to in ga prebral v spominu, vas samo uporabo quote citata "r". Če želite napisati na datoteko, uporabite quote citata "w". Tam je tudi priložila in Nekaj ​​drugim Če želite spremeniti obstoječe datoteke. Zdaj bomo, da vidim to stvar, potem pa se bomo vrnili na linijo 24. NULL, se je izkazalo, je posebna vrednota, ki se lahko vrne z določenimi funkcijami če je nekaj šlo wrong-- če datoteka ne obstaja, če ste zmanjka pomnilnika, ali kup drugih napak. Ampak za zdaj, kaj je samo domnevati, da to je le konvencionalno preverjanje napak. Tu v vrstici 26, sem ponavljanjem od 0 do 3 nad vsemi mojimi študenti. In to je vrsta sortiranje nove funkcije, fprintf, ampak vzemite ugibati. Če printf je samo print formatirano niz, Kaj fprintf verjetno pomenilo? OBČINSTVO: Natisni v datoteko. DAVID J. Malan: Tiskanje formatiran niz v datoteko. To je tisto, kar dodatno f sredstvo je datoteka. In novi prvi argument mora biti spremenljivka, ki predstavlja datoteko. Potem smo samo še format Niz tako kot printf. In čeprav je to sintaksa je novo, je to samo pomeni priključite na ime študenta, plug-in v študentskem domu, nato pa z fclose, zaprite datoteko. In potem lastly-- to je novo in bomo prišli nazaj na to Pred long-- sem sprostitev študent iz razlogov, da se je zgodilo tam zgoraj obstaja. Vendar se bomo vrnili tistemu pred long-- to je zato, ker o tem, kako GetString je dejansko delajo pod pokrovom. Torej, kaj je na hitro pogledamo tukaj. Če sem tip ls v mojem telefonskem imeniku, opazili, da jaz ne imate datoteko imenovano students.csv, samo ne tam, ne obstaja. Torej, če sem zdaj zbrati ta program, da konstruktov-1. / konstruktov-1, in sem šel naprej in vnesite Andi, ki živi v Berkeley na univerzi Yale. Bomo imeli Rob, ki živi v Thayer v teh dneh. In kaj je prišel gor s tem, kje je, mislim, Maria je v Mather, če sem pravilno spomnil. Torej, nič ne kaže, da se zgodi. Ampak, če sem tip ls zdaj, obstaja students.csv. Pojdimo naprej in odprt students.csv. To je spet zelo lahek datotečni format. Ampak sem preprosto sprejel konvencijo da imam dve vrstice in stolpce tukaj. Prvi stolpec Prva imena ljudi. Drugi stolpec je študent je domu, ali višja šola, ali hišo, ali malenkosti. In zdaj sem to shranjeno trajno v datoteko. Torej, to ni vse, da je zanimivo. Ampak to je samo odskočna deska zdaj da bi bili lahko prisotni informacije trajno. Torej, kaj je zdaj vidim, kaj več bomo lahko storiti s temi in drugimi funkcijami. Ampak najprej, kakšna vprašanja? To je bilo veliko, in to je bilo pa hitro. Ampak boste videli veliko bolj PSet 4, kot tudi. Ja? OBČINSTVO: Ali obstaja način, da se Naprej dodajanje imen s to datoteko? DAVID J. Malan: Dobro vprašanje. Ali obstaja način, da se nadaljuje dodajanje imen s to datoteko? Da. In v resnici, če boste na koncu up ponovnem odprtju datoteke, bi jih uporabili citat konec citata "a" za append, ki bi samo dodati novo linijo, Nova linija znova in znova, točno. Dobro vprašanje. Druga vprašanja? Ja? OBČINSTVO: Če tekel Program še zdaj, bi bilo obdržati dodajanje imen na datoteko ali bi odprli novo datoteko? DAVID J. Malan: Ah, dobro vprašanje. Če ste še enkrat desno tekel program Zdaj, morda vnesli v novih imen, bi bilo dodati datoteko ali prepisati datoteko? Slednji, ker sem ne uporabljate append način. In ker sem le slepo odpiranju datoteke za pisanje, to je le, da bo prepisati datoteko. Torej, jaz bi res morate storiti je priložila, če želim dejansko imajo dolgoročno baze podatkov. Zdaj CSV je koristen, odkrito povedano, celo za kot če ste writing-- in bomo sčasoma videli to kasneje v semestru, ko bomo uporabili poročila CSV za druge namene. Če želite shraniti vse ljudi ki so registrirani za nek dogodek, ali se prijavili za vaš študent skupina, ali nekaj takega, shranjevanje podatkov v tovrstnih format je super priročno. Ker dobesedno, če I je bilo, da prenesete to datoteko. Jaz bi double-- in kaj je dejansko poskusite to če imam Excel ali številke tukaj. Bom desnim klikom ali nadzor kliknite mojo kartoteko. Ops. Z desno tipko miške kliknite ali nadzor kliknite mojo kartoteko. Daj no, moja miška ne sodeluje. Download-- bom prenesti vse datoteke tukaj, tako samo zato, da sem lahko zgrabi tole. In poglejmo, če to deluje students.csv-- prvič Sem aktivirana. Zdaj hočejo, da vidite svoje stike. Zdaj pa se moram registrirati. Oglejte si, kako enostavno je za uporabo poročila CSV? Ja, ga sproti dopolnjuje. OK, zdaj smo pripravljeni za razred. OK, oh, kaj je novega? OK, blizu. To je bilo čarobno. OK, zdaj pa moramo posodobiti. In zdaj, je pozabil, kaj datoteko sem sprva odprta, ampak kaj a-- tam gremo. OK, tako da zdaj imamo Excel datoteko. Hvala. OK, je bil lažji del, da tisto, kar sem storil. Seveda bi lahko vnaprej nameščen Excel, ali številke, ali ne glede na program. Ampak to je lepo, ker Zdaj sem lahko manipulira podatki v standardni obliki. Torej, zdaj, kaj je ozadje prehod, kjer smo končali zadnji čas, ki naj bi se začelo sneti kolesa usposabljanja. Najprej pa nisi glej to prej kosilo se spet dogaja tukaj na ogenj in Ice v Cambridgeu, Sitarja v New Haven. Prijavite se na spletni strani CS50s ASAP da se pridružijo CS50 študente in osebje. Torej smo kolesa usposabljanja off v ponedeljek kot follows-- Niz je bil razglašen leta CS50s knjižnica za nekaj časa. In to je lepo, saj omogoča nam govori o spremenljivkah kot popolne besede in stavke in še več. Vendar se izkaže, niz ne obstaja. To je le sinonim, ali alias, da smo ustvarili nekaj, kar v resnici je malo bolj Tehnična imenuje char *. In res smo videli zgled programa v ponedeljek da ni ravnala prav, kot smo pričakovali. To je bila datoteka, primerjajo-0. In opozarjajo, da primerjajo-0, če Jaz prevedem ponedeljkovem programu in vodijo primerjajo-0 in vpišite mamo v male in mama z malimi črkami znova. Program je vztrajal I tip različne stvari, čeprav mamo, vse v male, je enaka vizualno. Torej, kaj je bil kratek odgovor zakaj računalnik misli ti dve strune so drugačni? Ja? OBČINSTVO: [neslišno] DAVID J. Malan: Right. Torej, mama, prvič Jaz ga vnesite v, je pa nekje shranjeno v mojem računalniku pomnilnik vendar na drugi lokaciji kot drugo pa sem tip v mamo. Zdaj bi bilo vsekakor treba optimizirati. Računalnik je lahko biti pameten in uresničitev teh dveh nizov, hej, oni so enaki. Naj ne redundantly ga shranite. Ampak računalniki ne delajo, da Optimizacija če poveš jim. Torej, privzeto, oni le, da bo na koncu v dveh različnih mestih v pomnilniku. In tako, da je bolj jasna, če smo primerjali dveh nizov, Prva je bila imenovana s, drugi je bil imenovan t, kaj natančno sem primerjanje tukaj na liniji 13? Ja. OBČINSTVO: To je kraj, v spomin da je spremenljivka kažejo. DAVID J. Malan: Točno tako, sem bil primerjavo mesto v pomnilniku da te spremenljivke opozoril. Torej, še posebej, če je bila mama na bajt številka 1 in 2, in 3, in 4-- ker spomnite poševnico 0 mora biti vse tja konec. In drugi primerek mama, m-o-m, je na naslovu 10, 11, 12 in 13. Bil sem primerjavo 1, da naslov, da lokacije v pomnilniku, proti 10, ki je očitno ni enaka. 1 ni 10. Torej, to je lepo, da to je precej preprosta. Ampak to je problematično, kolikor ne morem primerjati nize. Torej fundamentally-- in na tej nizki ravni, če bi želel izvajati program za primerjavo dve ločeni besedi, da je uporabnik vtipka za kakovost, storiti, da line up char za char, samo na splošno, Kaj moramo storiti, očitno? To ni dovolj, samo, da pogled na teh dveh naslovih. Kaj moramo storiti? Ja? OBČINSTVO: ponovitev prek string [neslišno]. DAVID J. Malan: Ja, dajmo Ponovil skozi niz. Oglejmo uporabiti za zanke, a while, ali karkoli ste najbolj všeč. In če imamo dva niza nekje v spomin, si oglejmo vsakega ih Prvi znak, nato pa vsak je drugi znak, nato tretji in četrti, in peti, dokler nismo zadeli kaj posebnega sentinel vrednost? OBČINSTVO: [neslišno] DAVID J. Malan: Ja, poševnica nazaj nič, na kateri točki v vsakem nizu se lahko odloči, da je to. Smo se ujema vsak znak? Če ne, se vrnite false. Če je tako, vrne true. In tako, da je točno to, kar ta različica programa primerjate-1.c počne. Je enaka, kar smo pogledal v ponedeljek, razen, da sem Znebila besedo string-- čeprav ki nima funkcionalnega impact-- vse Delam sedaj odstranjevanje nekateri vizualni kolesa za usposabljanje, vendar je jasno, da je videti s in t so naslovi. In to je tisto, zvezda, zvezdica, predstavlja je naslov, sicer znan bolj tehnično kot kazalec. Torej, ko izjavljam ov na vrstica 9 in pravijo, char * s, to ne pomeni, da mi niz. To pomeni, da mi je spremenljivka, katere namen v življenju je, da shranite naslov. Ker sem na tem, da dal naslov niz vanj. In res, GetString, da je Jasno, ne vrne niz. To ne vrne mamo Nagibnica nič, samo po sebi. Kaj GetString posebej in ravno vrnil? OBČINSTVO: [neslišno] DAVID J. Malan: An naslov je naslov prvega znaka V nekaterih niz je dobila. In zdaj smo videli spet posebna ključna beseda. In sem namiguje, da je to prej. To se dogaja, da je dobro konvencija da bomo znova videli zdaj. Jaz preverjanje prepričati, da s ni ničen in t ni nična. Ker temelji na mojem res Hitro omemba prej, kaj bi pomenilo, če GetString vrne ne naslov vendar N-U-L-L, ki je spet nekaj posebnega vrednost? OBČINSTVO: Napaka. DAVID J. Malan: To je napaka. Nekaj ​​je šlo narobe. In tisto, kar običajno se lahko zgodi, še posebej, z strings-- ki bi lahko neznanega dolžine v advance-- Mogoče računalniki " iz spomina, morda ste vnesli v takem dolgo besedo ali stavek ali prilepili tako veliko esej tam preprosto ni dovolj pomnilnika. In tako GetString ne more vrniti naslov celotno stvar, tako da samo vrne ničesar. In pravi, napaka se je zgodilo z vrnitvijo posebno NULL vrednost. To je naslov nič, tako rekoč. Zdaj se je izkazalo, C prihaja z funkcija, ki pa to ponovitev. Nimamo za izvajanje tega s za zanke ali while sebe. Mi lahko uporabite funkcijo, imenuje jedrnato, premešamo comp, ali niz primerjati, čigar namen v življenju je naredil točno to. Daš dva napotke, dva naslova, in bo šel na te naslove in nato primerjati pismo pismo za pismom za kakovost, ustavljanje le, če je kaj res? Kdaj naj intuitivno premešamo comp stop ponavljanjem, samo da bo jasno? Ko zadene poševnico 0 bodisi niz, nakar se lahko odloči je vse ujema, ali je prišlo neskladje? Torej, če smo teči to zdaj in poskusite naš mali kapitalizacija igre, tako da primerjajo-1, ./compare-1, in tip mamo z malimi črkami obakrat. Zdaj je ista stvar. In če sem še enkrat z male in nato morda z velikimi črkami. Zdaj je res razlikuje med velikimi in malimi črkami. Torej ni vse tako težko, ali čaroben, vendar pa zdaj pojasni kaj se dogaja pod pokrovom. Torej, kaj več bomo lahko citat od te vrste lekcijo? Torej, kaj je, da pogled na to. Grem, da gredo naprej in napisati hitri program, tu imenujejo copy-0. In zdaj gremo naprej in dejansko naredimo this-- s kopijo-0, poglejte, kaj sem tukaj dobil. Najprej sem povedal uporabnik, nekaj reči. Potem sem dobil niz in sem ga shrani v s. Potem sem preveriti, če je enaka enaka NULL, samo vrniti 1. Torej je to samo standardna preverjanje napak. Nič zanimivega se je zgodilo. In v bistvu, če se znebimo napake preverjanje, to izgleda kot teden 1 kode v tem trenutku. Ampak sem začel, da bi dobili malo bolje o tem. Zdaj je v skladu 16, pred tednom dni, morda celo nekaj dni ali minut nazaj, bi lahko rekli, linija 16 je ustvarja spremenljivo imenovano t in kopiranje S vanjo. In to je popolnoma razumna takeaway. Ampak zdaj bolj natančno. Kaj se dogaja v vrstici 16? Kaj je pridobivanje kopirajo od desne proti levi? Ja? OBČINSTVO: Je t dobili naslov s? DAVID J. Malan: Točno, t je pridobivanje naslov s. Torej, da bo jasno zdaj, če grem nazaj na prejšnje primer in sem potegnili stvar sem vnesli v. In kaj sem tipkal in-- tukaj je, in tu je tisto, kar sem tipkal v nekje v spomin, mama in nato poševnica nazaj 0, ki je dodana za mene. Kaj sem shranjeni tukaj, se spomni, to je na mestu 1, 2, 3, 4, To je tisto, kar je trenutno v s. Torej, če na liniji 16, sem rekel, daj mi druga spremenljivka imenuje t in trgovina ob vrednosti s, kar dobi shranjene tukaj ne bo mama ampak samo število 1. Torej, če gledamo naprej v tem programu Zdaj, kaj se bo zgodilo? Tako opazili, da je ta funkcija vam morda se ta uporablja nekaj časa nazaj za Cezarja, ali Vigenere, ali pa sploh ne. Trdim z mojo printf sem dogaja, da se izkoristijo izvod T. Prvi v vrstici 19, hitri duševno zdravje preverite, strlen preveri dolžino t. Ker ne želim, da poskusite izkoristiti nekaj če ni niz tam. Če uporabnik šele pritisnite tipko Enter, nič izkoristiti. Torej, ne želim narediti linijo 21. Torej linija 21 se kapitalizacijo katera črka, očitno, t? OBČINSTVO: m? DAVID J. Malan: Videti kot da je kopiranje, katera? OBČINSTVO: m. DAVID J. Malan: Uh, m. OK, tako da prvi m, zaradi obvestila, da sem prehodu na toupper, ki Če še nikoli niste videli, da je samo funkcijo izkoristiti kot svoj vložek. t bracket nič pomeni dati me ničelna značaj t. In tako kako to slika spremembe, da bo jasno? Kaj je potrebno, da se predelajo ali spremeniti glede s in t in mama poševnica nazaj nič. OBČINSTVO: [neslišno] DAVID J. Malan: Ja, tako da je to ena tukaj preprosto potrebe, da bi dobili spremenila to-- popraviti this-- potrebuje, da se spremenijo v kapital m. Toda zdaj, poglej kasneje v Program, če natisnete s in t, kot sem čisto tukaj, pazi, kaj je bo zgodilo tiskanje s in t. Zato poskrbite, copy-0, ./copy-0. Naj gredo naprej in tip V mamo v vseh male. Opazili sta izvirnik in kopija so bili kapitalizirani. Zakaj? No, s in t sta obrnjena k, če hočete, isti kos pomnilnika. In odkrito povedano, to je pridobivanje Res uninteresting-- dejstvo da smo s pomočjo naslovov nič tukaj. Mislim, res ne briga kjer je stvari v pomnilniku. Žal sem brisanje malo preveč. Ampak jaz res ne skrbi kjer so stvari v spomin. In tako, seveda, kaj programerji mislijo o je, da ko govorimo o naslov, ali kazalec, koga briga, če je v spominu. Ni mi mar, če je na bajt eden ali ena milijarda. Pravkar sem skrbi, da se ta spremenljivka je učinkovito obrnjena ta kos pomnilnika. In tako, odslej namesto Izgovor preko poljubnih pomnilniških naslovov, dajmo šele začetek, da pripravi napotke kot kazalci, kot puščice. Torej, kaj je, in ne v resnici, po tem programu ker o tem, kako sem ustvaril t, to je le dve ločeni spremenljivke kaže na isti kos pomnilnika. In mi ni mar, kje so. Tako smo lahko abstraktno stran te podrobnosti. Torej, kako naj to popravim? Če hočem napisati različico kopijo Program, ki dejansko kopij godalnega in izkorišča le copy, samo intuitivno, kaj moram biti sestavine za naše rešitve? OBČINSTVO: [neslišno] DAVID J. Malan: Moramo kaj? OBČINSTVO: Chunk spomina. DAVID J. Malan: Potrebujemo en kos pomnilnika, kajne? Ne vemo, kako to še ni nujno. Ampak sem nekako morali to tako zgodi da prvotni mama v spodnjem primeru konča s tem, da dodatni kos pomnilnika. In potem, ko sem spremenite kopijo, sem ne želite spremeniti to kopijo tukaj. Jaz namesto želite spremeniti samo to Kopija tako da original je nespremenjena. Torej, da vidimo, kako lahko to storimo. V copy-1, ki ima že bila odvzeta komentarja, vendar je komentiral na spletu. Mi namesto storite following-- ti linije so enaki, prinesi mi niz in poklicati to je to. Zdaj pa si oglejmo eno izmed naših najbolj Kompleksna razen zadnjega kompleksnosti za nekaj časa, linija 16 počne točno to. Torej, če vaš udoben z picture smo pravkar drew-- daj mi nov kos pomnilnika, kopirajte vse v njej, Poglejmo, kako prevesti, da kodo. Torej linija 16, na levi strani, char * t mi daje to polje tukaj. To je vse, kar počne. Na desni strani, m Alloc ali malloc, je dodeljevanje pomnilnika, super fancy, Grobni način samo pravim dajte mi kos pomnilnika. Koliko pomnilnika potrebujemo? No, je nekako velik izražanja. Ampak poglejmo, kaj tukaj piše. Torej to, seveda, je dala me je dolžina niza s. Torej, mama naj bi bilo kaj? Torej le tri, kajne? mama je tri znake. Nimate count poševnica nazaj nič, če vas govorimo o dolžini niza pa je pravzaprav človekove vidne črke. Torej mama, tako da to mi daje 3. Toda počakaj malo, da sem zdaj dodal 1. Zakaj sem dejansko želijo dodeliti 4 bajte in ne samo 3? Ja? OBČINSTVO: Za divjega vrednosti? DAVID J. Malan: Točno, ta divjega vrednosti. Za poševnico nazaj ničlo, Rabim 4 bajte skupaj. Tako da moram dolžino vrvice plus 1. In potem samo za dobro measure-- čeprav na tem sistemu, to je vedno bo 1-- Pravim pomnožite to z velikostjo char. Izkazalo se je, sizeof je operater v C, ki samo ti se pove število bajtov, ki je potrebna za določene vrste podatkov. To ne deluje nizi, običajno, včasih pa ne. Toda v splošnem primeru ni. Vendar bo to povej mi, koliko bajtov char je, kar se izkaže, je vedno 1. Torej, to je kot, da se pomnoži z 1. Torej super Grobni išče vrstica kode. Ampak vse kar naredi je, daje mi kos pomnilnika. Vendar se zdi, da se kopiranje kaj v ta spomin? Ne še. In kaj storiti, I na liniji 22, in 23, 24, 25, dobro, sem preprosto to storite. In to je vrsta old school stvari zdaj. To je podobno PSet 2, pri čemer ste pravkar premikajo stvari okrog v spomin, oziroma v kito. Torej sem ponavljanjem od 0 do dolžina niza s. In jaz kopiranje značaj i-th vs v lik i-tega v t. In ker sem, programer, ki prepričani, da dodeli natanko toliko bajtov kot rabim, da je popolna ena-na-ena razmerje. In jaz kopirati mamo v male črke na novo. In potem končno, storim to vrstico. Tako je učinek le da izkoristijo to t tukaj. Tako veliko, da absorbira, vendar če ste jo pravkar obravnava kaj se v resnici dogaja na pod pokrovom se le premika ti bajti okoli, vse, je potrebno za rešitev tega problema je samo, da nam ta kos pomnilnika. Sedaj ob tveganju prepričljivo, naj pokažejo en drug primer, ki je skoraj identična, razen tega eno vrstica kode. Torej, to je različica hacker tega programa, če hočete. Ampak kaj je šele destilirati je v to, kaj se dogaja. Linija 24 se uporablja, da se to ne Nosilec sem dobil e nosilec i. Zdaj pa sem to spreminja na veliko bolj Grobni zvezda t plus 1 enako zvezda s plus 1. Torej, kaj se dogaja in zakaj imamo zvezda znak? Videli smo zvezdo pred in pri čemer je uporabljena različno tukaj. Smo že videli char *, zdaj vidim zvezda na začetku, in da je v redu. Ker se je izkazalo smo lahko nekako sklepamo le od tistih prvim Načela, kaj se dogaja. Torej, samo da bo jasno, kaj je s? Prejšnji teden je bil niz. Da ne zadostuje več. Kaj je y, posebej? OBČINSTVO: [neslišno] DAVID J. Malan: To je kazalec. To je naslov Prvi znak smo vnesli. OK, kaj je t? OBČINSTVO: [neslišno] DAVID J. Malan: The naslov prvega bajta t, da je kos pomnilnika prerazporedijo. Tako se izkaže, da je, ko smo ponovitev od 0 na do niza length-- najprej, i Začne se na 0, saj te stare šole za zanke stvar. Torej samo za preprostost, dajmo Predvidevam, da je prvo vrstico kode je res samo to, kajne. Če jaz nič, dodaja nič nečemu predvidoma ne bo imela učinka. Torej, kaj je ta beseda? Izkaže se, da je zvezda Operater v tem kontekstu je dereference operater, ki je le fancy način rekel go na naslov. Torej, če je s naslov prva lik v tej kos pomnilnika, * s sredstvi tja. In ker smo pripravljeni slika na ta način, lahko sprejme po duševno modela. Če je to s, in rečeš * s, * i nekako kot drč in lestve, če se spomnite igro iz otroštva, je kot slediti to puščico in pojdite na naslov. * t je ista stvar. Torej začeti tukaj, pojdite na njegovo kos. Ne morem pripraviti na ta zaslon na ta način. * t pomeni, da gredo tukaj. In potem je za zanke je samo rekoč premakniti ta znak tukaj, premakniti ta znak tukaj, premakniti ta znak tukaj. Ampak kako naj naredim, da stopnjevanja? Moram razveljavite kaj sem pravkar črta. To je tisto, kar na splošno imenujemo pointer aritmetika, ki pomeni matematike z naslovi. Če se v to zanko, Držim povečevanje i, in s je naslov in t naslov, če sem šele vztrajati dodal 1, to samo pomeni, da napreduje, in naprej, in naprej v spominu. To je kot Oxford Street, ulice, da je stavba CS naprej. CS zgradbe je na 33 Oxford Street. Torej, če ste bili, da naredite 33 Oxford Street plus 1, ki vas pripelje do 34 Oxford Ulica, nato 35 Oxford Street, nato 36 Oxford Street, glede na tiste, stavbe dejansko so - če ti obstajajo. In tako, da je vse, kar delamo tukaj s kazalcem aritmetiki. Torej, to je super Skrivnosten način izražanja sebe. Ampak vse, kar se dogaja Pod pokrovom je samo po teh naslovov, kot sledi zemljevid, če hočete, ali po puščic, kot smo pripravljeni na zaslonu. OK, veliko za prebaviti. Vsako vprašanje o skladnji, koncepti, kazalci, malloc ali podobno. Ja, sem prvi. OBČINSTVO: Torej, kje da pravi * t enaka toupper * t, je, da se dogaja, da se izkoristijo vse črke ali just-- DAVID J. Malan: Ah, Res dobro vprašanje. Torej, v tej vrstici tukaj, 31, se to dogaja, da se izkoristijo prva črka ali vse črkami. Torej, kaj je odgovoriti na to vprašanje, ki ga bo nazaj na prvih načel. In prva načela tu mislim pojdite z osnovnimi definicijami kaj se gre. Torej toupper je funkcija ki izkorišča char. To je vse. * t pomeni iti na first-- pojdite na naslov v t. Torej, na sliki, če je to kos spomina smo dodelijo knjižnične funkcije malloc, in to je, t * t pomeni iti tukaj. Medtem pa si mimo da vrednost, male črke m da toupper, ste dobili nazaj kapital M, kjer si ga je dala? Si ga je dala v tej isti lokaciji. In tako se ta logika tistih, osnovne definicije je le kapitalizacijo prvo črko razen če Ponovil z I ali za zanke ali while, to ne bo storiti kaj več, kot si ga vprašati. Dobro vprašanje. Ja? OBČINSTVO: Zakaj ste uporabljate dereference metodo namesto array? DAVID J. Malan: Ah, dobro vprašanje. Zakaj bi uporabili razrešimo Postopek namesto metode diod? Ni posebnega razloga, če sem iskren. In, v bistvu, za to vrsta primer, desno, Jaz sem samo trdil, zaradi česar je program bolj zapleten, več oči so zasteklitve več, ljudje preverjanje ven ker to izgleda super Skrivnosten, vendar čeprav to počne isto stvar. In tako, odkrito povedano, to je nepotrebnem vizualno kompleksna rešitev problema. To je še vedno dober design, pet od petih za projektiranje, ali je v razredu zapis ali kazalec zapis. Ampak-- posebej, ko smo dobili kasneje v teku v PSet 5 ko smo izvajati ta slovar, ki Omenil sem nekaj times-- bomo dejansko skrbi pomnilniške naslove nizki ravni da bomo zares razumeli kaj se dogaja. Ampak, za zdaj, se izkaže, da je to vrstica kode tukaj oglatih oklepajih v resnici ne obstajajo. So tisto, kar se imenuje skladenjski sladkor, ki je le nenavadno kul način pravijo prevajalnik pretvori oglati oklepaji biti da je matematični izraz. Torej, to je človeška konvencija da se lahko samo napisati ti zelo uporabniku prijazen oklepajih. Toda kaj prevajalnik, Jek, je res počne kadarkoli pišeš, kaj je poudarjeno v skladu 24, pod pokrovom je res pretvorimo v to. To je samo bolj prijetno kot človek brati in pisati kodo, kot linijo 24. Ampak na koncu tisti, kolesa usposabljanje preveč odlepi Ko je eden lastno udobje postane močnejša. Vse je v redu, tako opozarjajo, nato pa, da je to je nekako največji problem sva srečala. In to je tisto, kar je sprožila to celoto damn pogovor o kazalci, in naslove ter kopiranje stvari. To je bilo zato, ker smo se spotikali to neumno, neumno vprašanje, s katerim Sem izvajal logically-- z Lauren tu gor na demo in pomarančnega soka v milk-- popolnoma algorithmically pravilna funkcija za zamenjavo dveh spremenljivk " vrednote, ampak prekleto stvar niso imeli kakršne koli obstojne, ali trajna, vpliv na mojo kodo. In zakaj je bilo to? Na kratko, zakaj je to Izvajanje zamenjave logično pravilna, vendar nima vpliva o spremenljivk, ki so opravili z njim, kot x in y za glavni? Kaj je bilo bistvo tega vprašanja? Ja? OBČINSTVO: Ker spremenljivka je kopije spremenljivke v glavo s funkcijo. DAVID J. Malan: Točno tako, ko se boste peljali spremenljivke v odvisnosti, ali trditve v funkciji, oni s kopijo, opravil, ki pomeni, da bi dobili enak iščejo Vzorec bitov za oba x in y, tu imenuje a in b. In lahko narediš karkoli hočeš s temi kopijami, ampak oni bodo morali ne Vpliv na funkcijo kliče. In v resnici, smo pripravili da Slika na zaslonu, odpoklic zadnji čas, pri čemer se, če vas res misliš o tem, kaj je dogaja pod hood-- če to je spomin računalnika, in tukaj dol je kos pomnilnik, ki se uporablja za glavno, to je kos pomnilnik, ki se uporablja za zamenjavo, in tudi če je glavni dve spremenljivki, X in Y, swap morda identična iščejo Vrednosti, ki sta 1 in 2, ampak oni so popolnoma različne kose pomnilnika. Zato moramo rešitev za to. In odkrito povedano, se zdi, da imamo zdaj imamo rešitev za ta problem, kajne. Če imamo zdaj možnost, da manipulira stvari s pomočjo naslovov in, nekako drče in lestve slog, sledite puščice in gremo nikamor želimo v spomin, ne bi mi rešili ta problem s ki poteka od glavnega, da bi zamenjali ne vrednote želimo swap, ampak samo intuitivno kaj bi se peljemo, namesto da bi zamenjali? [Interposing GLAS] DAVID J. Malan: Zakaj ne bomo samo prenese naslovi, kajne? Zakaj ne damo swap treasure map, če hočete, ki vodi do trenutnih vrednosti x in y. Oglejmo swap, dejansko spremeniti ti originalni bitov, namesto pravkar poteka kopije bitov. In tako, v resnici, da je tisto, kar je bo rešitev. Ta različica je tu jasno slaba in pomanjkljiva. In zdaj, na prvi pogled, je samo izgleda kot smo dodali kup zvezd naključno in prečkala naše prste da bi bilo sestaviti. Ampak, bi to zdaj zbere. Ampak poglejmo, kaj to pomeni. In, na žalost, so avtorji C bi izbrali drug simbol da bi to malo jasnejši, toda operater zvezda ima drugačen pomen v dveh različnih kontekstih. In smo videli tako, ampak dajmo razlikovati. Torej na vrhu tam, ko sem spremenil a in b od tega, da INT v slabo Različica za int zvezdic, A in B, prej so cela števila. Kaj sta A in B je zdaj v dobro, zelena različica? Oni naslove. Naslovi kaj, da bo jasno? Naslovi celih števil. Torej dejstvo, da sem rekoč int zvezda sredstva to je naslov celo število, posebej. Torej, zdaj opazili v vrstic kode, nekaj drugega je preveč spremenila. NTU ostaja enaka, saj to je samo začasna celo, brez spominskega magija obstaja. Toda zdaj potrebuje zvezdo. In v bistvu vse druga omemba a in b, opazili, da je vse, kar je spreminja iz rdeče v zeleno je, da sem prefixing te spremenljivke z zvezdami. Ker ne želim, da bi kopirali a in b. Ker, če sem samo kopirate a in b in swap a in b, kaj sem dejansko zamenjavo? Samo naslovi, želim, da bi zamenjali kaj je na teh naslovih. Hočem iti tja. In tako upravljavec zvezda notranjost moje funkcije, ne znotraj seznama parametrov pomeni, da greš na te naslove in dejansko spremembo te vrednosti. Torej, kaj naredi sliko zdaj izgledal namesto. No, če bi namesto sem mimo v za a in b ni 1 in 2-- Pravzaprav moram dodati ena definicija tukaj. Torej domnevam, da je ta kos pomnilnika je na mestu 10. To je na mestu 11, vendar je to je malo poenostavitve, Sedaj imam dve možnosti moram opraviti x in y, ali moram opraviti svoje naslove? Če grem mimo njihove naslove kot je ta, pravkar sem Zdaj je treba izvajati swap na zeleno kodo tako da, ko se vidi, in ko jo vidi b, ne samo kopirati A in B in premaknite mleko in pomarančni sok. Mleko in pomarančni sok Metafora zdaj pokvari, ker tisti so skodelice tekočih in ne kart. Mi namesto tega morali iti za reševanje 10 in smo morali iti za reševanje 11, in izvedite to swapping logiko. Torej logika je enaka, vendar potrebujemo nekoliko drugačen način dostopanja do teh spremenljivk. In tako na koncu, kaj je Program mora izgledati, kot je to. V swap.c dobesedno kopirajo in prilepili zeleno različico. Ampak moram narediti eno spremembo. To ni dovolj, samo, da spremenite swap. Katera druga vrstica kode moram spremeniti? Ja? OBČINSTVO: Kjer je potrebno argumente. DAVID J. Malan: Kje je potrebno njeno trditev. Torej, če sem se pomaknete do glavne sem ne komaj gredo v x in y, in obljubim, zadnji kos nove sintakse danes. Moram se pa ne x in y vendar naslov x in y. In se je izkazalo, simbol da so avtorji C izbral je, če uporabljate 'znak tukaj, da ne smemo zamenjevati z bitno ampersand, če uporabljate 'in' znak tu in ampersand tukaj, to številke za vas, kaj je naslov x, morda je 10, kar je naslov y, morda je 11, in prehaja tistih namesto. Tako veliko, da absorbira vse naenkrat. Ampak poglejmo zdaj hitro v naše preostale štiri minute kjer lahko gredo stvari narobe. In kot prahi, dejansko Vzel sem to sliko, TF vzel to sliko leto ali dve nazaj. To je torej spet vogal od Eliot Dining Hall. Kazalci so morda najtežji tema, ki pokrivamo v CS50. Torej, če vas skrbi neke po pobočju je kot morda je bolj za hokejsko palico kot je ta, spoznali smo nekako bliža vrhunec Pogoji konceptualne zahtevnosti. In sem bruhati to fotografija, ker prisežem za boga, v jeseni leta 1996, ko sem prevzel CS50 z mojim asistent, Nishat Mehta, me je sedel v vogal Eliot D. Hall kosilu, ali večerjo, ali kaj podobnega, da bi poskušali da mi pomaga razumeti napotke. In to je, če sem bil tednov po je bil uveden v predavanju kadar Končno sem razumel kazalce. In jaz upam, da je to bo klik daleč prej za vas. Vendar zavedaš tega absolutno med bolj sofisticirane teme smo pogledal. Vendar je med najbolj močna. In ko si ga dobil, to je res vse le, da bo končno prišel skupaj. Ostali tako prepričani, da ne morali vsi potonejo v danes. Torej, tukaj je zadnja programa gremo pogledati. In mi boš na koncu z Hitre treh minutah claymation ki ga je naš prijatelj, Nick Parlante. Tukaj je program, ki na vrhu dva linije izjavlja spremenljivo X in Y. Ki sta naslovi celih števil, alias kazalci. Nato smo dodeliti dovolj pomnilnik za shranjevanje int in shranite naslov navedene spomina v x. Torej, to je še enostavnejše kot primer poprej. Daj mi štirih bajtov pomnilnika, da je velikost int, in dal, da je naslov v x. Ta linija tukaj pomeni pojdite na naslov v x in dal pomen življenje, število 42 tam. Toda ta linija me skrbi. Star y pomeni, pojdite na naslov v y, in dal nesrečni številko 13 tam. Zakaj je nevarno, da na tej točki v story-- čeprav hitro povedal v naših pojema minutah here-- zakaj je to slabo povem, pojdite na naslov v y? OBČINSTVO: Niste [neslišno]. DAVID J. Malan: Nimam dal ničesar v y. Torej, kaj je vrednost y, na tej točki v zgodbi? Nimamo pojma. To je nekaj smeti vrednost in niti ne Binky vem. Če bi lahko na koncu na tej opombi. [VIDEO PREDVAJANJE] Hej, Binky, zbudi se. To je čas za kazalec zabave. -Kaj je to? Spoznajte kazalci? Oh, vrlina. No, za začetek, mislim, da smo bo potreboval par nasvetov. -V REDU. Ta koda namenja dve kazalce ki lahko kažejo na cela števila. -OK, Dobro vidim dva kazalca, vendar pa Ne zdi se, da kaže, da ničesar. -Tako je. Sprva ptičarji ne kažejo nič. Stvari, ki jih kažejo, da so imenuje pointees in njihovo vzpostavitvijo je ločen korak. Oh, prav, prav. Vedel sem, da je. V pointees sta ločena. Torej, kako si dodelijo pointee? -OK, Tudi tega kodeksa dodeljuje nov celo pointee, in tem delu so x, da kaže na to. Hej, da izgleda bolje. Torej bi bilo nekaj storiti. -OK, Bom dereference kazalca x do shranite številko 42 v svojem pointee. Za ta trik, bom morali my čarobno palico iz Dereferenciranje. -vašo Čarobno palico iz Dereferenciranje? Uh, to, da je super. -To Je tisto koda izgleda. Bom ustanovil številko in-- [POP SOUND] Hej, poglej tam gre. Torej, delaš razrešimo na x sledi puščica za dostop do svojega pointee. V tem primeru, za shranjevanje 42 tam. Hej, poskusite ga uporabljali za shranjevanje številko 13 skozi drugo kazalca, y. -V REDU. Bom šel tja na y, in dobil številko 13 ustanovi. In nato vzemite palico Dereferenciranje in just-- [BUZZER SOUND] Oh, hej, da ni deloval. Reci, uh, Binky, jaz ne mislim Dereferenciranje y je dobra ideja, saj nastavitev up pointee je ločen korak. In jaz ne mislim, da bomo kdaj naredili. -Hmm, Dobro izhodišče. Ja, smo se dodelijo kazalec, Y, vendar ne bomo nikoli nastavite tako, da kaže na pointee. -Hmm, Zelo pazljiv. Hej, iščete dobro tam, Binky. Lahko jo popraviti, tako da y točke z enakim pointee kot x. -Sure, Uporabljam mojo čarobno palico razvrščanja kazalca. -je Da dogaja, da se Problem, kot prej? Ne, to ne dotikajte pointees. Samo spremeni en kazalec da kaže na isto thing-- [Pokanje] --as drugega. -Vidim. Zdaj y opozarja na istem mestu kot x. Torej, čakaj, zdaj je y fiksna. Ima pointee. Torej, lahko poskusite palico spet Dereferenciranje poslati 13 preveliko. Oh, OK, tukaj gre. Hej, poglej to. Zdaj Dereferenciranje dela na y. In ker so kazalci v skupni rabi da eno pointee, oba glejte 13. Ja, delitev, uh, karkoli. Torej, bomo preklopiti krajev zdaj? Oh, poglej smo zmanjkalo časa. -But-- -Samo Zapomniti tri pravila kazalec. Številka 1, osnovna struktura je, da imate kazalec, in opozarja več na pointee. Toda kazalec in pointee sta ločena. In pogosta napaka je vzpostaviti kazalec ampak, da bi pozabili, da ga pointee. Številka 2, kazalec Dereferenciranje začne na kazalec in sledi svoji puščico nad za dostop do svojega pointee. Kot vsi vemo, to deluje le, če obstaja je pointee, ki nekako pride nazaj izreči številko 1. Številka 3, kazalec Dodelitev traja en kazalec in ga spremeni v točko na Enako pointee kot drugi kazalec. Torej, po odstopu, oba kazalci točko, da bo isti pointee, včasih, da se imenuje delitev. In to je vse, kar je z njo, res. Adijo zdaj. [END PREDVAJANJE] DAVID J. Malan: To je to za CS50. Zahvaljujoč profesor Nick Parlante. Se vidimo naslednji teden. [ELECTRONIC MUSIC IGRANJE]