[Glazbom] DAVID J. Malan: To je poput brucoš seminar danas. U REDU. Dakle, vrlo kišno van. To teži da se dogoditi srijedom, ali sve više prilika za pitanja danas. Tako ćemo krenuti zapravo s filmom u samo trenutak. No, mi ćemo početi veličanstveno kao i uvijek. Ovo je CS50, i to je kraj tjedna 4. Dakle, ako ste ikada gledao TV ili film u kojoj postoji neki računalni stručnjaci i policija ili FBI, ili neka agencija pokušava uhvatiti neke Protivnik, dobro, vi ste vjerojatno čuli za izraz "poboljšati" pri čemu taj tehničar nekako magično zumira beskonačno daleko vidjeti zločince Identitet ili broj registarske pločice u čak svjetlucanje ogledalom ili bljesak nečijem oku. Dakle, istina, neka je pogledati nekoliko takvih scena iz Hollywooda. [VIDEO PLAYBACK] -OK, Sada ćemo dobiti dobar pogled na vas. -Hold Ga. Trčanje da je povratak. -Čekaj malo. Idi pravu. -Postoji, Zamrznuti to. -Puni zaslon. -OK, Zamrznuti to. -Tighten Se na to, hoćete li? -Vector In na koji momak od stražnjeg kotača. -Zoom U upravo ovdje na ovom mjestu. -Sa Pravom opremom, slika može se povećati i izoštriti. -Što je to? -To Je poboljšanje programa. Možeš li jasno da se bilo? -Ne Znam. Budimo poboljšanje. -Enhance Poglavlje A6. -Ja Poboljšane detalj, and-- Mislim da postoji dovoljno da bi se poboljšala, pustite ga da moj zaslon. -Ja Poboljšana odraz u njezinim očima. -Let Je pokrenuti ovo kroz Video pojašnjenje. -Edgar, Možete poboljšati ovo? -Pričekaj. -I've Radio na tome pitanju. Netko je odraz. -Reflection. -Postoji Je odraz čovjekovog lica. -Ponuditelj Odraz. -Postoji Je odraz. -Zoom U na ogledalu. -Možete Vidjeti odraz. Možeš li poboljšati sliku odavde? Možeš li ga unaprijedili ovdje? Možeš li to poboljšati? Možete li to poboljšati? -Može Smo unaprijedili ovo? Možeš li to poboljšati? -Hold Na sekundu, ja ću unaprijediti. -Zoom U na vrata. -Times 10. -Zoom. -Useliti. -više. -Wait, Zaustaviti. Zaustavite. -Pause Ga. -Rotate Nas 75 stupnjeva oko vertikale, molim. Zaustavite. Vrati se na dijelu O vratima, opet. -Got Sliku pojačivač koji može bitmap? -Hej, Možda možemo koristiti Pradeep Sen način vidjeti na prozorima. -Ovo Softver je stanje u umjetnosti. -Ponuditelj Svojstvena vrijednost je isključen. -Sa Prava Kombinacija algorithm-- -On Je uzeti eliminacije Algoritmi za sljedeću razinu, i ja ih mogu koristiti za unaprijediti ovu fotografiju. -Lock Na i povećanje z-osi. -Enhance. -Enhance. -Enhance. -Freeze I unaprijediti. [END PLAYBACK] DAVID J. Malan: U redu, tako da svi oni su zapravo riječi. Oni samo nanizati u Način na koji to zapravo nije osjetljiv. I, u stvari, CS50 i tečajevi poput njega teži uništiti puno TV i filmove za tebe. Jer kad te računalnih stručnjaka su zveckanje off uvjete i govori Sviđaju stvari kao što su vektori, i z-os, i bilo koji broj ostalih zapravo više tehničke uvjete, oni su zapravo samo nizanje riječi zajedno prečesto. Je li to jedan od naših nada je da, kao nuspojava uzimanja predmeta ovako će više ljudi u Svijet zapravo biti u mogućnosti da se vagati u i samo ikada tako nešto utjecati na Kvaliteta i točnost tih filmova? U stvari, neka je pogledati stvarnosti. Dakle, ovdje je osoblje fotografija Marija, jedna od naših nastavnih bližnjima. I pretpostavimo da je osumnjičen za nešto. Pa ipak, postoji tračak neki dokaz u svom oku, ili u odraz njezinih naočala. Pa, ako radimo upravo onako filmova predlaže, u kojoj smo povećali i "poboljšati", ovo je koliko informacija u Marijinu licu kada slikate s tom izvornom razlučivosti. A, u stvari, možete vidjeti te točkice. A to su ono što su nazivaju pikseli, P-I-X-E-L-S, što je samo trg obično to je točka koja sastavlja sliku. I natrag u dan, i zapravo čak danas s nekim od današnje LED televizora ili LCD televizore, ako imaš jedan u vašoj sobi ili kod kuće, ako idete do super blizu njega, i pogotovo ako je to nešto stariji TV, vjerojatno možete i vidjeti te točkice i to je ono sastaviti sliku. I nema više informacije od toga. Mogli bismo "poboljšati", u smislu zaglađivanje stvari više i vrsta zaključi vrsta, vrsta što Boja bi trebala biti uz Marijinu oka tako da je zapravo nije tako pixelated. Ali ako sam stalno povećavanja, postoji je negativac u njezinu oku. Kao da je sve informacija koju imamo. Ne možeš stvarati Podaci iz ničega. Postoji samo ograničen broj bitova tamo. Tako je u Problem Set 4, gdje imate priliku igrati s ovom vrstom svijeta. U problemu Set 4, vi ćete istraživati svijet grafike, i forenzike, i zapravo pisanje koda koji oporavi izgubljene slike. Vi ćete napisati kod koji manipulira postojeće slike i konačno shvatiti što je događa ispod haube. A, što se ispostavilo, to je zapravo nije sve što je komplicirano. Na primjer, ako smo htjeli predstavljaju smješka gdje s tim crnim piksela, ili ove crne točkice, dobro, mi jednostavno može predstavljati ih kao istinski bitmap. A ako je ikada čuo da Izraz bitmapa, možda sada počinje napraviti malo više smisla danas. Mi već znamo što je malo. To je 0 ili 1. A karta je samo nešto poput komada papira koji vam daje upute i ima možda mreža X i Y koordinate. Dakle, ovdje je bitmap. To je karta bitova pri čemu 1 je očito će predstavljati bijeli piksel, a 0 će predstavljati crni piksel. No, svakako bi mogao okrenuti oko sebe. To ne stvarno obzira da dok smo dosljedni. I ovdje je kako, u binary-- unutar od memoriju računala, ili čak i unutar od datoteku na tvrdom drive-- možeš pohraniti najjednostavnije smješko slika. No, ono što smo mi, naravno, nedostaje na ovoj slici? Boja, zar ne? To je očito sljedeći korak ili pojašnjenje poboljšati ovo s bojom. Dakle, na žalost, sa samo jednim malo, 0 ili 1, što bi moglo predstavljati boje. To bi mogao biti crvene ili plave ili crna ili bijela ili zelena ili ružičasta, ili bilo para boja. No, zbog jednostavnosti, mi ćemo samo pretpostavljati crno-bijelo. Dakle, što je logično trebamo ako smo Želite provesti boje na slici? Što moramo učiniti? Kao i ako je ograničavajući faktor ovdje je da s jedne malo što može samo predstavljaju dvije države, 0 ili 1, bijeli ili crna, što želiš učiniti? Publika: Više podataka. DAVID J. Malan: Više bitova, Da više podataka, više bitova. I doista, to je točno kako u boji slike su zastupljeni. Umjesto da koristite jedan bit, A 0 ili 1 za svaki piksel, svaka točka, vi samo koristite više. Možda koristite 8, možda, češće korištenje 24, i doista, u problem Set 4, će igrati s datotekom format koji koristi 24 bita obično. No, većina od vas su vjerojatno upoznati s JPEG. Ako ste ikada uzeti fotografija na telefonu, ili upload ili vidio nešto na Facebook ili Flickr, bilo koji broj foto-based web stranice, vi ste vjerojatno vidjeli JPEG slike prije. A što se ispostavilo, ovo je varalica Format ćemo koristiti u PSet 4, gdje idete moraju oporaviti slike da sam slučajno obrisane iz korumpiran memorijske kartice u fotoaparatu, ako hoćete. I ispada da, iako JPEG je prilično sophisticated-- to je mnogo više sofisticiran od crne i bijele točkice vidjeli smo prije nekoliko trenutaka, jer je zapravo fantazija algoritmi koji se koristi za kompresiju JPEG, pa da možete imati jako lijepo, kvaliteta slike, ali koristeći relativno malo bitova. A mi ćemo se vratiti kompresije prije dugo. Ispada da je prva tri bajta u JPEG image-- bez obzira što si uzeo fotografiju of-- su vrijednosti 255, 216, 255. Drugim riječima, ako ste upravo vidjeti da je uzorak bitova, zastupljena ovdje tri bajtova, ili 24 bita ukupno, s velikom vjerojatnošću možete zaključiti da tražite ga ovaj prvi od tri bajtova JPEG. A to je ono što je poznato kao potpisom JPEG. Puno formata datoteka tamo imaju tendenciju da se početak s određenim obrascima 0s i 1s, tako da je Windows i Mac OS i iOS, i Android znati kakav datoteke su su, osim tzv datoteke Proširenje da puno datoteka ima. Ako ste .jpg, to je još jedan trag na računalo. Tako ćemo sada pogledajte ovo malo više tehnički. Znamo decimale Sustav 0 do 9. Znamo binarna 0 i 1. A ako mislite natrag PSet 0, imali smo vam u koštac s, za malo, nešto zove heksadecimalni, gdje imate 16 znamenke, umjesto 10 ili umjesto 2. A ti znamenki, po konvenciji, su 0 do 9 i zatim se preko f, gdje je f predstavlja ono decimalni broj, baš kao brzi razum provjeriti? Dakle, 15. I mora predstavljati 10, samo Priroda narudžbe koje sam dao. To je samo proizvoljna konvencija, ali to je prilično standardna. Dakle, ako gledamo ovaj uzorak od tri bytes---a neka samo početi gledati na to u na način sukladan tome računalni znanstvenici općenito pogledajte i razmislite o datotekama. Vi naravno, možete misliti o datoteke u 0s i 1s i decimale, ali u stvarnosti, mi imaju tendenciju da koriste binarni ili uobičajenije hexadecimal-- natrag iz PSet 0. Pa neka mi predložiti da 255, 216, 255 i samo su ti obrasci 0s i 1s. I vi možete provjeriti ako želite učiniti math od tjedan 0. No, za sada, samo pretpostavimo ovo je uistinu točno. Upravo sam prepisivati ​​tri decimale Brojevi su tri binarne vrijednosti. Sada ono što ću učiniti je jednostavno dodajte malo bijelog prostora, Samo zbog čitljivosti a. I napomena, ja sam samo ide premjestiti stvari odvojeno. Dakle prije, nakon, prije, poslije. Radim ništa zanimljivo drugima nego samo širi stvari tako da obavijesti svaki skup osam bitova je sada dva seta četiri bita. To je korisno jer heksadecimalnom Posebno je u modi jer svaki heksadecimalni znamenkasti 0 do f, ili točnije 0 do 15, može biti zastupljena s točno četiri bita. Drugim riječima, u heksadecimalnom ako vas želite predstavlja 0, to je samo 0000, četiri nule. A ako želite da predstavlja 15, to je 1111, što je četiri bita. A ako to ne učinite math, ako je to ona mjesto, ovo je mjesto 16s, koji će dati you-- a što se događa to-- žao, u binarnom, to će vam dati 15, one mjesto, dvojke mjestu, četiri i Mau mjesto. Zato mi dopustite da predložim da je set od četiri bita na lijevo je ono što ćemo nazvati f. To je najveći broj koji može predstavljati s četiri bita. A mi već znamo iz heksadecimalnom, f je najveći znamenkasti u heksadecimalnom. Imamo još jednu f tamo, više tamo dva. A za sada, samo se na vjeru što sam učinio matematike pravo i da je lijeva polovica tih bitova, 1101, je ista stvar kao i D u heksadecimalnom. A desnica 1000, samo je 8. I to je jedan je lako vidjeti, zar ne? 8 represents-- je u pravu ispod tog Mau mjestu. Dakle, imamo jedan u Mau stupcu i ništa u četiri, dvojke ili one. Tako sada više uobičajeno, ljudi su skloni napisati heksadecimalni znamenke kao što je ovaj, samo ih mljackati zajedno, i onda ih prefiks sa 0x. To ne znači ništa drugo nego vizualni trag na human-- Ovdje dolazi heksadecimalni value-- jer to inače ne bi moglo biti očito. Što će reći, u konačnici, da uzorak nula i jedinica, ili uzorak heksadecimalnom Znamenke ekvivalentno da ste će početi u potrazi za Problem je u Set 4 je this-- i problem Set 4 spec će hodati što kroz to u više detail-- ali shvatite kao svojevrsna Arcane kao to može izgledati na prvi pogled, da ćeš početi dobivati ​​tu puno. A u stvari, čak iu GDB je debugger smo uveli u ponedjeljak Dan uvodi u PSet 3, ide da često vam pokazati heksadecimalni vrijednosti samo zato što imaju tendenciju da se više Konvencionalni od decimale ili binarno u svijetu računala. Sada ćemo staviti ovo u kontekst. Mnogi od vas možda zapamtiti sliku ovdje, koji je došao iz čega? Vista, pa čak i prije nego da, Windows XP je ovaj nastup. Dakle, to je prekrasan krajolik. A u stvari, ako džaku oko online-- Mislim da je članak na Wikipediji, u kojoj je netko vrlo nevjerojatno iziđe naći to mjesto u svijetu postavljanje njegov ili njezin fotoaparat upravo pravo mjesto-- i to danas izgleda, ali volimo-članovima to je točno isto postavka. Ova slika, iako je u datoteku Format naziva bitmapa, b-m-p. I mi ćemo uzeti super brzi pogled na ono što to znači. Ali bitmap je samo drugačiji način predstavljaju slike još uvijek koriste piksela u 0s i 1s, u konačnici. No, brzi pogled, ima više zanimljiv potpis na početku datoteke. To nije samo tri bajtova, a postoji cijela hrpa obrazaca bajtova koji su unaprijed određeni smisao. Na primjer, negdje u Prvih nekoliko bajtova bitmap slike će biti veličine od slika, širina slike, visina slike, tako da Korisni metapodatke, ako će. Korisne informacije koje Photoshop ili bilo grafički program koji koristite Možda je zapravo stalo. Dakle, više o tome u Problem Set 4, ali ovo samo reći da na kraju dan sve formate datoteka koju ste koristili za years-- Microsoft Word datoteke, Brojevi datoteke, Excel datoteke, bilo koji broj formata datoteka koji bi mogli imati neke Poznato ekstenzija datoteke samo su 0s i 1s ispod haube. I ljudi su odlučili što su konvencije, ono obrasci 0s i 1s predstavlja Word datoteke u odnosu Excel datoteke, u odnosu na bilo koji broj drugih formata datoteka. Tako je u PSet 4, imat ćete priliku igrati s tim. No, što to znači imati struct. To je zapravo lijepo prikazali sada u ° C, koji ima samo nekoliko od dodatne značajke koje nismo pogledao još. To je prilično mala jezik i jedan od lijepih značajki o C je struct. Na primjer, ako htjela represent-- neka je kažu da želiš imati varijabla koja predstavlja student u nekom programu. Možda ste pisali tečaj Registracija program ili jezgra sadržaj alat, ili nešto slično. Što su komadići podataka koji se odnose studentu koji dolaze u obzir? Kao student je zastupljena s onim vrijednosti? Da? Imate naziv kao student. Što još tipični student ima? PUBLIKA: [nečujan] DAVID J. Malan: Dakle, ispričavam se. PUBLIKA: Age. DAVID J. Malan: jedna godina, ili rođendan ekvivalentno, Yep. Što drugo? PUBLIKA: ID broj? DAVID J. Malan: Pa identifikacijski broj, možda telefonski broj, možda spavaonica, ili kuća, ili koledž, ili nešto slično. Bilo koji broj komada podataka koji možda imate na popisu kontakata je ono što se moglo definirati studenta. Dakle, ako smo htjeli to učiniti u kodu, bismo mogli učiniti nešto jednostavno kao što je ovaj. Možda ćemo imati program, tako da ima recimo, int glavni (prazninu). A ako želim predstavljati Student sam možda, na primjer, niz naziva naziv za tog studenta, niz naziva spavaonica za tog studenta, možda int zove ID za tog studenta. I zato sam koristeći niz, ja morati vratiti i staviti CS50.h. Možda ću morati stdio.h. Pa neka mi preventivno učiniti oni, a ja sam nazvati ovu student.c za sada i spasiti ovo. I sad ja mogu učiniti nešto s tim varijablama. I samo ćemo pisati da je kao komentar u pseudo kodu, jer to nije interesantno ono što činimo za sada. OK, ovo je program koji nekako pohranjuje student. Što želim učiniti ako sam želite pohraniti dva studenta? Dakle, moj prvi instinkt ide sve biti u redu, čekaj malo, ako imam još jedan student zašto ne bih samo učiniti naziv niz 2, niz spavaonica 2, int ID2. I mi smo učinili otišao niz ovu cestu prije a ono što je naše rješenje za ono što se čini se vrsta hackish copy paste posao ovdje? PUBLIKA: Niz. DAVID J. Malan: Da, bismo mogli koristiti niz. Pravo ovaj vrlo brzo postaje nezgrapan. Morate vrsta proizvoljno početi imenovanja svih tih varijabli. A vi, ljudska, morate držati pratite li to u redu NAME2 odgovara s dorm2 odgovara ID2. To samo postaje u neredu. Dakle, to je puno lakše, sjećam od prije nekoliko tjedana, samo da se zove string imena a možda nam tri od tih. A onda možda imamo string dorms i imaju tri od njih, ili sa konstantom, int IDS i imaju troje njih. Ali čak i sada to osjeća malo neuredan, zar ne. Govorimo o studentima i ipak Ja sam stvarno prebiva na niskoj razini pojedinosti provedbe. Student je ime i spavaonica i ID. Zašto ne mogu jednostavno proglasiti varijablu zove student i nazvati to je. A ako želim još jedan student, zašto ne bih jednostavno nazvao t. Ili ako želim hrpu studenata, zašto ne bih jednostavno kažu imam cijeli razred studenti i to tri od njih. Drugim riječima, zašto ne mogu doći s vlastitom vrstom podataka, pod nazivom Studenti, unutar kojih je ime, je ID je spavaonica, je bilo koji broj drugih područja. I ispada vas može učiniti upravo to. Dakle C ima tu značajku pod nazivom struct. To je značajka jezik koji nam omogućuje da učinite upravo to. Idem samo naprijed i otvoriti structs.h gdje ćemo vidjeti Sljedeće definicije student. Ispada - a to je još jedan jednostavniji od onog koji uključuje ID Prije nekoliko trenutaka. Ako želite da se s vaša domaća tip podataka, i uz int i char i plutaju i sve ove druge koje postoje, možete učiniti doslovno pisanje typedef struct, onda neki vitičastih zagrada, unutar koje popis varijabli koje želite povezati s ovim novim prilagođenim podacima upisati kao ime i domu, a onda nakon vitičastih zagrada vam dati ime na novi tip podataka. Tako je, primjerice, student. A što je lijepo o tome je da je ako gledamo odgovarajućeg koda, Konvencija, prva od svega, je da stavite ovo u datoteci pod nazivom nešto dot sati, zaglavlje datoteke, što nemamo počeo se koristi previše. Ali ćemo početi pomoću vrlo malo sada. I što možemo učiniti s tim, u konačnici, u ovih nekoliko linija koda se izjaviti upravo to tip podataka, student. A sada ćemo ga koristiti. Idem sad ići u datoteka zove structs1.c. I neka je pogledati na Nekoliko obilježja ovdje. Dakle, stvari se ovdje uglavnom poznato, a mi ćemo vratiti na ono što nije upoznati u samo trenutak. To, naravno, je uključujući i moju vlastitu zaglavlje datoteke, što je novo, kao i, osim za PSet 3, gdje, Podsjetimo, imamo helpers.h. Tako možete sjetiti #include helpers.h. Zašto da ja pomoću citati umjesto kutnih tipkovnici? Kada sam birati između njih? Gotovo uvijek sam činiti koristiti pod kutom zagrade. I onda, odjednom na crta šest sam koristeći dvostruke navodnike. Zašto bi to moglo biti? Da? PUBLIKA: [nečujan] DAVID J. Malan: To je stvarni, što? PUBLIKA: To je u vašem IDE. DAVID J. Malan: Da, to je u mom stvarnom IDE. I ne prebiva na IDE, jer to je samo alat koji koristim. To je u mom struje katalog, posebno. Dakle structs.h je moj datoteka Nije instaliran u IDE, u samom operativnom sustavu, a to je u mom trenutnom direktoriju. Tako je konvencija ako želite uključiti svoj zaglavlje datoteke, ti samo koristiti dvostruke navodnike. Što mi zovemo ovo u linija 8, općenito govoreći? To je što? #define nešto. To predstavlja konstante, zar ne? Ako želite imati vrijednost u svom programu da koristite cijeli hrpa vremena, to je Dobar konvencija to faktor van, proglasiti ga, s hash znak definirati, onda, po konvenciji, u svim velika slova word-- iako to nije strogo potrebno, ali to je ljudska konvencija kapitalizirati konstante tako da oni iskočiti na što visually-- prostor i onda je vrijednost želite biti ekvivalentno ime konstantna je. Ne točka-zarez, ali jednostavno slijediti taj obrazac ima. Dakle, ono što ja radim u ovoj stvarnoj koda. Tako ćemo pogledati glavni program ovdje. U skladu 12 jer sam Uključene structs.h, Ja sada imam magično na mom zbrinjavanje nova vrsta podataka. Ne samo imati pristup int, i char, float i te niz, i plavo i drugi. Ja sada imaju pristup vrsta učenik podataka. Dakle, u skladu 12, ja sam kombinirajući dvije ideas-- jedan običaj tip podataka i dva, pomoću niz. I tako je u ovom programu, ako Želim zapravo podržavaju Tri različita studenti u mom programu, ja može se jednostavno reći dajte mi varijablu nazivaju studentima, svaki od kojih je tipa studenata koji je moj tip običaj podataka. I, posebno, dajte mi tri od onih u mom nizu. I što sad da radimo u ovom programu? Evo samo za petlje iterating od 0 do 3, jer je to što je vrijednost studenata. Samo sam pitajući korisnika daj mi ime studenta. A onda u redu 17, mi imaju uglavnom poznate linije. Mi imamo staru prijateljicu GetString na desnoj strani. A što komad sintakse je očito novi, Ako ste nikada nije programiran u C prije, i nikada nisu koristili konstrukt? Da? PUBLIKA: U .name. DAVID J. Malan su: .name. Ali to nije previše skok, jer sada studenti omeđi ja daje vam ja-og učenika. A ako želite roniti unutar te strukture, ti samo koristiti jedan period i onda naziv varijable iznutra, ili vlasništvo unutar koje Želite da biste dobili pristup. Isto tako onda, ako sam tada upozoravaju Korisnik, daj mi studenta spavaonica, što slično može pohraniti da string u varijablu domu unutar te studentske strukture. I sada se stvari malo fancy. A to će izgledati na možda puno vrlo brzo. Ali to ćete vidjeti mnogo više u PSet 4, pa neka je samo pogled na njega sada. Ispada da je u redu 23 do 38, što misliš da ću možda radiš? Ja sam uklonio komentare za danas, ali verziji koda online za Referentna ima sve komentare. Što mi je činiti da se radi? PUBLIKA: Spremanje datoteke sa svima informacije koje je korisnik unio. DAVID J. Malan: Da, točno, to je novi način da smo gledajući dva, jedna značajka C, gdje mogu kreirati vlastite datoteke. Do sada, gotovo svaki program si napisao je bez državljanstva. Čim se to radi radi, to je to. Nema memorije ili sjećanje na to. Nema datoteka spremljena. Ali ako želite spremiti ulaz koji ima dogodilo, kao u igri ili programu ovako ispada da možemo učiniti. A vi ćete vidjeti više u PSet 4 i Odjeljka. No, ova linija 23 bitno stvara datoteku pod nazivom students.csv. A možda ste vidjeli prije. Čak i ako ste nikada nije studirao CS prije, CSV je odijeljene zarezom varijable. To je kao vrlo siromašan čovjek verzija Excel datoteke, što znači da se može biti otvorena u Excelu i na Apple brojkama, i ima retke i stupce. Ali to nije vlasnički Format poput Microsofta ili Apple. To je samo zarez odvajanja vrijednosti koje ćemo vidjeti u jednom trenutku. I samo uzeti pogodak. U skladu 23, na samom kraj, moj drugi argument na ovu novu funkciju pod nazivom f otvoren otvorenom datotekom w. Što bi W označava? Da? PUBLIKA: To vam omogućuje pisanje u datoteku? DAVID J. Malan: To vam omogućuje pišete na datoteku. Dakle, postoji nekoliko varijanti da možemo priključiti ovdje. Ali ako se samo želite čitati datoteka, koji je na to gledate i to pročitao u memoriju, te samo koristiti citat citat "r". Ako želite pisati na datoteka, koristite citat citat "w". Tu je također dodati i par drugih stvari ako želite mijenjati postojeće datoteke. Sada ćemo zadržati vidiš stvar, a onda ćemo se vratiti na liniju 24. NULL, ispostavilo se, je posebna vrijednost koja može se vratiti na određene funkcije ako nešto pođe wrong-- Ako datoteka ne postoji, Ako ste ponestane memorije, ili hrpa drugih pogrešaka. No, za sada, neka je samo pretpostaviti da je ovaj samo konvencionalni provjere pogreške. Ovdje u skladu 26, ja sam iterating od 0 do 3 nad svim svojim studentima. A to je vrsta vrsta nove funkcije, fprintf, ali samo uzeti pogodak. Ako printf je samo ispis formatiran string, Što fprintf vjerojatno znači? PUBLIKA: Ispis u datoteku. DAVID J. Malan: Ispišite formatiran string u datoteku. To je ono što dodatno f način je datoteka. I novi prvi argument mora biti varijabla koja predstavlja datoteku. Onda imamo samo jedan format string kao printf. I iako je to sintaksa je novo, to samo znači priključiti ime studenta, plug-u studentskom domu, a zatim s fclose, zatvorite datoteku. A onda lastly-- to je novo a mi ćemo se vratiti na ovo Prije long-- sam oslobađajući student iz razloga koja se dogodila iznad postoji. No, mi ćemo se vratiti na to prije long-- to je zbog načina GetString je zapravo rade ispod haube. Tako ćemo uzeti brzo pogledati ovdje. Ako sam upisati ls u mom imeniku, primijetiti da ja ne imati datoteku pod nazivom students.csv, jednostavno ne postoji, ne postoji. Dakle, ako ja sada sastaviti ovaj program, bi konstrukt-1. / konstrukt-1, a ja ću ići naprijed i upišite Andi, koji živi u Berkeleyu na Yaleu. Mi ćemo imati Rob koji živi u Thayer ovih dana. I neka je doći do gdje je, mislim, Maria je u Mather, ako sam dobro sjećao. Dakle, ništa ne čini da se dogodi. Ali ako upišete LS sada, postoji students.csv. Idemo naprijed i otvoreni students.csv. To je opet vrlo lagana format datoteke. Ali ja jednostavno nisam usvojila Konvenciju da imam dva redaka i stupaca ovdje. Prvi stupac je ljudi prva imena. Drugi stupac je studenta domu ili koledž, ili kuću, ili sitnica. I sad sam spasio ovaj trajno u datoteci. Dakle, to nije sve što je zanimljivo. No, to je samo odskočna daska sada kako bi se mogli oduprijeti podatke trajno. Pa da vidimo sada što više možemo učiniti s tim i drugim značajkama. Ali prvo, bilo kakva pitanja? To je mnogo, a to je bilo brzo. Ali vidjet ćete puno više PSet 4, i. Da? PUBLIKA: Da li postoji način da se nastaviti dodavati imena za tu datoteku? DAVID J. Malan: Dobro pitanje. Da li postoji način da i dalje dodavanje imena na tu datoteku? Da. A, u stvari, ako kraj do ponovnog otvaranja datoteke, ti bi koristiti citat citat "a" za dodati, što bi samo dodati novu liniju, Nova linija i opet, točno. Dobro pitanje. Ostala pitanja? Da? PUBLIKA: Ako vodio Program opet upravo sada, bi se držati dodajući imena u podnijeti ili će se otvoriti novi datoteku? DAVID J. Malan: Ah, dobro pitanje. Ako ponovno pravu vodio program Sada, možda upisali u novim imenima, će dodati datoteke ili prebrisati datoteku? Potonji, jer sam Ne koristite dodati modu. I zato sam samo slijepo otvoriti datoteku za pisanje, to samo će prebrisati datoteku. Tako sam doista bi trebao učiniti je dodati, ako želim zapravo imaju dugoročno baze podataka. Sada CSV korisno, iskreno, ni za kao ako ste writing-- a mi ćemo na kraju vidjeti kasnije u semestru kada koristimo CSV-ovi za druge svrhe. Ako želite pohraniti sve ljude koji su registrirani za neki događaj, ili se prijavili za svoj student skupina, ili nešto slično, pohranjivanja podataka u ovoj vrsti format je super povoljno. Jer doslovno, ako ja su preuzeti ovu datoteku. Mogao sam double-- i neka je zapravo probati ovaj ako imam Excel ili brojeve ovdje. Idem desnim klikom ili upravljačke kliknite moj dosje. Ups. Desnom tipkom miša ili upravljačke kliknite moj dosje. Hajde, moj miš ne surađuje. Download-- ću preuzeti sve datoteke ovdje tako samo tako ja mogu zgrabiti ovo. I neka je vidjeti ako to radi students.csv-- prvi put Ja sam aktivirati. Sada žele vidjeti moje kontakte. Sada, trebam registrirati. Pogledajte kako je lako za korištenje CSV-ovi? Da, držati ga do danas. OK, sada smo spremni za klasu. OK, oh, što je novo? U redu, u neposrednoj blizini. To je čarobno. OK, sada moramo ažurirati. A sad, to što je zaboravio file sam prvotno otvorena, ali ono A- tamo idemo. U redu, tako da sada imamo Excel datoteka. Hvala. U redu, tako da ono što sam učinio je jednostavno dio. Naravno da sam mogao unaprijed instaliran Excel ili Brojevi, ili što god programa. No, to je lijepo, jer sada mogu manipulirati podaci u standardnom formatu. Dakle, sada ćemo kontekst prebaciti na kojoj smo stali Posljednji put, što je za početak skinuti trening kotačima. Ali prvo, nisi pogledajte ovaj raniji ručak opet događa ovdje na vatru i Led u Cambridgeu, Sitar u New Havenu. Prijavite se na web stranici CS50s ASAP pridružiti CS50 studente i osoblje. Tako smo uzeli trening kotačima off je u ponedjeljak kako je follows-- Niz je proglašen u CS50s knjižnica za neko vrijeme. I to je lijepo, jer omogućuje nam govoriti o varijablama kao kompletna riječi i rečenice i još mnogo toga. Ali ispada string ne postoji. To je samo sinonim, ili pseudonim, da smo stvorili nešto što zapravo je malo više Tehnički zove char *. I doista, vidjeli smo primjer programa u ponedjeljak da ne ponašaju baš kao što smo i očekivali. To je bio varalica, usporedite-0. I podsjetiti da usporedite-0, ako je Ja rekompilirati programu u ponedjeljak i pokrenuti usporedite-0 i upišite mama u mala i mama malim slovima opet. Program je inzistirao da upišite različite stvari, iako mama, sve u mala, identičan vizualno. Dakle, što je bio kratki odgovor zašto se računalo misli te dvije žice su različiti? Da? PUBLIKA: [nečujan] DAVID J. Malan: Tako je. Dakle, mama, prvi put Ja ga upisati, se pohranjene negdje u mojoj računala memorije, ali na drugom mjestu nego drugi put sam upisati mama. Sada je sigurno mogao biti optimiziran. Računalo može biti pametan i shvatite ove dvije žice, hej, oni su identični. Dopustite mi da se ne redundantly ga pohraniti. Ali računala ne raditi Optimizacija osim ako kažem im da. Dakle, po defaultu, oni su Samo ću završiti na dva različita mjesta u memoriji. I tako bi biti jasno, kada se smo usporedili dvije žice, Prvi je bio pod nazivom e, drugi se zvao t, što je posebno bio sam uspoređujući ovdje na liniji 13? Da. PUBLIKA: To je mjesto u memoriji da je varijabla će ukazati. DAVID J. Malan: Točno, bio sam Uspoređujući mjesto u memoriji da te varijable ukazao na. Pa konkretno, ako je mama bila na byte broj 1 i 2, i 3, i 4-- zato zapamtite kosu crtu 0 treba biti skroz na kraju. I druga instanca mama, m-o-m, je na adresi 10, 11, 12, i 13. Bio sam uspoređujući 1, koja adresa, koje mjesto u memoriji, od 10, što je očito nije isto. 1 nije 10. Dakle, to je lijepo u tome to je prilično jednostavan. Ali to je problematično ukoliko ne možemo činiti za usporedbu nizova. Dakle fundamentally-- i na ovoj niskoj razini, ako ste htjeli provesti program za usporedbu dvije odvojene riječi da korisnik utipkao za kvalitetu, oni postroje char za char, samo u općim uvjetima, ono što trebamo učiniti, očito? Nije dovoljno samo pogledajte te dvije adrese. Što trebamo učiniti? Da? PUBLIKA: ponoviti kroz string [nečujan]. DAVID J. Malan: Da, neka je ponoviti kroz niz. Idemo koristiti za petlju, while petlji, ili sve što ste najviše sviđa. I ako imamo dvije žice negdje u memoriji, pogledajmo svaki ih prvi znak, onda svaki drugi karakter, zatim treći, i četvrti, i peti, dok smo hit što posebnu Sentinel vrijednost? PUBLIKA: [nečujan] DAVID J. Malan: Da, backslash nula, u kojem trenutku je u svakom nizu možemo odlučiti to je to. Jesmo li se podudaraju svaki lik? Ako ne, return false. Ako je tako, povratak istina. I tako to je upravo ono što ova verzija programa usporedite-1.c radi. To je identičan onome što smo Pogledao je u ponedjeljak, osim da sam stečen osloboditi od riječi string-- iako da nema funkcionalni impact-- sve Radim sada uklanjanje neke vizualne trening kotačima, ali jasno vidjeti da je s i t su adrese. I to je ono što je zvijezda, zvjezdica, predstavlja je adresa, inače poznat više tehnički kao pokazivač. Dakle, kada kažem s na linije 9 i reći char * s, to ne znači da mi dati niz. To znači daj mi varijablu čija svrha u životu je da pohraniti adresu. Zato ću staviti adresu niza u njega. I doista, GetString, biti Jasno, ne vraća niz. To ne vrati mama backslash nula, sama po sebi. Što GetString posebno i upravo se vratiti? PUBLIKA: [nečujan] DAVID J. Malan: adresu, adresu prvog znaka u nekom nizu je stečen. I tako sada vidimo opet posebna ključne riječi. I, aludirao sam na to ranije. To će biti dobar konvencije kako ćemo vidjeti i opet se sada. Ja provjeravam da da a nije null i t nije null. Budući da na temelju moje stvarno Brzo spominje ranije, što bi moglo značiti ako se ne vrati GetString adresu, ali N-U-L-L, što je opet, neke posebne vrijednosti? PUBLIKA: Pogreška. DAVID J. Malan: To je pogreška. Nešto je pošlo po zlu. A što se obično bi se moglo dogoditi, pogotovo s strings-- što bi moglo biti nepoznatog duljine u advance-- možda računala ' iz memorije, možda ste upisali u takvom dugo riječ ili rečenica ili zalijepiti tako veliki esej postoji samo nedovoljno memorije. I tako GetString ne mogu vratiti adresu cijelu stvar, pa to samo vraća ništa. A ona kaže pogreška se dogodilo po povratku posebnu NULL vrijednosti. To je nulta adresa, da se tako izrazim. Sada ispada C dolazi s funkcija koja se tu iteracija. Nemamo provesti ovo s for petlja ili while petlji sebe. Možemo koristiti funkciju, zove jezgrovito, promiješati comp ili string usporedbu, čiji je svrha u životu je da učinite upravo to. Možete mu dati dvije smjernice, dvije adrese, i to će ići na tim adresama a zatim usporedite pismo za pismo za pismom za kvalitetu, zaustavljajući se samo kada je ono što je istina? Kada intuitivno treba promiješati comp Ponavljanje prestanu, samo da bude jasno? Kad pogodi obrnutu kosu crtu 0 u bilo niz, na kojem trenutku može odlučiti je sve uskladiti, ili je došlo do neslaganja? Dakle, ako smo pokrenuti ovaj sada i pokušati naša mala slova igre, kako bi usporedili-1, ./compare-1 i upišite mama malim slovima oba puta. Sada je ista stvar. A ako sam to učiniti opet s mala i onda možda veliko. Sada je doista razlikuje između gornje i mala. Dakle, nije sve što je teško ili čarobno, ali sada ne objasni što se događa ispod haube. Pa što još možemo izdvojiti od ove vrste lekcije? Tako ćemo pogledati ovo. Ja ću ići naprijed i napisati Brzo Program se ovdje zove copy-0. A sada idemo naprijed i zapravo učinimo this-- s copy-0, pogledajte što sam došao ovdje. Prvi put sam reći korisnika, nešto reći. Onda sam se niz i ja ga pohraniti u s. Tada sam provjeriti da li je jednako jednak NULL, samo povratak 1. Dakle, ovo je samo standardni provjere pogreške. Ništa zanimljivo nije dogodilo. A u stvari, ako smo dobili osloboditi od pogreške provjeru, ovo izgleda kao tjedna 1 kôd Trenutno. Ali ja sam počeo da biste dobili malo bolje o tome. Sada, u skladu 16, prije tjedan dana, možda čak i par dana ili minuta prije moglo bi se reći linije 16 stvarajući varijablu naziva t i kopiranje s u nju. I to je savršeno razumno takeaway. No, točnije sada. Što se događa u redu 16? Ono što je uzimajući kopirati s desna na lijevo? Da? PUBLIKA: Je t dobivanje adresu s? DAVID J. Malan: Točno, t dobiva adresu s. Dakle, da bude jasno sad, ako odem natrag na to ranije primjer i ja izvući ono što sam upisali u. A ono što sam upisali in-- evo je i ovdje je ono što sam upisali u negdje u memorije, mama i onda backslash 0 koje je dodao za mene. Ono što sam pohranjene ovdje, podsjećamo, To je u položaju 1, 2, 3, 4, to je ono što je trenutno u s. Dakle, ako na liniji 16, kažem dajte mi još jedna varijabla zove t i trgovine u u vrijednosti s, što je dobiva pohranjene ovdje neće mama već samo broj 1. Dakle, ako gledamo naprijed u ovom programu Sada, ono što će se dogoditi? Dakle, primijetite da postoji ova funkcija možda ćete Koristio to prije nekog vremena za Cezara, ili Vigenere, ili možda uopće ne. Tvrdim s mojim printf sam će kapitalizirati kopiranja t. Prvi u redu 19, brzi razum ček, strlen provjerava duljinu t. Jer ja ne želim pokušati kapitalizirati nešto ako nema string tamo. Ako korisnik samo pritisnite Enter, nema ništa kapitalizirati. Dakle, ja ne želim raditi liniju 21. Dakle, linija 21 je kapitaliziranje koje slovo, očito, ut? PUBLIKA: m? DAVID J. Malan: Izgleda kao da je kopiranje koja? PUBLIKA: m. DAVID J. Malan: Uh, m. U redu, tako da prvi m, jer obavijest da sam prolazi na toupper, koji Ako ste nikada nije vidio da je samo funkcija iskoristiti kao svoj ulaz. t nosač nula znači dati ja nula karakter t. I tako kako se to Promijeni sliku, da bude jasno? Ono što treba da se prepisivati ​​ili mijenjati s obzirom na s i t i mama backslash nula. PUBLIKA: [nečujan] DAVID J. Malan: Da, tako da je ovo jedna ovdje jednostavno treba dobiti promijenio to-- popraviti this-- treba se mijenjati do kapitala m. Ali sada, izgleda kasnije u Program, ako sam ispisati s i t kao što sam ovdje čist, gledati što je će se dogoditi ispis s i t. Dakle, napravite copy-0, ./copy-0. Dopustite mi ići naprijed i upišite u mamom u svim malim slovima. Obavijest i izvornika i kopija su kapitalizirani. Zašto? Pa, s i t su oba upućuju na, ako hoćete, isti komad memorije. I iskreno, to je sve stvarno uninteresting-- činjenicu da smo pomoću adresa nulu ovdje. Mislim, ja stvarno ne briga gdje stvari u memoriji. Žao mi brisanja malo previše. Ali ja stvarno ne briga gdje su stvari u memoriji. I tako, upravo ono programeri imaju tendenciju da razmišljaju o tome je da kada se govori o adresu, ili pokazivač, koga briga gdje je u memoriji. Ne zanima me je li to na bajt jedan ili milijardu. Ja samo stalo da se ovaj varijabla je učinkovito pokazujući na taj komad memorije. I tako, sada, umjesto dosjetka više proizvoljnih memorijskih adresa, neka je samo početi crtati pokazivače što upućuje, kao strelice. Dakle, ono što je i t stvarno jesu, prema ovom programu, jer kako sam stvorio t, to je samo dvije zasebne varijable pokazujući na istom komad memorije. I nije me briga gdje su. Tako možemo apstraktno daleko tom detalju. Pa kako mogu popraviti ovo? Ako želim napisati verziju kopiju program koji zapravo kopije string i kapitalizira se samo kopija, samo intuitivno, što je dobio biti sastojak za naše rješenje? PUBLIKA: [nečujan] DAVID J. Malan: Trebamo što? PUBLIKA: komad memorije. DAVID J. Malan: Moramo još jedan komad memorije, zar ne? Ne znamo kako to ipak nužno. Ali ja nekako morati to dogoditi tako da je izvorni mama malim slovima završava u ekstra komad memorije. I onda kad sam promijeniti kopiju, ja Ne želim promijeniti tu kopiju ovdje. Ja umjesto toga želite promijeniti samo ovo kopija tako da je izvorni je nepromijenjen. Dakle, neka je vidjeti kako bismo mogli to učiniti. U copy-1, koji je već oduzeta komentara ali je komentirao na internetu. Mi umjesto toga učiniti following-- njih linije su identični, daj mi niz i nazvati to je. Ali sada pogledajmo jedan od naših složena, ali posljednji složenosti za neko vrijeme, linija 16 radi upravo to. Dakle, ako je vaš udoban sa slika mi samo drew-- dajte mi novi komad memorije, kopirati sve u nju, da vidimo kako ćemo prevesti to kod. Dakle linija 16, na lijevoj strani, char * t daje mi tu kutiju ovdje. To je sve što radi. Na desnoj strani, m Alloc ili malloc, je dodjela memorije, super fancy, grobni način samo govori dajte mi komad memorije. Koliko memorije trebamo? Pa, je vrsta velikog izražavanja. Ali da vidimo što piše ovdje. Dakle, to je, naravno, dati se ja duljina niza s. Dakle, mama to bi trebalo biti što? Dakle, samo tri, zar ne? mama je tri znaka. Vi ne brojati backslash nula kada vas govoriti o duljini niza to je zapravo ljudska vidljive slova. Pa mama, pa to mi daje 3. Ali čekaj malo, ja sam sada dodavanjem 1. Zašto ja zapravo želim izdvojiti 4 bajta, a ne samo 3? Da? PUBLIKA: Za sentinel vrijednosti? DAVID J. Malan: Točno, za tu sentinel vrijednosti. Za obrnute kose crte nula, Trebam 4 bajta ukupno. Dakle, trebam duljinu od niza plus 1. I onda samo za dobru measure-- iako se na tom sustavu, uvijek će biti 1-- govorim pomnožite to po veličini char. Ispada sizeof je operater u C koji samo ti se govori broj bajtova koji je potreban za određeni tip podataka. To ne radi za polja, obično, ponekad ne. No, u općem slučaju, br. No, to će mi reći koliko bajtova char je, što ispada je uvijek 1. Dakle, to je kao pomnoži s 1. Pa super grobni potrazi linija koda. No, sve je to ipak daje mi komad memorije. No, to čini da se kopiranje ništa u tu memoriju? Ne još. I tako Što mi je na liniji 22, a 23, 24, 25, dobro, jednostavno sam to učiniti. A to je vrsta stara škola stvari sada. To je kao PSet 2, gdje ti si samo pomicanjem stvari oko u memoriji, odnosno u žice. Tako sam iterating od 0 do duljina niza s. I ja kopiranje i-th karakter u s u i-tog karaktera u t. I zato što sam, programer, napravio svakako izdvojiti točno onoliko bajtova kao što mi je potrebno, to je savršena jedan-na-jedan odnos. I kopirati mamu u mala slova na novi. I onda na kraju, ja tu liniju. I tako je učinak samo kapitalizirati ovaj t ovdje. Dakle, puno apsorbirati, ali ako samo uzeti u obzir što se zapravo događa na ispod haube se samo kreće ovi bajtova okolo, sve što Potrebno je riješiti ovaj problem samo da nam ovo komad memorije. Sada na rizik neodoljiv, neka mi pokazati jedna primjer koji je gotovo identična, osim što je ovaj jedan linija koda. Dakle, ovo je haker verzija ovog programa, ako hoćete. Ali neka je samo destilirati je u tome što se događa. Linija 24 koristi se ovaj t Nosač i dobiva e nosač sam. Sada, ja sam to mijenja mnogo više zagonetan zvijezda t plus 1 jednako zvijezda s plus 1. Dakle, što se događa i zašto imamo karakter zvijezda? Vidjeli smo zvijezdu prije, a to se koristi drugačije ovdje. Mi smo ranije vidio char *, sad vidim zvijezdu na početku, a to je u redu. Jer ispada mi možete vrsta zaključiti samo od onih prvi Načela što se događa. Dakle, samo da bude jasno, što je s? Prošli tjedan, bila je to niz. To nije dovoljno više. Što je s, konkretno? PUBLIKA: [nečujan] DAVID J. Malan: To je pokazivač. To je adresu Prvi znak mi upisali u. U redu, što je t? PUBLIKA: [nečujan] DAVID J. Malan su: adresu prvog bajta ut, koji komad memorije preusmjeriti. Tako ispada da kad smo ponoviti od 0 do na žici length-- prije svega, ja započinje na 0, jer je ove stare škole za petlje stvar. Dakle, samo zbog jednostavnosti, neka je Pretpostavljam da je prvi redak koda je zapravo samo to, zar ne. Ako i je nula, dodajući nula nešto vjerojatno se neće imati učinka. Pa što je ovo rekao? Ispada da zvijezde Operater u ovom kontekstu je dereference Operater, koji je samo fancy način govoreći ići na sljedeću adresu. Dakle, ako je je adresa prvog lik u ovom komad memorije, * s znači ići tamo. I zato smo izvučeni slika na ovaj način, možete usvojiti Sljedeći mentalni model. Ako je ovo s, a ti kažeš * e, * a vrsta kao žljebovi i ljestve, ako se sjećate igru ​​iz djetinjstva, je kao slijediti taj strelicu i otići na adresu. * t je ista stvar. Dakle, početi ovdje, idite na svom komad. Ne mogu samo osloniti na ovaj zaslon na taj način. * t znači da ide ovdje. A onda, za petlju samo rekavši premjestiti ovaj lik ovdje, premjestiti ovaj lik ovdje, premjestiti ovaj lik ovdje. Ali kako ću to učiniti incrementation? Moram poništiti ono što sam upravo izbrisana. To je ono što se općenito zove pokazivač aritmetički, što znači matematike s adresama. Ako u ovo petlji, Stalno povećavati ja, i s je adresa i t je adresu, ako sam samo držati dodajući 1, to samo znači držati se kreće prema naprijed, i naprijed, i naprijed u memoriji. To je kao Oxford Street je ulica koja CS zgrada na. CS zgrada je na 33 Oxford Street. Dakle, ako ste bili učiniti 33 Oxford Street plus 1, koji vam donosi 34 Oxfordu Ulica, zatim 35 Oxford Street, zatim 36 Oxford Street, što god oni Zgrade su zapravo - ako oni postoje. I tako, to je sve što smo radili ovdje s pokazivač aritmetika. Dakle, to je super Arcane način od sebe izražavanja. Ali sve što se događa ispod haube samo je slijedeći ove adrese, kao što slijedi kartu, ako hoćete, ili nakon strelice poput smo izvučeni na zaslonu. OK, dosta probaviti. Svako pitanje o sintaksi, koncepti, upućuje, malloc ili slično. Da, ovdje na prvom mjestu. PUBLIKA: Pa gdje je ta kaže * t jednak toupper * t, je da će kapitalizirati sva slova ili just-- DAVID J. Malan: Ah, jako dobro pitanje. Tako je u ovoj liniji ovdje, 31, će to kapitalizirati prvo slovo ili sve slova. Tako ćemo odgovoriti odlaskom natrag na prvim načelima. I prvi principi ovdje mislim samo idite na osnovnim definicijama onoga što je uključen. Dakle toupper je funkcija da kapitalizira char. To je sve. * t znači ići na first-- idite na adresu u t. Dakle, na slici, ako je to komad memorije smo dodijeljeno sa malloc, i to je t * t znači ići ovdje. U međuvremenu, ti prolazi ta vrijednost, mala m da toupper, da ste dobivanje natrag kapital M, gdje ste stavljajući ga? Vi ste stavljajući ga u tom istom mjestu. I tako ta logika onih Osnovne definicije to je samo kapitaliziranje prvo slovo osim ako ponoviti sa I ili za petlju ili while petlji, to neće učiniti ništa više nego što ga pitati. Dobro pitanje. Da? PUBLIKA: Zašto ste koristiti dereference metodom nego Niz? DAVID J. Malan: Ah, dobro pitanje. Zašto bi koristiti dereference Postupak umjesto metode polja? Nema posebnog razloga, da budem iskren. A, u stvari, za to vrsta, primjerice, pravo, Samo tvrdeći izradu Program složeniji, više oči stakla više, ljudi checking out jer ovo izgleda super Arcane, ali iako to rade istu stvar. I tako, iskreno, ovo je nepotrebno vizualno složen rješenje problema. To je još uvijek dobar dizajn, pet od pet za projektiranje, da li je u nosač zapis ili pokazivač zapis. But-- pogotovo kad smo dobili kasnije u tijeku u PSet 5 kad smo provesti taj rječnik koji Ja sam spomenuo par times-- mi zapravo ćemo brigu o niska razina memorije adrese da smo stvarno shvatiti što se događa. No, za sada, ispada da je ovaj linija koda ovdje uglatim zagradama stvarno ne postoje. Oni su ono što se zove sintaktička šećera, što je samo jedan neobično hladan način rekavši prevodilac pretvara četvornih zagrade se da matematički izraz. Tako da je ljudsko konvencija da bi mogli samo napisati ove vrlo razumljiv zagrade. No, ono što je prevodilac, zveket, stvarno radi bilo koje vrijeme pišete što je istaknuto u skladu 24, ispod haube je stvarno pretvaranja u to. To je samo još ugodnijim kao čovjeka za čitanje i pisanje koda poput linije 24. No, s vremenom oni Trening kotači previše ispasti Kada jedan vlastiti komfor dobiva jači. U redu, tako da je to onda podsjetiti Bila je to najveći problem smo naletjeli. I to je ono što je izazvalo ovu cjelinu prokleto razgovor o pokazivača, i adrese i kopiranje stvari. To je zato što smo spotaknula to glupo, glupo pitanje, pri čemu Ja provodi logically-- s Lauren ovdje na demo i sok od naranče u milk-- savršeno algoritamski točna funkcija za zamjene dvije varijable ' vrijednosti, ali je prokleta stvar nisu imali bilo uporni, ili stalna, utjecaj na moj broj. A zašto je to bilo? Ukratko, zašto je to Provedba swapa logično točna, ali nema utjecaja na varijable koje se prenose na njega, kao što su X i Y glavni? Što je suština tog pitanja? Da? PUBLIKA: Zbog promjenjiva napravio kopije varijable u prolazu kroz funkciju. DAVID J. Malan: Točno, kada prođe varijable u funkciji ili argumenti u funkciji, oni su donio primjerak, koji znači da ćete dobiti identičan gleda Uzorak bitova za X i Y, naziva ovdje i b. A vi možete učiniti ništa Želite s tim kopijama, ali oni će imati nikakav Učinak na funkciju poziva. A, u stvari, došli smo da slika na zaslonu, opoziv Posljednji put, pri čemu, ako vas stvarno mislite o tome što je događa ispod hood-- ako To je memorija računala, i ovdje je komad memorija se koristi za glavno, ovo je komad memorija se koristi za zamjenu, pa čak i ako je glavna ima varijabli, X i Y, zamjena može imati jednaki gleda Vrijednosti, od kojih oba su 1 i 2, ali oni su u potpunosti različite komade memorije. Dakle, trebamo rješenje za to. I iskreno, čini se da smo se sada ima rješenje za ovaj problem, zar ne. Ako sada imamo mogućnost da manipulirati stvari putem pošte i, na neki način žljebovi i ljestve stil, slijedite ove strelice i ići bilo gdje želimo u memoriji, ne bismo mogli riješiti ovaj problem prolazi od Glavni swap ne vrijednosti želimo swap, ali jednostavno intuitivno ono što bismo mogli proći za swap umjesto toga? [Ubacivanjem GLAS] DAVID J. Malan: Zašto ne bismo jednostavno prođe to adrese, zar ne? Zašto ne dajemo swap Karta blago, ako hoćete, da to dovodi do Stvarni vrijednosti x i y. Idemo swap, zapravo promijeniti one izvorne bita, a ne samo u prolazu kopije bitova. I tako, u stvari, to je ono što je će biti otopina. Ova verzija ovdje očito loše i manjkav. A sada, na prvi pogled, to samo izgleda kao što smo dodali hrpu zvijezda slučajno i prešli naše prste da će sastaviti. No, to bi se sada sastaviti. Ali da vidimo što ovo znači. I, na žalost, autori C mogao izabrati drugi simbol da bi ovo malo jasnije, ali operater zvijezda ima drukčije značenje u dva različita konteksta. I mi smo vidjeli i, ali neka je razlikovati. Tako se na vrhu tamo, kad sam promijenila aib od toga INT-a u loše Verzija int zvijezde, A i B, Prije toga, bili su cijeli brojevi. Što su A i B sada dobro, zelena verzija? Oni adrese. Adrese što, da bude jasno? Adrese brojeva. Dakle činjenica da sam rekavši int zvijezda sredstva to je adresa cijeli, posebno. Tako sada primjetiti u linija koda, nešto drugo promijenio previše. tmp ostaje isti, jer je to je samo privremeni broj, nema memorije magija postoji. No, sada treba zvijezdu. A, u stvari, svaki Drugi spomen A i B, primijetiti da sve što je mijenja od crvene do zelene je da sam prefixing te varijable sa zvijezdama. Jer ja ne želim kopirati i b. Jer ako ja samo kopirati A i B i zamjenu A i B, što sam ja zapravo zamjene? Samo adrese, želim mijenjati što je na tim adresama. Želim ići tamo. I tako je operator zvijezda unutar moje funkcije, ne unutar popisu parametara, znači li ići na tim adresama i zapravo promijeniti te vrijednosti. Dakle, ono što čini sliku sada izgledaju umjesto. Pa, ako umjesto sam prolazu u za A i B ne 1 i 2-- Ja sam zapravo treba dodati jedna definicija ovdje. Dakle, pretpostavimo da ovaj komad memorije je na mjestu 10. To je na položaju 11, ali ovaj je malo pojednostavljenja, Sada imam dva izbora moram proći x i y, ili ću proći njihove adrese? Ako sam proći njihove adrese ovako, ja samo Sada je potrebno provesti Zamjenski po zelenoj šifru tako da kada se vidi i to kad vidi b, ne samo kopirati A i B i pomaknite mlijeko i sok od naranče. Mlijeko i sok od naranče Metafora sada razbija, jer to su čaše tekućih i ne kartama. Umjesto toga treba ići na adresu 10 i mi morate ići na adresu 11, i zatim izvršite tu logiku zamjenjivanje sugovornika. Dakle, logika je isti, ali moramo malo drugačiji način pristupa te varijable. I tako na kraju, ono što je Program mora izgledati to. U swap.c doslovno kopiraju i zalijepiti zeleni verziju. Ali moram napraviti jednu promjenu. Nije dovoljno samo promijeniti zamjenu. Koje druge linija koda trebam promijeniti? Da? PUBLIKA: Gdje je potrebno argumente. DAVID J. Malan: Gdje to traje svoju tvrdnju. Dakle, ako sam dođite do glavno, sam ne može samo proći u X i Y, i, obećavam, posljednji komad nove sintakse danas. Moram proći ne x i y no adresu x i y. I to ispada, simbol da su autori odlučili C je ako koristite ampersand ovdje, da ne biti zbunjen sa bitovne znakom, ako koristite ampersand ovdje i znak za struju ovdje, to figure out za tebe, što je adresa x, možda je 10, što je adresu y, možda je 11, a prolazi one u umjesto. Dakle, mnogo apsorbirati odjednom. Ali da vidimo sad brzo u naši preostale četiri minute gdje se stvari mogu ići naopako. I usput, zapravo Uzeo sam ovu sliku, TF je ovu sliku godinu ili dvije dana. Dakle, ovo je natrag kutak od Eliota Dining Hall. Pointeri su možda najteži tema koje pokrivaju u CS50. Dakle, ako ste zabrinuti vrsta nagib je kao možda je više hokej štap ovako, shvatiti mi smo vrsta bliži vrhunac u Uvjeti konceptualne složenosti. I ja bi se to foto, jer sam zakleti Bogu, u jesen 1996. godine, kada sam uzeo CS50 s mojim nastavno kolegama, Nishat Mehta, on mi je sjeo u kutak Eliot D. dvorani tijekom ručka, ili večeru, ili nešto probati da mi pomogne shvatiti naputke. I ovo je mjesto gdje sam bio tjedana nakon to je bio uveden u predavanju kada je Napokon sam shvatio naputke. I ja sam se nada da je ovaj će kliknite daleko prije vas. Ali shvatite ovo apsolutno među više sofisticirane teme smo pogledao. No, to je među najmoćniji. A kad ste ga dobili, to je stvarno sve samo će konačno dolaze zajedno. Dakle, budite uvjereni da ne potrebno je sve sudopera u danas. Dakle ovdje je zadnji Program ćemo pogledati. A mi ćemo završiti s Brzi tri minute claymation napravio naš prijatelj, Nick Parlante. Evo program, koji se na vrhu dva Linije izjavljuje varijablu X i Y. Od kojih su oba adrese integers, zvani naputke. Zatim smo izdvojiti dovoljno memorije za pohranu int i pohraniti adresu te memorije u x. Dakle, to je još jednostavnije nego primjerice prije. Daj mi četiri bajta memorije, to je veličina int, i stavio tu adresu u x. Ova linija ovdje znači idite na adresu u x i staviti značenje Život, broj 42 ima. No, ova linija me brine. Star y znači otići na adresu u y, i staviti nesretan broj 13 tamo. Zašto je opasno, u ovom trenutku u story-- doduše brzo ispričao u našim posljednjim minuta here-- zašto je to loše za mene reći, idite na adresu u y? PUBLIKA: Ne morate [nečujan]. DAVID J. Malan: Nemam ništa stavio u y. Dakle, što je vrijednost y, u ovom trenutku u priči? Nemamo pojma. To je neka smeća vrijednost a niti Binky znati. Ako smo mogli završiti na ovoj bilješci. [VIDEO PLAYBACK] -Hej, Binky, probudite se. To je vrijeme za zabavu pokazivač. -Što je to? Saznajte više o pokazivače? Oh, Goody. Pa, za početak, mislim da smo Trebat će par savjeta. -U REDU. Ovaj broj dodjeljuje dvije upućuje što može ukazati na cijele brojeve. -OK, Dobro vidim Dva naputke, ali oni Ne čini se da ukazuju na ništa. -Tako je. U početku pokazivače ne ukazuju na ništa. Stvari Oni ukazuju na su zove pointees te ih postavljanje je zasebna koraka. Oh, u redu, u redu. Znao sam to. U pointees su odvojeni. Pa kako se izdvojiti pointee? -OK, I to kod izdvaja novi broj pointee, i ovaj dio seta x ukazati na to. -Hej, Da izgleda bolje. Tako bi se nešto učiniti. -OK, Ja ću dereference pokazivač x za pohraniti broj 42 u svom pointee. Za ovaj trik, ja ću morati mom čarobni štapić od dereferencing. Tvoj čarobni štapić od dereferencing? Uh, da, to je super. -Ovo Je ono što je kod izgleda. Ja ću samo postaviti broj and-- [POP SOUND] -Hej, Pogledaj tamo ide. Dakle, radi se o dereference x slijedi strelica za pristup pointee. U tom slučaju, pohraniti 42 tamo. Hej, pokušajte koristiti ga pohraniti broj 13 kroz drugu pokazivač, y. -U REDU. Ja ću samo ići ovdje na Y, i dobiti broj 13 set up. A onda se na štapić od dereferencing i just-- [Zvuk zujala] Oh, hej to nije uspjelo. Recimo, uh, Binky, ja ne mislim dereferencing y je dobra ideja, jer je postavljanje gore pointee je zasebna koraka. A ja ne mislim da smo ikada to učinio. -Hmm, Dobra stvar. -Da, Dodjeljuje se pokazivač, Y, ali nikada ga postaviti ukazati na pointee. -Hmm, Vrlo pažljiv. -Hej, Ti si izgleda dobro tamo, Binky. Možeš li to popraviti tako da y bodova na isti pointee kao x. -Sure, Ja koristiti svoj čarobni štapić od kazaljke zadatka. -je Da će biti Problem, kao prije? Ne, to ne dirati pointees. To samo mijenja jedan pokazivač ukazati na isti stvar-- [Piskavi zvuk] --as drugi. -Vidim. Sada y ukazuje na istom mjestu kao x. Pa, čekaj, sad y je fiksna. Ima pointee. Tako možete isprobati štapić od opet dereferencing poslati 13 over. Oh, u redu, ovdje ide. -Hej, Pogledaj to. Sada dereferencing radova na y. I zato što upućuje dijelite da jednom pointee, obojica vidjeli 13. -Da, Dijeljenje, uh, što god. Dakle, ćemo prebaciti mjesta sada? Oh, izgleda da smo izvan vremena. -But-- -Samo Zapamtite tri pokazivač pravila. Broj 1, osnovna struktura je da imate pokazivač, a to ukazuje na to pointee. Ali pokazivač i pointee su odvojeni. A uobičajena pogreška je postaviti pokazivač ali zaboraviti dati ga pointee. Broj 2, pokazivač dereferencing počinje na pokazivač i slijedi strelicu iznad pristupiti njegovu pointee. Kao što svi znamo, to radi samo ako postoji je pointee, koja vrsta vrati pravilo broj 1. Broj 3, kazaljka Raspored traje jedan pokazivač i mijenja ga ukazati na Isto pointee kao još jedan pokazivač. Tako je nakon dodjele, dva pokazivače će ukazati na istu pointee, ponekad to se zove dijeljenje. I to je sve što je na njega, stvarno. Doviđenja sada. [END PLAYBACK] DAVID J. Malan: To je to za CS50. Zahvaljujući profesoru Nicku Parlante. Vidimo se sljedeći tjedan. [ELECTRONIC glazbom]