[MUSIC JOC] David J. MALAN: Acest lucru este ca un seminar student în anul întâi de azi. BINE. Deci, foarte ploios afară. Acest lucru tinde să se întâmple în zilele de miercuri, dar cu atât mai mult posibilitatea de Pentru întrebări astăzi. Așa că haideți să începem de fapt cu filmul intr-o clipa. Dar vom începe grandios ca întotdeauna. Aceasta este CS50, iar acest lucru este sfârșitul săptămânii 4. Deci, dacă am privit vreodată TV sau un film în care există unii experți în informatică și poliție, sau FBI-ul, sau o agenție este încercarea de a captura unele adversar, ei bine, ai probabil a auzit expresia "spori" prin care într-un fel tehnician magic mărește în infinit departe pentru a vedea criminali de identitate sau numărul de înmatriculare în chiar stralucirea unei oglinzi sau sclipirea ochilor cuiva. Deci, într-adevăr, haideți să aruncăm o privire la cateva astfel de scene de la Hollywood. [VIDEO PLAYBACK] -OK, Acum sa trecem o privire la tine. -Ține-l. Executați înapoi. -Asteapta un minut. Faceți dreapta. -Nu, Congela asta. -Ecran complet. -OK, Congela asta. -Tighten Pe care, vrei? -Vector În care pe tip de roata din spate. -Zoom În chiar aici, pe acest loc. -Cu Echipamentul potrivit, imaginea ar putea fi extinsă și ascuțit. -Ce-i asta? -E Un program de accesoriu. Poți să clar că la orice? -Eu nu stiu. Să-l spori. Sectiunea -Enhance A6. -Am Sporit detaliu, si-- Cred că e suficient pentru a spori, eliberați-l pentru a ecranul meu. -Am Consolidată reflectarea în ochi. -Sa Rula acest prin accesoriu video. -Edgar, Puteți îmbunătăți acest lucru? -Asteapta. -Am Lucrat la această reflecție. Reflecție Cineva lui. -Reflection. -Nu E o reflectare a feței omului. Reflecție -cele. -Nu E un reflecție. -Zoom De pe oglindă. -Puteți Vedea o reflecție. Poți să îmbunătăți imaginea de aici? Poți să-l consolideze aici? Poți să-l consolideze? Poți să-l consolideze? -Putem Spori acest lucru? Poți să-l consolideze? -Stai O secundă, voi spori. -Zoom De pe ușă. -Times 10. -Zoom. -Move În. -Mai mult. Stai, nu mai. -Stop. -Pause Ea. Rotiți cilindrul ne 75 de grade în jurul valorii de verticală, vă rugăm. -Stop. Du-te înapoi la partea despre ușa, din nou. -Got Un amplificator de imagine care poate bitmap? Hei, poate putem folosi Pradeep Metoda Sen pentru a vedea în ferestre. Software-ul -Asta este de ultimă oră. -cele Eigenvalue este oprit. -Cu Dreapta combinație de algorithm-- Eliminarea luate -E algoritmi la nivelul următor, și le pot folosi pentru a spori această fotografie. -Lock Pe mări și axa Z. -Enhance. -Enhance. -Enhance. -Freeze Și de a spori. [END PLAYBACK] David J. MALAN: Bine, așa toți cei sunt de fapt cuvinte. Sunt doar înșirate împreună într-un încât nu este de fapt sensibil. Și, de fapt, CS50 și cursuri place tinde să strice o mulțime de TV și filme Pentru dumneavoastră. Pentru că atunci când aceste experți în informatică sunt zăngănit off termeni și spune lucruri de lux, cum ar fi vectori proprii, și axa z, și orice număr de alte de fapt, ceea ce mai tehnice, ei cu adevărat doar înșirarea Cuvinte împreună de prea multe ori. Este că unul dintre speranțele noastre este că, ca un efect secundar de a lua cursuri ca aceasta, va mai multe persoane în lume de fapt, putea să cântărească în și doar vreodată atât de ușor influența calitatea și acuratețea acestor filme? De fapt, haideți să aruncăm o privire la realitate. Deci, aici este fotografia personalul Maria, unul dintre colegii noștri de predare. Și să presupunem că este suspectat de ceva. Și totuși, există o licărire de unele dovadă în ochi, sau în reflectarea ochelari ei. Ei bine, dacă facem exact ca filmele propune, în care ne-am zoom și "spori", acest lucru este cât de multe informații este în fața lui Mary atunci când capturați o imagine cu această rezoluție original. Și, de fapt, puteți vedea aceste puncte. Și acestea sunt ceea ce sunt denumite pixeli, P-I-X-E-L-S, care este doar un pătrat de obicei că este un punct care compune o imagine. Și înapoi în a doua zi, și de fapt chiar astăzi, cu unele de televizoare cu LED-uri de azi sau televizoare LCD, dacă ai unul în camera dvs. sau la domiciliu, dacă te duci până super-aproape de ea, și mai ales daca este un televizor ceva mai în vârstă, probabil puteți vedea chiar aceste puncte și asta e ceea ce compune o imagine. Și nu mai există informații decât acest lucru. Am putea "spori", în sensul de nivelare lucruri de peste si un fel de deduce fel de, un fel de ceea ce Culoarea ar trebui să fie alături de ochi Maria astfel încât nu este de fapt atât de pixelat. Dar dacă tot zoom in, acolo este tipul rău în ochi. Ca și faptul că este tot informațiile pe care le avem. Nu puteți crea Informatiile din nimic. Există doar un finit numărul de biți de acolo. Deci, în Problema Set 4, în cazul în care aveți posibilitatea de să se joace cu acest tip de lume. În Problema Set 4, vei explora lume de grafica, si criminalistica, și de fapt, scrie cod care recupereaza imagini pierdute. Vei scrie cod care manipulează imagini existente și în cele din urmă să înțeleagă ceea ce este întâmplă sub capota. Și, se pare, este de fapt Nu tot ceea ce complicat. De exemplu, dacă am vrut să reprezintă o fata zambitoare, unde cu aceste pixeli negri, sau aceste puncte negre, Ei bine, am putea pur și simplu reprezenta le ca într-adevăr un bitmap. Și dacă ar fi auzit vreodată că bitmap expresie, poate începe acum să facă un puțin mai mult sens astăzi. Știm deja ce este un pic. Este 0 sau 1. Și o hartă este doar ceva ca o bucată de hârtie care vă oferă direcții și are poate o grilă de X și Y-coordonate. Deci, aici este un bitmap. Este o hartă de biți prin care un 1 este aparent O să reprezinte un pixel alb, și o 0 va reprezenta un pixel negru. Dar ne-am putea răsturna cu siguranță în jurul valorii de. Ea nu contează atât de adevărat timp cât suntem consistent. Și iată cum, în interiorul binary-- de memorie unui computer, sau chiar în interiorul de un fișier de pe hard-ul drive-- ai putea stoca Cel mai simplu de imagini fața zâmbitoare. Dar ceea ce suntem noi, desigur, lipsit de această imagine? Culoare, nu? Este un evident pas următor sau accesoriu pentru a îmbunătăți acest lucru cu culoare. Deci, din păcate, cu doar un singur bit, 0 sau 1, am putea reprezenta culoare. Care ar putea fi de culoare roșie, sau albastru, sau negru, alb sau, sau verde, sau roz, sau orice perechi de culori. Dar de dragul simplitate, vom doar își asumă în alb și negru. Deci, ceea ce face logic avem nevoie, dacă ne-am doresc să pună în aplicare de culoare într-o imagine? Ce trebuie să facem? Ca în cazul în care factorul de limitare aici este că, cu un pic poți doar reprezintă două state, 0 sau 1, alb sau negru, ce vrei să faci? Audiența: mai multe date. David J. MALAN: Mai multe biți, Da mai multe date, mai multe biți. Și, într-adevăr, asta e exact cum imagini color sunt reprezentate. Mai degrabă decât a utiliza un singur bit, un 0 sau 1 pentru fiecare pixel, fiecare punct, utilizați doar multiple. Poate folosi 8, poate, mai frecvent folosesc 24, și într-adevăr, în Problemă Set 4, va te joci cu un fișier format care foloseste 24 de biți în mod obișnuit. Dar cele mai multe dintre voi sunt, probabil, familiar cu JPEG. Dacă ați luat vreodată o fotografie de pe telefon, sau încărcate sau vazut ceva pe Facebook, Flickr sau, orice număr de site-uri web bazate pe fotografii, ai probabil văzut o imagine JPEG înainte. Și se pare că, acest lucru este fișierul format vom folosi în PSET 4, care ai de gând să trebuie să recupereze imagini care le-am șters din greșeală de la un card de memorie corupt în aparatul foto, dacă vrei. Și se pare că, deși JPEG este destul de sophisticated-- este mult mai sofisticat decât puncte albe și negre am văzut în urmă cu o clipă, pentru că există algoritmi de fapt de lux care sunt folosite pentru a comprima un JPEG, așa pe care le poate avea un foarte frumos, imagine de calitate dar folosind relativ puține biți. Și ne vom întoarce la compresie, înainte de mult timp. Se pare că primul trei octeți într-un image-- JPEG indiferent de ceea ce ai luat o fotografie de-- sunt valorile 255, 216, 255. Cu alte cuvinte, dacă doar a se vedea că modelul de biți, reprezentat aici ca trei bytes, sau 24 de biți în total, cu mare probabilitate puteți deduce că sunteți în căutarea la ea acest primele trei bytes de JPEG. Și aceasta este ceea ce este cunoscut ca semnarea unui JPEG. O mulțime de formate de fișiere acolo au tendința de a începe cu anumite modele de 0s și 1s, astfel încât Windows și Mac OS, și iOS, și Android știu ce fel de fișier ei sunt, în plus față de așa-numitul dosar extensie care o mulțime de fișiere au. Dacă ați .jpg, asta e un alt indiciu la calculator. Așa că haideți să uita-te acum la acest un pic mai mult tehnic. Știm zecimal Sistemul este 0 la 9. Știm binar este 0 și 1. Și dacă credeți înapoi la PSET 0, am avut voi lupta cu, pentru un pic, ceva numit hexazecimal, în cazul în care aveți 16 cifre, în loc de 10 sau în loc de 2. Și aceste cifre, prin convenție, sunt 0 la 9 si apoi o prin f, unde f reprezintă ceea ce număr zecimal, la fel ca un bun-simț rapid verifica? Deci, 15. Și trebuie să reprezinte un 10, doar prin Natura ordonarea pe care l-am dat. E doar o convenție arbitrară, dar este destul de standard de. Deci, dacă ne uităm la acest model de trei bytes-- să doar începe să se uite la ea în un mod compatibil cu modul în care oamenii de stiinta de calculator în general uita-te la și cred că despre fișiere. Vă puteți gândi cu siguranță despre fișiere în 0s și 1s, și zecimal, dar, în realitate, avem tendința de a folosi binar sau mai tipic hexadecimal-- înapoi la PSET 0. Așa că haideți să-mi propun ca 255, 216, 255 și sunt doar aceste modele de 0s și 1s. Și puteți verifica acest lucru, dacă vrei sa faci matematica de la Week 0. Dar, pentru moment, doar să își asume că acest lucru este într-adevăr corectă. Tocmai am rescris trei zecimal numere ca trei valori binare. Acum, ceea ce am de gând să faceți este să trebuie doar să adăugați un spațiu alb, doar de dragul lui lizibilitate. Și comunicare, Mă duc pentru a muta lucrurile în afară. Deci, înainte de, după, înainte, după. Fac nimic interesant alte decât de raspandire lucruri atât de că o notificare fiecare set de opt biți este acum două seturi de patru biți. Acest lucru este util deoarece hexazecimal este deosebit de modă pentru că fiecare cifră hexazecimală de la 0 la f, sau mai precis 0 prin 15, pot fi reprezentate cu exact patru biți. Cu alte cuvinte, în hexazecimal, dacă doresc să reprezinte un 0, e doar 0000, patru zerouri. Și dacă vrei să reprezinte 15, e 1111, care este de patru biți. Și dacă faci calculele, dacă acesta este locul celor, acesta este locul 16S, care va da Tu-- mai degrabă că se întâmplă sa-- pare rău, în binar, care va va da 15, cele loc, doi câte doi, loc patru labe și optari loc. Așa că haideți să-mi propună că set de patru biți din stânga este ceea ce vom apela f. Este cel mai mare număr tine poate reprezenta cu patru biți. Și știm deja de la hexazecimal, f este cel mai mare cifra din hexazecimal. Avem un alt f acolo, două mai mult acolo. Și de acum, să ia doar pe credință că am făcut dreapta matematica și că jumătatea stângă de cele de biți, 1101, este același lucru ca și d în hexazecimal. Și mâna dreaptă, 1000, este la doar 8. Și pentru a vedea că o simplu, nu? 8 represents-- este corect sub acel loc optari. Deci avem o în coloana optari și nimic din Fours, doi cate doi sau cele. Deci, acum mai convențional, oamenii tind pentru a scrie cifre hexazecimale, cum ar fi acest lucru, tu doar le strivi împreună, și apoi le prefixul 0x cu. Aceasta înseamnă nimic altceva decât un indiciu vizual pentru o human-- aici vine o value-- hexazecimal deoarece aceasta altfel ar putea să nu fie evident. Care este de a spune, în cele din urmă, că modelul de zerouri și cele, sau modelul de hexazecimal cifre echivalent ca esti O să începi să cauți pentru în Problema Set 4 este astea-- și problema Set 4 spec va umbla te prin acest lucru în mai multe detail-- dar dau seama ca un fel de arcane ca acest lucru ar putea uita-te la prima vedere, ai de gând să începe să vedeți acest lot. Și, de fapt, chiar și în GDB, The debugger am introdus luni și Dan introduce în PSET 3, se va să-ți arăt de multe ori valori hexazecimale doar pentru că ele tind să fie mai convențional decât zecimal sau binar în lumea calculatoarelor. Acum să punem acest lucru în context. Multi dintre voi s-ar putea aminti acest imagine aici, care a venit de la ce? Vista, astfel încât, chiar mai devreme decât că, Windows XP a făcut acest debut. Deci, acest lucru este un peisaj frumos. Și, de fapt, dacă scormoni în jurul online-- Cred că e un articol Wikipedia, în care cineva foarte uimitor a ieșit găsit această locație din lume înființat lui sau camera ei în exact place-- dreapta și acest lucru astăzi pare like-- dar Este exact aceeași setare. Această imagine, însă, este într-un fișier format numit bitmap, b-m-p. Și am de gând să ia un super privire rapidă la ceea ce înseamnă că. Dar bitmap este doar un alt mod de a imagini reprezentând încă utilizați pixeli în 0s și 1s, în cele din urmă. Dar, la scurt rapidă, are o semnătură mai interesant la începutul fișierului. Nu este vorba doar de trei bytes, mai degrabă există o grămadă de modele de bytes care s-au predeterminat sens. De exemplu, undeva în Primele bytes de o imagine bitmap va fi de mărimea imagine, lățimea imaginii, înălțimea imaginii, așa metadate utile, dacă vrei. Informații utile care Photoshop sau orice grafica programul pe care îl utilizați s-ar putea pasa de fapt, despre. Cu atât mai mult în acest sens în Problema Set 4, dar acest lucru este doar să spun că la sfarsitul zilei toate formatele de fișiere ați utilizat pentru fișiere Microsoft Word ani--, Fișiere Numere, fișiere Excel, orice număr de formate de fișiere care ar putea avea unele extensie de fișier cunoscut sunt doar 0s și 1s de sub capota. Și oamenii au decis care convențiile sunt, ce modele de 0s și 1s reprezintă depune o Word față de un fișier Excel, versus orice număr de alte formate de fișiere. Deci, în PSET 4, veți avea un oportunitate de a juca cu asta. Dar ce înseamnă a avea o struct. Aceasta este de fapt un Segue frumos acum în C, care are doar un cuplu caracteristici de suplimentare care nu ne-am uitat la încă. E o limbă destul de mici și unul dintre caracteristicile frumoase despre C este un struct. De exemplu, dacă a vrut să reprezenta: hai spune că a vrut să aibă o variabilă care reprezintă un student într-un program de. Poate ai fost scris un curs Programul de înregistrare, sau cumpărături de bază instrument, sau ceva de genul asta. Care sunt fragmente de date legate de pentru un student care vin în minte? Ca un student este reprezentată cu ce valori? Da? Ai un nume ca un student. Ce altceva student tipic au? Audiența: [inaudibil] David J. MALAN: Deci, îmi pare rău. Audiența: Age. David J. MALAN: o vârstă sau ziua de nastere echivalent, da. Ce altceva? Audiența: număr de identificare? David J. MALAN: Deci un număr de identificare, poate un număr de telefon, poate un cămin, sau casa, sau colegiu, sau ceva de genul asta. Orice număr de piese de date care s-ar putea avea în lista de contacte este ceea ce s-ar putea defini un student. Deci, dacă am vrut să facem acest lucru, în cod, am putea face ceva simplu de genul asta. Am putea avea un program astfel încât are să zicem, int main (void). Și dacă vreau să reprezinte o elev ar putea să am, de exemplu, un șir numit nume pentru că elevilor, un șir numit cămin pentru elev, poate un int numit ID pentru elev. Și pentru că eu sunt, folosind șir, am nevoie pentru a merge înapoi și a pus CS50.h. Poate voi avea nevoie de stdio.h. Deci lasă-mă să fac preventiv și sunt cele O să numesc acest student.c pentru acum și de a salva acest lucru. Și acum pot să fac ceva cu aceste variabile. Și noi suntem doar de gând să scrie ca pe un comentariu în codul pseudo, pentru ca nu este interesant ceea ce facem acum. OK, astfel încât acesta este un program care stochează într-un fel un student. Ce vreau să fac dacă doriți să stocați doi studenți? Deci primul meu instinct este de gând să fie bine, stai un minut, dacă am un alt elev ce nu nu doar nume string 2, șir cămin 2, Int ID2. Și am făcut plecat pe acest drum înainte și ceea ce a fost soluția noastră la ceea ce pare pentru a fi un fel de pastă copie hackish de locuri de muncă aici? Audiența: O matrice. David J. MALAN: Da, am putea folosi o matrice. Dreapta acest lucru foarte repede devine greoi. Trebuie să sortați de arbitrar începe numirea toate aceste variabile. Și tu, omul, trebuie să păstreze piesa care corespunde OK NAME2 cu dorm2 corespunde cu ID2. Ea devine doar o mizerie. Deci, este mult mai ușor, amintesc de câteva săptămâni în urmă, pentru doar având la numit nume șir și poate să ne dea trei dintre acestea. Și atunci poate ne-am cămine șir și au trei dintre cei, sau cu o constantă, int ID-uri și au trei dintre acestea. Dar chiar și acum se simte acest un pic neglijent, chiar. Vorbim despre studenți și încă Sunt foarte locuință la nivelul scăzut detaliile de implementare. Studentul este un nume și un cămin și ID-ul. De ce nu pot declara doar o variabilă numit elev și de apel este. Și dacă vreau un alt student, de ce nu am doar o numesc T. Sau dacă vreau o grămadă de studenți, de ce nu am doar spune că am o intreaga clasa de studenți, și este trei. Cu alte cuvinte, de ce nu pot să vin cu genul meu de date proprie, numit Elevii, din care interior este un nume, este un ID, este un cămin, este orice număr de alte domenii. Și se pare că ai pot face exact acest lucru. Deci, C are această caracteristică numit struct. Aceasta este o caracteristică limbă pe care ne permite să facem exact acest lucru. Am de gând să merg mai departe și deschide structs.h în cazul în care vom vedea pe următoarea definiție a unui student. Se pare - și asta e chiar mai simplă decât cea care implică un ID un moment în urmă. Dacă doriți să vină cu tipul de date de casă, și în plus față de int, char și și float și toate aceste altele care există, puteți face acest lucru prin literalmente scris typedef struct, apoi unele acolade, în interiorul de care lista variabilelor pe care doriți să asocia cu acest nou date personalizate tastați ca un nume și un cămin, și apoi, după acolade vă dau un nume pentru noul tip de date. Deci, de exemplu, elev. Și ce e frumos despre acest lucru acum este că dacă ne uităm la codul corespunzător, Convenția, în primul rând de toate, este de a pune această într-un fișier numit ceva dot h, un fișier antet, pe care nu am a început să utilizeze noi prea mult. Dar vom începe să folosind destul de un pic acum. Și ce putem face cu acest lucru, în cele din urmă, în aceste câteva linii de cod este să declare exact ca tipul de date, un student. Și acum să-l folosească. Am de gând să merg acum în un fișier numit structs1.c. Și haideți să aruncăm o privire la o câteva caracteristici aici. Deci lucrurile aici este cea mai mare parte familiar, și vom reveni la ceea ce nu este familiar intr-o clipa. Aceasta, desigur, este, inclusiv propria mea fișier antet, care este nou, de asemenea, cu excepția PSET 3 în cazul în care, Reamintim, avem helpers.h. Deci s-ar putea aminti helpers.h #include. De ce totuși mă, folosind citate în loc de paranteze unghiulare? Când pot alege între ei? Aproape întotdeauna mi se pare pentru a utiliza paranteze unghiulare. Și apoi, dintr-o dată pe line șase Sunt folosind ghilimele. De ce ar putea fi asta? Da? Audiența: [inaudibil] David J. MALAN: Asta-i o reală, ce? Audiența: Asta e in IDE-ul. David J. MALAN: Da, care este în IDE mea actuale. Și să nu locuiască pe IDE, deoarece asta e doar un instrument care eu sunt, folosind. Asta e în curent meu director, în special. Deci structs.h este propria mea fișier nu este instalat în IDE, în sistemul de operare în sine, mai degrabă e în directorul meu curent. Deci convenția este, dacă doriți pentru a include propriul fișier antet, utilizați doar ghilimele. Ce numim acest lucru în linia 8, în general? Acesta este ce? ceva #define. Aceasta reprezintă constante, nu? Dacă doriți să aveți o Valoarea în programul tău să utilizați un întreg grămadă de ori, e bine convenție să-l factor afară, declare, cu simbolul diez defini, apoi, prin convenție, în toate majuscule word-- deși nu este strict necesare, dar e convenție umană de a valorifica constante astfel încât acestea să sară la tine visually-- spațiu și atunci valoarea pe care doriți să fie echivalent cu nume care constanta lui. Nu virgulă, dar pur și simplu rezultă că modelul acolo. Deci, ce fac în acest cod actuale. Deci, haideți să aruncăm o privire la programul principal aici. În linia 12 pentru că am au inclus structs.h, Acum am magic la mea eliminarea unui nou tip de date. Nu am doar acces la Int, și char, float și, și de coarde, și albastru și altele. Am acum acces la un tip de date elev. Deci, în linia 12, am combinarea a două ideas-- un un tip de date personalizat și doi, folosind o matrice. Și astfel, în acest program, dacă Vreau să sprijine efectiv trei elevi diferite în programul meu, am poate spune pur și simplu da-mi o variabilă numite studenți, fiecare dintre care este de studenți de tip, care este genul meu de date personalizat. Și, în special, da-mi trei dintre cei din matrice mea. Deci, acum ce facem in acest program? Iată doar un pentru buclă iterarea 0-3, pentru că ce valoarea de studenți este. Eu doar determinând utilizatorul da-mi numele elevului. Și apoi în linia 17, ne-am au o linie de cea mai mare parte familiar. Avem vechiul nostru prieten GetString pe dreapta. Și ce bucată de sintaxă este aparent nou, dacă nu ați programat în C înainte, și nu au utilizat niciodată structs? Da? AUDIENTA: a .name. David J. MALAN: a .name. Dar acest lucru nu este prea mult de un salt, pentru că acum elevii bracketing i vă oferă elevului i-lea. Și, dacă doriți să se scufunde în interiorul acestei structuri, utilizați doar o singură perioadă și apoi numele variabilei interior, sau proprietatea în interiorul că doriți să obțineți acces la. În mod similar, atunci, dacă am apoi solicita utilizator, da-mi cămin elevului, puteți stoca în mod similar că șir în variabila camin interior din structura elev. Și acum lucrurile devin un pic de lux. Și acest lucru se întâmplă să te uiți la, probabil, o mulțime destul de repede. Dar veți vedea acest lucru mult mai mult în PSET 4, așa că hai să privire la el acum. Se pare că, în conformitate 23 prin 38, ce crezi că poate că fac? Am scos comentariile pentru ziua de azi, dar versiunea din Codul online de referință are toate comentariile. Ce mi se pare a fi faci? Audiența: salvarea fișierului cu toate informațiile pe care utilizatorul a intrat. David J. MALAN: Da, exact, aceasta este o modalitate nouă că vedem două, O altă caracteristică a C, prin care pot crea propriile fișiere. Până în prezent, aproape fiecare program de ai scris este apatrid. De îndată ce se face de funcționare, asta este. Nu e nici o memorie sau amintire de ea. Nu e nici un fisier salvat. Dar, dacă vrei să salva de intrare care are sa întâmplat, ca într-un joc sau un program de ca aceasta, se pare putem face acest lucru. Și veți vedea acest lucru mai mult în PSET 4 și în secțiunea. Dar această linie 23, în esență, creează un fișier numit students.csv. Și s-ar putea fi văzut acest lucru înainte. Chiar dacă nu ați studiat CS înainte, CSV este variabile separate prin virgulă. E ca și cum un om foarte sărac versiune a unui fișier Excel, ceea ce înseamnă că ar putea fi deschis în Excel și în număr Apple, si are rânduri și coloane. Dar nu este un drept de proprietate format ca Microsoft sau Apple. E doar virgula care separă valori pe care vom vedea într-o clipă. Și să ia doar o presupunere. În linia 23, la foarte scop, al doilea argument mea la această nouă funcție numită f deschis pentru fișierul deschis este w. Ce ar putea însemna w? Da? Audiența: Acesta vă permite să scrie la dosar? David J. MALAN: Acesta vă permite vă scrie la dosar. Deci, există o serie de variante pe care le putem conecta aici. Dar daca vrei doar să citiți fișierul, care este uita la ea și-l citesc în memorie, aveți folosi doar citat încheiat citatul "r". Dacă doriți să scrie la fișier, utilizați citat încheiat citatul "w". Există, de asemenea adăugați și o serie de alte lucruri dacă doriți să modificați fișierele existente. Acum vom vedea acest menține lucru, atunci ne vom întoarce la linia 24. NULL, se pare, este o valoare deosebită care pot fi returnate prin anumite funcții dacă ceva a mers wrong-- Dacă fișierul nu există, dacă ați alerga afară de memorie, sau o grămadă de alte erori. Dar pentru acum, hai să presupunem că acest este verificarea erorilor doar convențional. Aici, în linia 26, am iterarea 0-3 peste toate elevii mei. Și acest tip de fel este de o nouă funcție, fprintf, dar ia doar o presupunere. Dacă printf este doar de imprimare un șir formatat, ce fprintf probabil înseamnă? Audiența: Print într-un fișier. David J. MALAN: Imprimare string formatat într-un fișier. Asta e ceea ce adițional f mijloace este fișier. Și noul primul argument trebuie să fie variabila care reprezintă fișierul. Apoi, ne-am format un string la fel ca printf. Și chiar dacă acest lucru sintaxa este nou, acest lucru doar înseamnă conectați în numele studentului, plug-in-cămin studențesc, iar apoi cu fclose, închideți fișierul. Și apoi lastly-- aceasta este nou și vom reveni la acest înainte long-- Sunt eliberarea student pentru motive ce sa intamplat deasupra acolo. Dar vom reveni pentru că, înainte de long-- asta e din cauza modului getString este de fapt de lucru sub capota. Deci, haideți să aruncăm o privire rapidă aici. Dacă aș tip E în directorul meu, observați că eu nu au un fișier numit students.csv, pur și simplu nu există, nu există. Deci, dacă acum am compila acest program, face structs-1,. / struct-1, și am de gând să mergeți mai departe și tastați Andi, care locuiește în Berkeley la Yale. Vom avea Rob care locuiește în Thayer aceste zile. Și să vină cu unde este, cred eu, Maria este în Mather, dacă am adus aminte corect. Deci, nimic nu pare să se întâmple. Dar dacă de tip LS acum, există students.csv. Să mergem mai departe și students.csv deschis. Aceasta este din nou o foarte format de fișier ușor. Dar am adoptat pur și simplu o convenție că am două rânduri și coloane de aici. Prima coloană este prenumele oamenilor. A doua coloană este elev anii cămin, sau colegiu, sau casa, sau fleacuri. Și acum am salvat acest permanent într-un fișier. Deci nu e tot ce interesant. Dar aceasta este doar o piatra de hotar acum a fi capabil să persiste informații permanent. Deci, haideți să vedem acum ce mai putem a face cu aceste și alte caracteristici. Dar, mai întâi, întrebări? Asta a fost o foarte mult, și asta a fost rapid. Dar veți vedea o mulțime mai mult în PSET 4, precum și. Da? Audiența: Există o modalitate de a continuă adăugând nume în acest dosar? David J. MALAN: Bună întrebare. Există o modalitate de a continua adăugând nume în acest dosar? Da. Și, de fapt, în cazul în care ajungi up re-deschiderea fișierului, v-ar folosi citat încheiat citatul "A" pentru append, care ar adăuga doar o nouă linie, o noua linie nou și din nou, exact. Buna intrebare. Alte întrebări? Da? Audiența: Dacă rulat Programul din nou chiar acum, ar păstra adăugarea nume în fișier sau ar deschide un fișier nou? David J. MALAN: Ah, bună întrebare. Dacă ați rulat din nou dreptul de programul acum, poate introduce noi denumiri, ar adauga la dosar sau suprascrie fișierul? Acesta din urmă, pentru că eu sunt Nu utilizați modul atașare. Și pentru că eu sunt doar orbește deschiderea fișierului pentru scriere, este doar de gând să suprascrie fișierul. Așa că am nevoie într-adevăr, ar fi să faceți este să adăugați, dacă vreau să am de fapt, pe termen lung de baze de date. Acum CSV este util, sincer, chiar pentru ca daca esti writing-- și vom vedea în cele din urmă acest mai târziu în semestrul când vom folosi CSVs în alte scopuri. Dacă doriți să stocați toți oamenii care s-au înregistrat pentru un eveniment, sau înscris pentru elev dvs. grup, sau ceva de genul asta, stocarea datelor în acest tip de format este super convenabil. Pentru că literalmente, dacă aș au fost pentru a descărca acest fișier. Aș putea double-- și să încercăm de fapt acest lucru dacă am Excel sau numerele de pe aici. Am de gând să faceți clic dreapta sau Control-clic dosarul meu. Hopa. Faceți clic dreapta sau Control-clic dosarul meu. Haide, mouse-ul meu nu este cooperant. Download-- am de gând să descărca toate fișierele aici, așa încât doar ca să pot apuca asta. Și să vedem dacă funcționează Prima dată students.csv-- Am activat. Acum ei vor să vadă contactele mele. Acum, trebuie să mă înregistrez. Vedea cât de ușor este de a folosi CSVs? Da, păstrați-l la zi. OK, acum suntem pregătiți pentru clasa. OK, oh, ce mai e nou? OK, aproape. Asta a fost magic. OK, acum avem de a actualiza. Și acum, uitat ce fișier Am deschis inițial, dar ceea ce un-- acolo vom merge. OK, asa ca acum avem un fișier Excel. Multumesc. OK, deci ceea ce am făcut a fost partea ușoară. Desigur, aș fi putut pre-instalat Excel, sau numere, sau indiferent de programul. Dar acest lucru este frumos, pentru că acum pot manipula datele dintr-un format standard. Deci, acum să context comuta la unde am rămas ultima dată, care a fost de a începe să-și scoată roti ajutatoare. Dar în primul rând, nu ai făcut- aceasta masa de prânz mai devreme se întâmplă din nou aici, la foc și Gheață în Cambridge, Sitar în New Haven. Înregistrează-te pe site-ul CS50s ASAP să se alăture studenților și a personalului CS50. Așa că am luat roți de formare off luni ca follows-- string a fost declarată în Biblioteca CS50s de ceva timp. Și e frumos, deoarece permite să vorbim despre variabile ca fiind cuvinte și fraze complete, și mai mult. Dar se pare că nu există șir. Acesta este doar un sinonim, sau un alias, care le-am creat pentru ceva care de fapt, este un pic mai mult tehnică numit char *. Și într-adevăr, am văzut un exemplu a unui program de luni că nu sa comportat la fel de ne-am așteptat. Acest lucru a fost fișierul, compara-0. Și reamintească faptul că compara-0, în cazul în care Am recompilați programul de luni și a alerga compara-0 și de tip în mama în litere mici, și mama cu litere mici din nou. Programul am insistat tip lucruri diferite, chiar dacă mama, toate în litere mici, este identic vizual. Deci, ce a fost răspunsul scurt de ce computerul crede aceste două șiruri sunt diferite? Da? Audiența: [inaudibil] David J. MALAN: dreapta. Deci, mama, prima data Am l scrieți în, este în curs de stocate undeva în My Computer lui memorie, dar într-o locație diferită decât a doua oara am tip în mama. Acum cu siguranță ar putea fi optimizat. Computerul ar putea fi inteligent și realiza aceste două șiruri, hei, Sunt identice. Lasă-mă să nu redundant stoca. Dar computerele nu fac asta optimizare dacă nu le spun să. Deci, în mod implicit, sunt doar de gând să ajung în două locuri diferite în memorie. Și astfel să fie mai clar, atunci când am comparat cele două șiruri, Primul a fost numit S, al doilea a fost numit t, ceea ce a fost în mod special am compararea aici pe linia 13? Da. Audiența: Este locul în memorie că variabila va indica. David J. MALAN: Exact, am fost compararea locul în memorie că aceste variabile indicat. Deci specific, dacă mama a fost la numar de bit 1, și 2, și 3, și amintiți-vă că 4-- backslash 0 trebuie să fie tot drumul la sfârșitul. Și cealaltă instanță de mama, m-o-m, a fost la adresa 10, 11, 12, și 13. Am fost comparat 1, acea adresă, locația în memorie, împotriva 10, care este evident, nu la fel. 1 nu este 10. Deci acest lucru este frumos în care e destul de simplu. Dar e problematic în măsura în care nu pot par pentru a compara siruri de caractere. Deci fundamentally-- și la acest nivel scăzut, dacă ai vrut să pună în aplicare un program pentru a compara două cuvinte separate, că utilizator a introdus în calitate de, face ei linia de sus char pentru char, doar în termeni generali, ce trebuie să facem, aparent? Nu este suficient doar pentru a uita-te la aceste două adrese. Ce trebuie să facem? Da? Audiența: itera șirul [neauzit]. David J. MALAN: Da, hai să repeta prin șirul. Să folosim un pentru buclă, o buclă în timp ce, sau indiferent de ce ești cel mai confortabil cu. Iar dacă avem două șiruri undeva în memorie, să ne uităm la fiecare a primul caracter, apoi fiecare a doua caracter, apoi al treilea, al patrulea și, și al cincilea, până când a lovit ce valoare deosebită Sentinel? Audiența: [inaudibil] David J. MALAN: Da, backslash la zero, moment în care, fie în șir putem decide asta este. Ne-am potrivit fiecare personaj? Dacă nu, return false. Dacă este așa, return true. Și astfel că este exact ceea ce această versiune a programului compara-1.C face. Este identic cu ceea ce am sa uitat la luni cu excepția faptului că l-am scapat de string-- cuvânt, deși care nu are nici impact-- funcțională toate Fac acum este eliminarea niște roți de formare vizuale, dar pentru a vedea în mod clar că S și ​​T sunt adrese. Și asta e ceea ce steaua, asterisc, reprezintă este o adresă, altfel cunoscut mai mult punct de vedere tehnic ca un pointer. Așa că, atunci când declar pe s linia 9 și spune char * s, asta nu înseamnă că-mi dea un șir. Asta înseamnă da-mi o variabilă a cărei scop în viață este de a stoca o adresă. Pentru că eu sunt pe cale de a pune în adresa un șir în ea. Și într-adevăr, getString, să fie clar, nu se întoarce un șir. Ea nu se întoarce mama backslash la zero, în sine. Ce getString special și precis a reveni? Audiența: [inaudibil] David J. MALAN: unui domiciliu, adresa primului caracter în unele șir ea a ajuns. Și așa că acum vedem un cuvânt cheie special din nou. Și, eu aluzie la acest lucru mai devreme. Acest lucru se întâmplă să fie convenție bun că vom vedea nou și din nou acum. Am de verificare să vă asigurați că s nu este nul și T nu este nulă. Pentru că pe baza mea într-adevăr mențiune rapid mai devreme, ceea ce ar putea însemna dacă nu se întoarce getString o adresă dar N-U-L-L, care este din nou, o valoare specială? Audiența: Eroare. David J. MALAN: Este o eroare. Ceva n-a mers bine. Și ce de obicei s-ar putea întâmpla, în special cu strings-- care ar putea fi de lungime necunoscută în advance-- poate că de calculatoare din memorie, poate ați tastat într-o astfel cuvânt lung sau propoziție sau lipite astfel de eseu imens există nu doar suficientă memorie. Și astfel nu se pot întoarce getString adresa totul, așa că doar returneaza nimic. Și se spune o eroare sa întâmplat prin returnarea valorii special NULL. Este adresa la zero, ca să spunem așa. Acum se pare că C vine cu un funcție care face asta repetare. Noi nu trebuie să pună în aplicare acest lucru cu o pentru buclă sau o buclă în timp ce noi înșine. Putem folosi o functie, numit succint, se amestecă comp, sau șir compara, a cărui scop în viață este de a face exact acest lucru. Vă dau două indicii, două adrese, și va merge la acele adrese și apoi comparați scrisoare scrisoare scrisoare calitate, oprindu-se doar atunci când ceea ce este adevărat? Când ar trebui să se amestecă în mod intuitiv comp opri iterarea, doar pentru a fi clar? Când va atinge un backslash 0 în oricare șir, moment în care se poate decide a tot ceea ce potrivire, sau a existat o discrepanță? Deci, dacă vom rula acest lucru acum și să încerce jocul nostru capitalizare mica, asa ca compara-1, ./compare-1, și tip mama cu litere mici, atât de ori. Acum e același lucru. Și dacă o fac din nou cu litere mici și atunci poate majuscule. Acum, într-adevăr distinge între superior și minuscule. Deci, nu tot așa de greu sau magic, dar nu acum explica ce se întâmplă sub capota. Deci, ce mai putem extrage din acest tip de lecție? Deci, haideți să aruncăm o privire la acest lucru. Am de gând să merg mai departe și scrie Programul rapid aici numit-copie 0. Și acum să mergem mai departe și de fapt, hai sa facem asta: cu-copie 0, aruncăm o privire la ceea ce am ajuns aici. Eu spun în primul rând utilizatorul, spune ceva. Apoi am obține un șir și l-am stocat în s. Apoi am verifica dacă s este egal este egal cu NULL, doar întoarce 1. Deci, aceasta este doar standard, verificarea erorilor. Nimic interesant sa întâmplat. Și, de fapt, dacă ne scăpa de eroare verificarea, acest lucru arata ca saptamana 1 Cod Momentan. Dar am început pentru a obține o mai bine despre asta. Acum în linia 16, în urmă cu o săptămână, poate zile, chiar un cuplu sau minute în urmă, s-ar putea spune linia 16 este crearea unei variabile numit T și copiere s în ea. Și că este un perfect Takeaway rezonabil. Dar mai precis acum. Ce se întâmplă în linia 16? Ce este obtinerea copiat de la dreapta la stânga? Da? Audiența: este t obține o adresă de e? David J. MALAN: Exact, t devine adresa de e. Deci, să fie clar acum, dacă mă duc înapoi la faptul că exemplul anterior și am scoate lucru pe care l-am scris în. Și ce-am scris eu in-- aici S, și aici este ceea ce am scris undeva în memorie, mama și apoi un backslash 0 care este adăugat pentru mine. Ceea ce am stocat aici, amintesc, acest lucru este în locația 1, 2, 3, 4, acest lucru este ceea ce este în prezent în s. Deci, dacă pe linia 16, eu zic să-mi dai o altă variabilă numit T și magazin în puțin valoarea s, ceea ce este stocat aici nu vor mama ci mai degrabă doar numărul 1. Deci, dacă privim înainte în acest program acum, ce se va întâmpla? Deci observați că există Această funcție s-ar putea au folosit acest ceva timp în urmă pentru Caesar, sau Vigenere, sau poate deloc. Am susțin cu printf mea, eu sunt O să valorifice copie t. În primul rând, în linia 19, bun-simț rapid verifica, verificări strlen durata T. Pentru ca nu vreau încercați să valorifica ceva dacă nu există nici o string acolo. În cazul în care utilizatorul a lovit doar Enter, nu e nimic de a valorifica. Deci, eu nu vreau să fac linia 21. Deci, linia 21 este valorificarea care scrisoare, aparent, în t? Audiența: m? David J. MALAN: Se pare ca e copierea care unul? Audiența: m. David J. MALAN: Uh, m. OK, astfel încât primul m, pentru că o notificare că sunt trecerea la toupper, care dacă ați mai văzut e doar o funcție de valorifica ca intrare sa. T suport de zero înseamnă da mi caracterul zero T. Și așa cum face acest lucru Schimbare imagine, să fie clar? Ce trebuie să se rescrise sau modificate în ceea ce privește s și t și mama zero, backslash. Audiența: [inaudibil] David J. MALAN: Da, astfel încât aceasta de aici, pur și simplu nevoie pentru a obține schimbat sa-- repara astea-- nevoie pentru a obține schimbat la un m de capital. Dar acum, uita-te mai târziu, în de program, în cazul în care am imprima S și ​​T ca eu curat aici, ai grija ce-i va întâmpla imprimarea S și T. Deci, make-copie 0, ./copy-0. Lasă-mă să mergeți mai departe și de tip în mama în toate litere mici. Observați cât originalul și copia au fost capitalizate. Ce? Ei bine, s și t sunt ambele indică spre, dacă vreți, aceeași bucată de memorie. Și sincer, acest lucru este obtinerea uninteresting-- într-adevăr faptul că suntem folosind adresa de zero aici. Adică, nu-mi pasă cu adevărat în cazul în care lucrurile se află în memorie. Îmi pare rău că am ștergerea un pic prea mult. Dar nu-mi pasă cu adevărat în cazul în care lucrurile sunt în memorie. Și astfel, într-adevăr, ceea ce programatori tind să cred despre este că atunci când vorbim despre o adresă, sau un pointer, cui îi pasă în cazul în care este în memorie. Nu-mi pasă dacă e la octet unul sau de un miliard. Am grijă ca această variabilă este efectiv arătând că la bucată de memorie. Și astfel, de acum înainte, mai degrabă decât echivoc peste adrese de memorie arbitrare, să doar începe să elaboreze indicii ca indicatori, ca săgețile. Deci, ce e și t într-adevăr sunt, în conformitate cu acest program, din cauza cum am creat t, e doar două variabile distincte arătând în același bucată de memorie. Și nu-mi pasă unde sunt. Deci, putem abstract departe acest detaliu. Deci, cum pot remedia acest lucru? Dacă vreau să scrie o versiune a exemplarului Program care de fapt copii șirul și valorifică numai copie, doar intuitiv, ce trebuie să fie o ingredient soluția noastră? Audiența: [inaudibil] David J. MALAN: Avem nevoie de un ce? Audiența: bucată de memorie. David J. MALAN: Avem nevoie de un alt bucată de memorie, nu? Nu știm cum să fac încă, în mod necesar. Dar am un fel de nevoie să se întâmple atât de acest lucru că mama original minuscule sfârșește în bucată suplimentar de memorie. Și apoi, când am schimba copia, am nu doriți să modificați această copie aici. Vreau în schimb să se schimbe doar acest copie astfel că originalul este neschimbat. Deci, hai sa vedem cum am putea face acest lucru. In copie-1, care are deja fost deposedat de comentariu, dar este comentat on-line. Noi în schimb facem following-- aceste Liniile sunt identice, adu-mi un șir și de apel este. Dar acum să ne uităm la unul dintre cele mai noastre complex, dar ultimul a complexității pentru o vreme, linia 16 face exact acest lucru. Deci, dacă dumneavoastră confortabil cu Imaginea ne-am drew-- da-mi o nouă bucată de memorie, copiați totul în el, hai sa vedem cum putem traduce ca la cod. Deci linia 16, pe partea stângă, char * T îmi dă această casetă de aici. Asta e tot ce face. Pe partea dreapta, m alloc, sau malloc, este alocare de memorie, super lux, un mod criptic de a spune doar da-mi o bucată de memorie. Cât de mult de memorie avem nevoie? Ei bine, este un fel de o expresie de mare. Dar să vedem ce se spune aici. Deci acest lucru, desigur, este da mi lungimea șir de s. Deci, mama ar trebui să fie ce? Deci doar trei, nu? Mama este de trei caractere. Tu nu conta backslash zero, atunci când vorbesc despre lungimea unui șir este De fapt, literele vizibile umane. Deci mama, astfel încât aceasta îmi dă 3. Dar stai un minut, eu sunt adăugarea de acum 1. De ce vreau de fapt să aloca 4 octeți și nu doar 3? Da? Audiența: Pentru valoarea Sentinel? David J. MALAN: Exact, pentru ca valoarea Sentinel. Pentru backslash de zero, Am nevoie de 4 octeți totală. Așa că am nevoie de lungimea din șir plus 1. Și apoi doar pentru measure-- bun chiar dacă pe acest sistem, este întotdeauna o să fie 1-- ce spun multiplica acest lucru prin dimensiunea unei char. Se pare că este sizeof un operator în C, care doar vă spune Numărul de bytes care este necesară pentru un anumit tip de date. Ea nu funcționează pentru tablouri, de obicei, uneori nu. Dar, în cazul general, nu. Dar mi va spune cât de multe bytes o char este, care se dovedește este întotdeauna 1. Deci acest lucru este ca înmulțirea cu 1. Line Deci super-criptic în căutarea de cod. Dar tot ce face este dă mi o bucată de memorie. Dar nu pare a fi copierea tot în această memorie? Inca nu. Și ce fac eu pe linia 22, și 23, 24, 25, ei bine, eu pur și simplu fac asta. Și acest lucru este un fel de lucruri vechi școală acum. Acest lucru este ca PSET 2, în cazul în care sunteți doar în mișcare lucrurile în jurul valorii de memorie, sau mai degrabă în siruri de caractere. Deci, eu sunt iterarea la 0 la lungimea șir s. Și mă copierea caracterul i-lea în s în caracterul i-lea în t. Și pentru că, programator, a făcut sigur de a aloca exact cât mai multe bytes ca am nevoie, e perfect -unu la unu relație. Și am copia mama în litere mici pentru unul nou. Și apoi în cele din urmă, fac această linie. Și astfel efectul este singurul pentru a valorifica acest T aici. Astfel încât o mulțime de a absorbi, dar dacă tocmai ați lua în considerare ce se întâmplă cu adevărat pe sub capota este doar în mișcare acestea bytes jur, tot ce este necesară pentru a rezolva această problemă este doar pentru a ne da acest bucată de memorie. Acum, cu riscul de a copleșitoare, lasă-mă să arăt un alt exemplu care este aproape identice, exceptând această singură linie de cod. Deci aceasta este versiunea hacker acestui program, dacă vreți. Dar hai să distileze in ceea ce se întâmplă. Linie 24 folosit pentru a fi acest T Suport i devine s suport i. Acum, eu sunt schimbarea asta Star T mult mai criptic plus 1 este egal cu stea s plus 1. Deci, ce se întâmplă și de ce avem un caracter stea? Am văzut steaua înainte, și este folosit în mod diferit aici. Am văzut anterior char *, acum văd O stea de la început, și asta e în regulă. Pentru că se pare că ne-am un fel de poate deduce doar de la cele mai întâi principii ce se întâmplă. Deci, doar pentru a fi clar, ceea ce este s? Săptămâna trecută, a fost un șir. Asta nu mai este suficientă. Ce este e, mai exact? Audiența: [inaudibil] David J. MALAN: Este un pointer. E adresa primul caracter tastat noi în. OK, ceea ce este T? Audiența: [inaudibil] David J. MALAN: a adresa primului octet în T, care bucată de memorie realocate. Deci, se dovedește că, atunci când ne-am repeta de la 0 la până la șirul length-- în primul rând, m-am începe de la 0, deoarece de această școală veche de lucru bucla. Deci, doar pentru simplitate, să presupune că prima linie de cod este de fapt doar asta, nu. Dacă i este zero, adăugând la zero la ceva probabil nu va avea un efect. Deci, ce este acest proverb? Se pare că vedeta În acest context, operatorul este dereference Operatorul, care este doar un mod fantezist de a spune merge la următoarea adresă. Deci, dacă s este adresa primului caracter în această bucată de memorie, * s mijloc acolo. Și pentru că ne-am desenat imaginea în acest fel, puteți adopta în urma model mental. Dacă acest lucru este s, și spuneți * s * s, un fel de jgheaburi și scări, dacă vă aduceți aminte de joc din copilărie, este ca urmați că săgeata și du-te la adresa. * t este același lucru. Deci, începe aici, du-te la bucată său. Nu pot doar trage pe acest ecran în acest fel. * T înseamnă a merge aici. Si apoi, pentru bucla este doar spunând muta acest personaj aici, muta acest personaj aici, muta acest personaj aici. Dar cum fac asta incrementare? Trebuie să anulați ceea ce tocmai am șters. Aceasta este ceea ce se numește, în general, aritmetică pointer, care înseamnă matematica adrese. Dacă, în acest timp de buclă, Mă tot incrementare I, și s este o adresă și t este un adresa, dacă am păstra adăugarea de 1, Asta înseamnă că păstreze în mișcare înainte, și înainte, și transmite în memorie. E ca și cum Oxford Street, stradă că clădirea CS este pe. Clădirile CS este de 33 Oxford Street. Deci, dacă ar fi să faci 33 Oxford Street plus 1, pe care le aduce la 34 Oxford Stradă, apoi 35 Oxford Street, apoi 36 Oxford Street, indiferent de cei clădiri de fapt sunt - în cazul în care acestea există. Și așa, asta e tot ce facem aici cu pointer aritmetică. Deci, este un mod foarte arcane de a ne exprima. Dar toate acestea se întâmplă sub capota este doar ca urmare a acestor adrese, ca urmare a unei hartă, dacă vreți, sau ca urmare a săgețile ca am desenat pe ecran. OK, o mulțime de digerat. Orice întrebare pe sintaxa, concepte, indicii, malloc, sau altele asemenea. Da, aici în primul rând. Audiența: Deci, unde care spune * T este egal cu toupper * t, este că va valorifica toate literele sau doar-- David J. MALAN: Ah, foarte bun întrebare. Deci, în această linie de aici, 31, se întâmplă acest lucru pentru a valorifica prima literă sau toate literele. Deci, haideți să răspundă că, mergând înapoi la principiile de baza. Și primele principii de aici mă refer du-te la definițiile de bază de ce este implicat. Deci toupper o funcție care valorifică un char. Asta e tot. * T înseamnă a merge la first-- du-te la adresa din or. Deci, în imagine, în cazul în care acest lucru este bucată de memorie am alocat cu malloc, iar acest lucru este t, * t înseamnă du-te aici. Între timp, te trece această valoare, litere mici m la toupper, vei primi înapoi de capital M, în cazul în care sunt ai pune? Te-l pune în aceeași locație. Și astfel de logică a celor care definiții de bază este doar valorificarea prima literă dacă nu repeta cu I sau o pentru buclă sau o buclă în timp ce, nu va de a face ceva mai mult decât o cere. Buna intrebare. Da? Audiența: De ce ai folosi dereference metodă, mai degrabă decât matrice? David J. MALAN: Ah, bună întrebare. De ce ai folosi dereference Metoda locul metodei matrice? Nici un motiv special, să fiu sincer. Și, de fapt, pentru acest fel de exemplu, drept, Eu doar argumentând a face program mai complicat, mai multe ochii sunt geamuri peste, oamenii sunt verificarea pentru că acest lucru pare super-Arcane, dar chiar dacă face același lucru. Și astfel, sincer, acest lucru este un soluție inutil vizual complex la această problemă. E încă un design bun, cinci din cinci pentru proiectare, fie că este vorba în suportul notație sau notația pointer. Dar-- mai ales când ajungem mai târziu, în cursul în PSET 5 când ne-am pune în aplicare acea dicționar care Am menționat câteva times-- vom pasa de fapt, despre adresele de memorie de nivel scăzut că ne înțelegem cu adevărat ce se intampla. Dar, pentru moment, se pare că această linie de cod paranteze pătrate aici nu există cu adevărat. Acestea sunt ceea ce se numește zahăr sintactic, care este doar un mod ciudat de a spune rece compilator convertește paranteze pătrate pentru a fi această expresie matematică. Deci, este o convenție umană pentru a putea scrie doar aceste paranteze foarte user-friendly. Dar ceea ce compilator, zăngănit, este de a face într-adevăr orice moment scrii ce evidențiate în linie 24, sub capota este într-adevăr conversia la acest lucru. E mai plăcut ca un om să citească și să scrie cod ca linia 24. Dar în cele din urmă cei roți de formare prea se desprinde când confortul propriu devine mai puternic. În regulă, deci amintesc atunci că acest era genul de cea mai mare problema am fugit în. Și asta e ceea ce a declanșat acest întreg al naibii de conversație despre indicii, și adrese, și lucruri de copiere. A fost pentru că am împiedicat peste această problemă prost, prost, care Am implementat logically-- cu Lauren aici pe demo si suc de portocale în milk-- o perfect Funcția algoritmic corectă pompare două variabile " valori, dar la naiba lucru nu au avut nici persistente, sau permanent, un efect asupra codul meu. Și de ce a fost asta? Într-un cuvânt, de ce este acest punerea în aplicare a de swap logic corect, dar nu are niciun impact pe variabilele care sunt transmise la acesta, ca X și Y pentru principal? Care a fost esența problemei? Da? Audiența: Deoarece variabila făcut copii ale variabilă în trecere prin funcția. David J. MALAN: Exact, când treci variabile într-o funcție, sau argumente într-o funcție, sunt a trecut prin copiere, care inseamna ca veti obtine un identic în căutarea model de biți pentru ambele x și y, chemat aici a și b. Și puteți face nimic vrei cu aceste exemplare, dar ei vor avea nici o efect asupra funcției de asteptare. Și, de fapt, ne-am tras ca imagine pe ecran, retragerea ultima dată, prin care, dacă chiar cred ca despre ceea ce este întâmplă sub hood-- dacă aceasta este memoria computerului, și aici este bucata de memorie utilizat pentru principal, aceasta este bucata de memorie utilizat pentru swap, și are astfel încât, chiar dacă principalul două variabile, x și y, schimb ar putea avea în căutarea identice Valorile, ambele fiind 1 și 2, dar sunt complet diferite bucăți de memorie. Deci, avem nevoie de o soluție pentru acest lucru. Și sincer, s-ar părea că ne acum au o soluție la această problemă, drept. Dacă avem acum posibilitatea de a manipula lucrurile prin intermediul adreselor și, un fel de jgheaburi și scări stil, urmați aceste săgeți și du-te oriunde vrem în memorie, nu am putea rezolva această problemă prin trecerea de la principal pentru a schimba nu valorile pe care le doriți să swap, dar doar intuitiv ceea ce am putea trece de a schimba în schimb? [Interpunerea VOCI] David J. MALAN: De ce nu ne-am să-l dați adresele, nu? De ce nu ne-am da de swap o hartă a comorii, dacă vreți, că ea duce la valori x și y reale. Să schimb, schimba de fapt aceste biți originale, mai degrabă decât doar in trecere copii ale biți. Și astfel, de fapt, asta e ceea ce-i va fi soluția. Această versiune este aici clar rău și defecte. Și acum, la prima vedere, pare doar ca am adaugat o grămadă de stele aleatoriu și a trecut degetele noastre că ar compila. Dar, s-ar compila acum. Dar să vedem ce înseamnă aceste lucruri. Și, din păcate, autorii C-ar fi putut alege un alt simbol pentru a face acest lucru un pic clară, dar operatorul stea are sens diferit în contexte diferite. două Și am văzut amândoi, dar să se facă distincția. Deci până la partea de sus acolo, când m-am schimbat o și b de a fi int în rău Versiunea de int stele, a și b, anterior, au fost numere întregi. Ce sunt a și b acum în bun, versiunea verde? Sunt adrese. Adresele de ceea ce, să fie clar? Adresele numere întregi. Deci faptul că eu sunt spunând mijloace stele Int aceasta este adresa de un număr întreg, în special. Deci, acum a observa in linii de cod, ceva sa schimbat prea. tmp rămâne la fel, pentru că e doar un număr întreg temporar, nu magie memorie acolo. Dar un are nevoie de acum o stea. Și, de fapt, fiecare alte menționarea a și b, observa că tot ce e schimbarea de la roșu la verde este că eu sunt prefixarea acele variabile cu stele. Pentru că nu vreau să copiați a și b. Pentru că dacă am copia A și B și de swap a și b, ceea ce eu, de fapt schimbarea? Doar adrese, vreau să schimb ceea ce este la acele adrese. Vreau acolo. Și astfel operatorul stea în interiorul funcției mele, nu în interiorul listei de parametri, înseamnă a merge la acele adrese și schimba de fapt aceste valori. Deci, ceea ce face imagine acum arata ca in loc. Ei bine, dacă în loc am trece in pentru A și B nu 1 și 2-- De fapt, am nevoie pentru a adăuga un alt Definiția aici. Deci să presupunem că această bucată de memorie este la locație 10. Acest lucru este în locația 11, dar acest lucru este un pic de o simplificare, Acum am două opțiuni îmi trec X și Y sau pot trece adresele lor? Dacă trec adresele lor ca aceasta, eu doar acum trebuie să pună în aplicare de swap pe codul verde astfel încât atunci când acesta vede o și atunci când vede b, aceasta nu copiază doar a și b și pentru a muta lapte și suc de portocale. Lapte și suc de portocale metaforă sparge acum în jos, pentru că acestea sunt cupe de hărți lichide și nu. Noi în schimb nevoie pentru a merge pentru a aborda 10 si ne-am nevoie pentru a merge pentru a aborda 11, și apoi efectuați această logică swapping. Deci logica este aceeași, dar avem nevoie de o modalitate ușor diferită de a accesa aceste variabile. Și astfel în cele din urmă, ceea ce Programul trebuie să arate ca este aceasta. În swap.c literalmente copiate și lipite versiunea verde. Dar am nevoie pentru a face o schimbare. Nu este suficient doar să se schimbe de swap. Ce alte linie de cod am nevoie pentru a schimba? Da? Audiența: În cazul în care este nevoie de argumentele. David J. MALAN: În cazul în care este nevoie de argument. Deci, dacă am derulați până la principal, am Nu poți să treci în x și y, și, promit, ultimul bucată de noi sintaxă astăzi. Am nevoie pentru a trece în X și nu y ci adresa lui x și y. Și se pare că, simbolul că autorii au ales C este dacă utilizați un ampersand aici, nu sa se confunda cu ampersand biți, dacă utilizați un ampersand aici și un ampersand aici, acest cifrele pentru tine, Care este adresa lui x, poate e de 10, ceea ce este adresa y, poate e 11, și trece cele din loc. Astfel încât o mulțime de a absorbi toate odată. Dar să vedem acum rapid în noastre de patru minute rămase în cazul în care lucrurile pot merge gresit. Și, ca o paranteza, de fapt, Am luat această imagine, TF a luat această imagine cu un an sau doi în urmă. Astfel încât acesta este în colțul din spate de Eliot sala de mese. Indicii sunt, probabil, cel mai greu subiect care ne acoperă în CS50. Deci, dacă vă faceți griji genul de panta este ca poate e mai mult de un stick de hochei ca aceasta, realiza suntem un fel de aproape un vârf în punct de vedere al complexității conceptual. Și aduc această foto, pentru că îți jur la Dumnezeu, în toamna 1996, când am luat CS50 cu colegii mei de predare, Nishat Mehta, el mi-a așezat jos în colț al D. Hall Eliot peste masa de prânz, sau cina, sau ceva pentru a încerca să mă ajute să înțeleagă indicii. Și acest lucru este în cazul în care am fost săptămâni după a fost introdus în curs, atunci când Am înțeles în cele din urmă indicii. Și sunt plini de speranta ca acest va faceți clic pe departe mai repede pentru tine. Dar realiza acest absolut printre subiecte mai sofisticate ne-am uitat la. Dar e printre cele mai puternice. Și când l, e într-adevăr tot doar de gând să vină în cele din urmă împreună. Deci, fiți siguri că nu Trebuie să toate chiuveta astăzi. Deci, aici e ultimul program ne vom uita la. Și vom termina cu un rapide trei minute de claymation realizat de prietenul nostru, Nick Parlante. Iata un program, care în primele două Liniile declară un X variabilă și y. Ambele din care sunt adrese de numere întregi, indicii AKA. Apoi am aloca suficient memorie pentru a stoca un int și stoca adresa de care memoria X. Deci, e mai simplu decât exemplul înainte. Dă-mi patru bytes de memorie, care este dimensiunea de un int, și a pus că adresa în X. Această linie înseamnă aici du-te la adresa din X și a pus sensul viață, numărul 42 acolo. Dar această linie mă îngrijorează. Stele y înseamnă a merge la adresa din y, și a pus numărul ghinionist 13 acolo. De ce este periculos, în acest moment în story-- deși a spus rapid în câteva minute noastre de declin here-- ce este rău pentru mine să spun, du-te la adresa din y? Audiența: Nu aveți [neauzit]. David J. MALAN: nu am pune nimic în y. Deci, ce este valoarea y, în acest moment în povestea? Nu avem nici o idee. Este o valoare de gunoi și nici nu știe Binky. Dacă am putea încheia pe această notă. [VIDEO PLAYBACK] Hei, Binky, trezește-te. E timpul pentru distracție pointer. -Ce-i asta? Aflați mai multe despre indicii? Oh, Goody. Ei bine, pentru a începe, cred că suntem avea nevoie de câteva indicii. -BINE. Acest cod alocă două indicii care pot indica întregi. -OK, Bine am vedea doi pointeri, dar ele nu par să fie îndreptată la nimic. -Asa este. Inițial indicative nu indică nimic. Lucrurile pe care le indica sunt numit pointees și setarea le este o etapă separată. Oh, dreapta, dreapta. Am știut că. Cele pointees sunt separate. Deci, cum a face tu aloce un pointee? -OK, Ei bine, acest cod Alocă un nou pointee întreg, și Acesta stabilește partea X pentru a indica o. Hei, care arată mai bine. Deci, face face ceva. -OK, Voi dereference indicatorul x la stoca numărul 42 în pointee său. Pentru acest truc, voi avea nevoie de meu baghetă magică de dereferencing. Baghetă magică tău de dereferencing? Uh, asta, asta e minunat. -Asta Este ceea ce codul pare. Voi doar înființat numărul si-- [POP SOUND] Hei, uita-te acolo merge. Deci, a face un dereference pe X urmează săgeata pentru a accesa pointee sale. În acest caz, pentru a stoca 42 acolo. Hei, încercați să utilizați o pentru a stoca numărul 13 prin cealaltă indicatorul, y. -BINE. Mă duc doar aici la Y, și pentru a obține numărul de 13 infiintarea. Și apoi să ia bagheta de dereferencing și doar-- [BUZZER SOUND] Oh, hei, care nu au de lucru. Spune, uh, Binky, eu nu cred dereferencing Y este o idee bună, pentru că stabilirea până pointee este o etapă separată. Și nu cred că am făcut-o vreodată. -Hmm, Bun punct. Da, am alocat pointer, y, dar nu am setat pentru a indica o pointee. -Hmm, Foarte atent. Hei, arăți bine acolo, Binky. Poți să-l repara, astfel încât punctele de Y la aceeași pointee ca x. -Sigur, Am folosi bagheta magică meu de cesiune pointer. -este Că va fi o problemă, ca înainte? Nu, acest lucru nu atinge pointees. Se schimbă doar un pointer pentru a indica aceeași thing-- [Popping SOUND] --as altul. Oh, văd. Acum puncte Y la același loc ca și x. Deci, așteptați, acum y este fix. Ea are o pointee. Astfel, puteți încerca bagheta de dereferencing din nou pentru a trimite 13 supra. Oh, OK, aici merge. Hei, uita-te la asta. Acum dereferencing lucrări pe y. Și pentru că indicii sunt de partajare că unul pointee, amândoi văd 13. Da, de partajare, uh, orice. Deci, vom schimba locurile acum? Oh, uita-te nu mai avem timp. -But-- -Doar Amintesc cele trei reguli indicatorul. Numărul 1, structura de bază este că aveți un pointer, și-l arată pe la un pointee. Dar indicatorul și pointee sunt separate. Și comună eroare este de a crea un pointer dar a uita să-i dea un pointee. Numărul 2, indicatorul dereferencing începe la indicatorul si urmeaza sa asupra săgeata pentru a avea acces pointee acesteia. După cum știm cu toții, aceasta funcționează numai în cazul în care nu există este un pointee, ce fel de se întoarce să se pronunțe numărul 1. Numărul 3, indicatorul cesiune ia o pointer și se schimbă pentru a indica același pointee ca un alt indicator. Deci, după atribuirea, cele două indicii va indica la același pointee, uneori, că se numește partajare. Și asta e tot acolo este să-l, într-adevăr. La revedere acum. [END PLAYBACK] David J. MALAN: Asta e pentru CS50. Vă mulțumim pentru profesorul Nick Parlante. Ne vedem săptămâna viitoare. [Electronic Music JOC]