>> [REPRODUCCIÓ DE MÚSICA]
DAVID J. Malan: Això és com un seminari de primer any a l'actualitat.
D'ACORD.
Així que molt plujós terme.
Això tendeix a ocórrer els dimecres, però encara més oportunitat
per a preguntes avui.
Així que anem a començar en realitat amb la pel·lícula en un moment.
Però anem a començar amb grandiloqüència com sempre.
>> Això és CS50, i això És el cap de setmana 4.
Així que si alguna vegada has vist La TV o una pel·lícula en la qual
hi ha alguns experts en informàtica i la policia o l'FBI, o alguna agència
està tractant de prendre una mica de adversari, així, que hi hagi
probablement escoltat l'expressió "millorar" per la qual aquest tècnic d'alguna manera
zooms màgicament en infinitament per poder veure els criminals
identitat o el número de matrícula fins i tot en la brillantor d'un mirall
o la brillantor dels ulls d'algú.
Així que de fet, anem a fer una ullada a algunes d'aquestes escenes de Hollywood.
[REPRODUCCIÓ DE VÍDEO]
-ok, Ara anem a obtenir un bon cop d'ull.
>> -Aguanta-ho.
Corre que tornar.
>> -Espera un minut.
Anar a la dreta.
>> -No, Congelar això.
-Pantalla completa.
-ok, Congelar això.
Endurirà fins en això, oi?
-Vector En el qual noi per la roda del darrere.
-Zoom En aquí en aquest lloc.
-Amb L'equip adequat, la imatge podria ser ampliat i aguditzat.
-Què és això?
-És Un programa de millora.
-Pots És clar que qualsevol?
-No ho sé.
Anem a millorar-lo.
>> Secció A6 -Millorar.
>> -I Millora el detall, i- Crec que hi ha
suficient per millorar, alliberar la meva pantalla.
-I Va millorar la reflexió en el seu ull.
>> -Anem A executar això a través de millora de vídeo.
-Edgar, Pots millorar això?
>> -Espera.
>> -He Estat treballant en aquesta reflexió.
>> La reflexió de -Algú.
-Reflexió.
-Hi Ha Un reflex de la cara de l'home.
-La Reflexió.
-Hi Ha Una reflexió.
-Zoom En el mirall.
-Vostè Pot veure un reflex.
-Pot A millorar la imatge d'aquí?
-Pot Que ho millorar aquí?
-Pots Potenciar-?
Pots millorar?
>> -Podem Millorem això?
>> -Pots Potenciar-?
-Mantenir En un segon, vaig a Millorar.
-Zoom A la porta.
-els Temps 10.
-Zoom.
-Avançar.
-Més.
-Espera, Aturi.
-Stop.
-PAUSE Ella.
Ens -Girar 75 graus al voltant de la vertical, per favor.
-Stop.
Tornar a la part sobre la porta, de nou.
>> -Got Un promotor d'imatge que pot mapa de bits?
>> -Escolta, Potser podem fer servir el Pradeep Mètode de Sen per veure per les finestres.
Programari -Aquest és l'estat de la tècnica.
>> -El Valor propi està apagat.
>> -Amb La dreta combinació de algorithm--
>> Eliminació presa de -Ell algoritmes per al següent nivell,
i puc utilitzar-los per millorar aquesta fotografia.
>> -Lock Encesa i ampliar l'eix z.
>> -Millorar.
-Freeze I millorar.
>> [FI DE REPRODUCCIÓ]
>> DAVID J. Malan: Molt bé, així tots aquests són en realitat paraules.
Només estan enfilats en un de manera que no és en realitat sensible.
I, de fet, CS50 i cursos com és tendeix a arruïnar un munt de TV i pel·lícules
per a tu.
Perquè quan els experts en informàtica es recitar termes i dient
coses de luxe com vectors propis, i l'eix z,
i qualsevol nombre d'una altra en realitat termes més tècnics,
que realment estan simplement tensant paraules juntes amb massa freqüència.
És això una de les nostres esperances és que, com un efecte secundari de prendre cursos
com aquest, ho farà més persones al món realment sigui capaç de pesar en
i només molt lleugerament influir en el la qualitat i l'exactitud d'aquestes pel·lícules?
>> De fet, anem a fer una ullada a la realitat.
Així que aquí està la foto personal de Maria, un dels nostres companys docents.
I suposo que és sospitós d'alguna cosa.
I, no obstant, hi ha un indici de alguna peça d'evidència en el seu ull,
o en el reflex de les ulleres.
Bé, si ho fem exactament com les pel·lícules proposar, en el qual ens acostem i "millorem",
això és la quantitat d'informació és en el rostre de Maria
quan es captura una imatge amb la resolució original.
>> I, de fet, es pot veure aquests punts.
I aquests són els que són denominats píxels, P-I-X-E-L-S,
que és només una plaça típicament que és un punt que compon una imatge.
I de tornada en el dia, i de fet encara avui amb alguns dels televisors LED d'avui
o televisors de plasma, si tens una a la seva habitació oa la llar,
si puges molt a prop seu, i especialment si es tracta d'un televisor una mica més gran,
és probable que fins i tot es pot veure aquests punts i això és el que compondre una imatge.
>> I no hi ha més la informació que això.
Podríem "millorar", en el sentit de suavitzar les coses una i tipus de
inferir la classe de, classe del que color ha d'estar al costat dels ulls de Maria
pel que no és en realitat tan pixelada.
Però si segueixo zoom, hi ha és el dolent de la pel·lícula als ulls.
Igual que és tant informació que tenim.
No pot crear Informació del no-res.
Només hi ha una finita nombre de bits allà.
>> Així que en el problema 4 set, on vostè té una oportunitat
jugar amb aquest tipus de món.
En el problema setembre 4, explorarà la món dels gràfics i anàlisi forense,
i en realitat escriure codi que recupera imatges perdudes.
Vas a escriure codi que manipula imatges existents
i, finalment, entendre el que està passant per sota de la caputxa.
>> I, resulta que, en realitat no tan complicat.
Per exemple, si volguéssim representar una cara somrient en
amb aquests píxels negres, o aquests punts negres,
així, podríem simplement representar com un veritable mapa de bits.
I si havia sentit parlar alguna vegada que mapa de bits expressió, potser
ara comença a fer una poc més avui sentit.
>> Ja sabem el que una mica és.
És 0 o 1.
I un mapa és només una cosa com un tros de paper
que ofereix adreces i té potser una quadrícula de x i y coordenades.
Així que aquí és un mapa de bits.
És un mapa de bits mitjançant el qual un 1 es aparentment
passant de representar un píxel blanc, i un 0 va representar un píxel negre.
Però sens dubte podríem donar-li la volta al voltant.
Realment no importa el Mentre estiguem consistent.
I aquí és com, a l'interior binary-- de la memòria d'un ordinador, o fins i tot a l'interior
d'un arxiu en el seu disc drive-- podries guardar
el més simple d'imatges de cares somrients.
Però, ¿què som nosaltres, per descomptat, mancat d'aquesta imatge?
Color, no?
És un següent pas obvi o millora per millorar això amb color.
Així que per desgràcia amb un sol poc, 0 o 1, que podria representar el color.
Això podria ser de color vermell o blau, o negre, o blanc, o verd o rosa,
o qualsevol parells de colors.
No obstant això, per simplificar, anem a simplement assumir blanc i negre.
>> Així que el que lògicament necessitem si volem vol aplicar color a una imatge?
Què hem de fer?
Igual que si el factor limitant aquí és que amb un bit només es pot
representar dos estats, 0 o 1, blanc o negre, què vols que faci?
AUDIÈNCIA: Més dades.
DAVID J. Malan: més bits, yeah més dades, més bits.
I, de fet, això és exactament com imatges en color estan representats.
En lloc d'utilitzar un sol bit, un 0 o 1 per a cada píxel, cada punt,
només ha d'utilitzar múltiples.
Utilitzar Tal 8, potser, més comunament utilitzar 24, i de fet, en la Sèrie de problemes
4, ¿vols jugar amb un arxiu format de 24 bits que utilitza normalment.
>> Però la majoria de vostès probablement familiaritzats amb els fitxers JPEG.
Si alguna vegada has pres una foto al seu telèfon,
o pujat o ha vist alguna cosa en Facebook o Flickr, qualsevol nombre
de llocs web basats en les fotos, no tens Probablement vist una imatge JPEG abans.
I resulta que, aquest és l'arxiu format que utilitzarem en PSet 4,
pel qual es va a ha de recuperar imatges
que he esborrat accidentalment d'un targeta de memòria danyada a la cambra,
si es vol.
>> I resulta que tot i que JPEG és bastant sophisticated--
és molt més sofisticat que els punts blancs i negres
que vam veure fa un moment, perquè hi ha algoritmes realitat de fantasia que
s'utilitzen per comprimir un JPEG, per la qual que es pot tenir una molt bona,
qualitat d'imatge, però utilitzant relativament pocs bits.
I tornarem a compressió en poc temps.
Resulta que la primera 3 bytes en un image-- JPEG
no importa el que vostè ha pres una fotografia de-- són els valors 255, 216, 255.
>> En altres paraules, si només veure que el patró de bits,
representat aquí com de tres bytes o 24 bits en total,
amb alta probabilitat es pot inferir que vostè està buscant en aquesta primera de tres
bytes d'un fitxer JPEG.
I això és el que es coneix com la signatura d'un JPEG.
Una gran quantitat de formats d'arxiu per aquí tendeixen a començar
amb certs patrons de 0s i 1s, perquè Windows i Mac OS i iOS,
i Android sap quin tipus d'arxiu que són, a més de l'arxiu de trucada
extensió que una gran quantitat d'arxius té.
Si ha .jpg, això és una altra pista a l'ordinador.
>> Així que anem ara mira això una mica més tècnicament.
Sabem que el decimal sistema és del 0 al 9.
Sabem binari és 0 i 1.
I si vostè pensa de nou a PSet 0, vam haver de lluites amb,
per una mica, una mica anomenat hexadecimal,
on vostè té 16 dígits, en lloc de 10 o en lloc de 2.
I aquestes xifres, per convenció, són del 0 al 9 i després un
a través de f, on f representa el que nombre decimal, igual que un seny ràpida
comprovar?
Per tant, 15.
I una cosa que ha de representar el 10, just per naturalesa de l'ordre que he donat.
És només una convenció arbitrària, però és bastant estàndard.
>> Així que si ens fixem en aquest patró 3 bytes-- anem
acaba de començar a mirar d'una manera consistent amb la forma
científics de la computació en general mirar i pensar sobre els arxius.
Per descomptat que pot pensar arxius en 0s i 1s, i decimal,
però en realitat, tendim a usar binària o més típicament hexadecimal--
de tornada de PSet 0.
Així que permetin-me proposo 255, 216, i 255 són només aquests patrons de 0s i 1s.
I es pot comprovar això si volen fer els càlculs de la Setmana 0.
Però, per ara, només assumir que això és correcte.
Jo només he reescrit de tres decimals nombres com tres valors binaris.
Ara el que faré és només ha d'afegir una mica d'espai blanc,
només pel bé de la llegibilitat.
I fixeu-vos, jo només vaig per moure coses a part.
Així que abans, després, abans, després.
Jo estic fent res interessant una altra que només la difusió de les coses de manera
que la notificació cada conjunt de vuit anys bits és ara dos conjunts de quatre bits.
Això és útil perquè hexadecimal és particularment moda
perquè cada dígit hexadecimal de 0 a f, o més específicament de 0 a 15,
pot ser representada amb exactament quatre bits.
En altres paraules, en hexadecimal si vol representar un 0, és només 0000,
quatre zeros.
I si vostè vol representar 15, és 1,111, que és de quatre bits.
I si es fan els comptes, si aquest és el lloc de les unitats,
aquest és el lloc 16, això va a donar usted--
més aviat, que va A-- ho sento, en binari,
això va a donar 15, benvolguts lloc, twos lloc, a quatre potes i vuits lloc.
Així que permetin-me proposo que un conjunt de quatre bits de l'esquerra
és el que anem a trucar a f.
És el major nombre que pot representar amb quatre bits.
I ja sabem de hexadecimal, f és la més gran de dígits en hexadecimal.
Tenim un altre f allà, 2 més enllà.
I per ara, acaba de prendre en la fe que he fet el dret de matemàtiques
i que la meitat esquerra d'aquests bits, 1101,
és el mateix que d en hexadecimal.
I la mà dreta, 1000, és a 8.
>> I que un fàcil de veure, no?
El 8 represents-- és correcte sota d'aquest lloc vuits.
Així que tenim una a la columna de l'vuits i res en les quatre potes, dues en dues estimats o.
Així que ara més convencional, els éssers humans tendeixen escriure dígits hexadecimals com aquest,
només els aplastas junts, i després se'ls prefix 0x.
No vol dir res que no sigui una pista visual a un human--
aquí ve un value-- hexadecimal perquè pot ser que no d'una altra manera seria obvi.
>> És a dir, en última instància, que el patró de zeros i uns,
o el patró de hexadecimal dígits equivalentment que ets
va començar a buscar en Butlletí de problemes 4 és esto--
i el problema 4 set spec caminarà a través d'això amb més detail--
però s'adonen com una mena de arcà com això podria semblar a primera vista,
vas a començar a veure això molt.
I de fet, fins i tot en GDB, el depurador vam introduir el dilluns
i Dan introdueix en PSet 3, va sovint li mostrarà valors hexadecimals
només perquè tendeixen a ser més convencional que decimal o binari
en el món de les computadores.
Ara anem a posar això en context.
Molts de vostès poden recordar això imatge aquí, que va venir de què?
Vista, per la qual cosa fins i tot abans del que que, Windows XP van fer aquest debut.
Així que aquest és un bell paisatge.
I de fet, si treus el cap al voltant online-- Crec que és un article de Wikipedia,
en on algú molt sorprenentment va sortir trobat aquest lloc en el món creat
la seva càmera en precisament el lloc-- dret
i això avui sembla com-- però és exactament la mateixa configuració.
Aquesta imatge, però, està en un arxiu format anomenat mapa de bits, b-m-p.
I anem a prendre un super ràpid cop d'ull al que això significa.
>> Però de mapa de bits és només una forma diferent de imatges que representen encara amb píxels
en 0 i 1, en última instància.
Però al ràpid cop d'ull, té una signatura més interessant
en el principi de l'arxiu.
No es tracta només de tres bytes, en lloc hi ha
un munt de patrons de bytes que han determinat significat.
Per exemple, en algun lloc de la primers bytes de la imatge de mapa de bits
va ser la mida de la imatge, l'amplada de la imatge,
l'altura de la imatge, per la metadades útils, si es vol.
Informació útil que Photoshop o qualsevol gràfic programa que utilitza
en realitat podria preocupar-se.
>> Així més sobre això en Problema 4 set, però això
és només per dir que al final del dia
tots els formats d'arxiu que vostè ha estat utilitzant per als arxius de Microsoft Word anys--,
Números arxius, arxius d'Excel, qualsevol nombre de formats d'arxiu
que podria tenir alguna extensió d'arxiu conegut
són només 0s i 1s sota el capó.
I els éssers humans han decidit el que les convencions són,
el que els patrons de 0s i 1s representen presentar una paraula davant d'un arxiu d'Excel,
davant de qualsevol nombre d'altres formats d'arxiu.
Així que en PSet 4, tindrà un oportunitat de jugar amb això.
>> Però què significa tenir una estructura.
Això és realment una bona segue ara en C, que té només un parell
característiques d'addicionals que no hem mirat encara.
És una molt petita llengua i un les característiques bones de C és una estructura.
Per exemple, si vostè volgut represent-- anem
Dius que volia tenir una variable que representa un estudiant en algun programa.
Potser estigués escrivint un curs programa de registre, o de compres nucli
eina, o alguna cosa així.
Quins són peces de dades relacionades a un estudiant que ve a la ment?
Com un estudiant és representat amb quins valors?
Sí?
Vostè té un nom com a estudiant.
¿Què més ha un estudiant típic?
>> AUDIÈNCIA: [inaudible]
>> DAVID J. Malan: Així que, ho sento.
>> AUDIÈNCIA: Edat.
>> DAVID J. Malan: Una edat o aniversari equivalentment, si.
Què més?
AUDIÈNCIA: número d'identificació?
DAVID J. Malan: Així que un número d'identificació, potser un número de telèfon, potser un dormitori, o casa,
o la universitat, o alguna cosa així.
Qualsevol nombre de peces de dades que que pugui tenir en la seva llista de contactes
és el que es podria definir un estudiant.
Així que si el que volíem fer això, en el codi, que podríem fer una cosa tan simple com això.
Pot ser que tinguem un programa perquè té diguem, int main (void).
I si vull representar una estudiant que podria tenir, per exemple,
una cadena anomenat nom per a aquest estudiant, una cadena anomenada dormitori per a aquest estudiant,
potser un int anomenat ID per a aquest estudiant.
I perquè estic fent servir cordes, em hagi de tornar enrere i aguantar CS50.h.
Potser necessitaré stdio.h.
Així que permetin-me preventivament faig aquestes i estic va a cridar a aquest student.c per ara
i guardi aquest.
>> I ara puc fer alguna cosa amb aquestes variables.
I només anem a escriure que com un comentari en pseudo codi,
perquè no és interessant el que fem de moment.
Acceptar, de manera que aquest és un programa que d'alguna manera emmagatzema un estudiant.
Què és el que vull fer si voleu emmagatzemar dos estudiants?
Així que el meu primer instint va a estar bé, espera un minut,
si tinc un altre estudiant per què no fer jo acaba de fer nom de la cadena 2, cadena de dormitori 2,
int ID2.
I ho hem fet s'ha anat per això abans
i el que era la nostra solució al que sembla a ser una mena de pasta de còpia hackish
feina aquí?
AUDIÈNCIA: Una matriu.
DAVID J. Malan: Sí, podríem utilitzar una matriu.
Feu això molt ràpidament es torna difícil de manejar.
Vostè ha d'ordenar de manera arbitrària iniciar nomenar totes aquestes variables.
I vostè, l'ésser humà, ha de mantenir seguiment que correspon OK nom2
amb dorm2 correspon amb ID2.
Només es converteix en un desastre.
Així que és molt més fàcil, recordar des de fa unes setmanes,
només haver de anomenats noms de cadena i potser ens doni tres d'ells.
I llavors potser tenim dormitoris cadena i tenen
tres d'ells, o amb una constant, int identificadors i tenen tres d'ells.
Però fins i tot ara, això se sent una mica descuidat, dreta.
Estem parlant dels estudiants i no obstant això, Estic realment aturar-se al nivell baix
detalls d'implementació.
L'estudiant és un nom i una residència d'estudiants i la identificació.
>> Per què no puc simplement declarar una variable cridar estudiant i en diuen és.
I si vull un altre estudiant, ¿Per què no simplement ho dic t.
O si vull un munt dels estudiants, per què no ho faig jo només
dir que tinc tota una classe de estudiants, i és tres d'ells.
En altres paraules, per què no puc anar amb el meu propi tipus de dades, anomenada
Els estudiants, dins dels quals és un nom, és una identificació, és una residència d'estudiants,
és qualsevol nombre d'altres camps.
I resulta que pot fer exactament això.
>> Així que C té aquesta característica anomenada struct.
Aquesta és una característica d'un llenguatge que ens permet fer exactament això.
Vaig a seguir endavant i obrir structs.h
on veurem el següent definició d'un estudiant.
Resulta - i aquest és fins i tot més senzill que el que implica un ID
fa un moment.
Si vols arribar a el seu tipus de dades feta a casa,
i més de int i carbó i surar i tots aquests altres que existeixen,
vostè pot fer-ho, literalment, escriure typedef struct,
a continuació, algunes claus, dins dels quals vostè
una llista de les variables que desitja associar amb aquestes noves dades a mesura
escrigui com un nom i un dormitori, i després després de les claus
li dones un nom al nou tipus de dades.
Així, per exemple, dels estudiants.
>> I el que és bo d'això és que ara si ens fixem en el codi corresponent,
la convenció, primer de tots, és posar aquest
en un arxiu anomenat mica dot h, un arxiu de capçalera, que no tenim
començat a fer servir nosaltres mateixos massa.
Però anem a començar usant una mica ara.
I el que podem fer amb això, en última instància, en aquestes poques línies de codi
es declari exactament això tipus de dades, un estudiant.
I ara anem a utilitzar la mateixa.
>> Vaig ara a entrar en un arxiu anomenat structs1.c.
I anem a fer una ullada a una algunes característiques aquí.
Així les coses aquí és sobretot familiar, i anem a
tornar al que no ho és familiar en un moment.
Per descomptat, això és incloent la meva pròpia arxiu de capçalera, que és nou, així,
a excepció de PSet 3 on, retir, tenim helpers.h.
Així que vostè pot recordar helpers.h #include.
>> Per què encara estic fent servir cometes en lloc de claus angulars?
Quan puc triar entre ells?
Gairebé sempre em sembla utilitzar parèntesis angulars.
I després, de sobte, en línia de sis estic fent servir cometes dobles.
Per què podria ser?
Sí?
>> AUDIÈNCIA: [inaudible]
DAVID J. Malan: Això és un real, què?
AUDIÈNCIA: Això està en el seu IDE.
DAVID J. Malan: Sí, això és en el meu IDE real.
I no habiten en l'IDE, perquè això és només una eina que estic fent servir.
Això és al meu actual directori, específicament.
Així structs.h és el meu propi arxiu no s'instal·la a l'IDE,
en el sistema operatiu en si mateix, sinó que és en el meu directori actual.
Així que la convenció és que si vols per incloure el seu propi arxiu de capçalera,
només ha d'utilitzar cometes dobles.
>> Com es diu això en línia 8, en termes generals?
Això és el que?
alguna cosa #define.
Això representa constants, oi?
Si vostè vol tenir un valor en el seu programa
que s'utilitza en la seva totalitat munt de vegades, és
bona convenció per factoritzar a terme, ha de declarar, amb el símbol de hash
definir, llavors, per convenció, en tot majúscules paraula-- encara que no és
estrictament necessari, però és convenció humana
per capitalitzar constants perquè salten
de manera que l'espai i el visually-- llavors el valor que desitja ser
equivalent a nom d'aquesta constant.
No mengi, però simplement seguir aquest patró d'allà.
>> Així que el que estic fent en aquest codi real.
Així que donem una ullada a el programa principal aquí.
A la línia 12 perquè jo s'han inclòs structs.h,
Ara tinc màgicament al meu disposició un nou tipus de dades.
Jo no només tinc accés a int, i char, i el flotador, i la cadena,
i blau i altres.
Ara tinc accés a un tipus de dades dels estudiants.
Així, en la línia 12, que estic combinant dos ideas-- només un tipus de dades personalitzades i dos,
utilitzant una matriu.
I així, en aquest programa si Vull donar suport realitat
tres estudiants de diferents en el meu programa,
simplement pot dir-me una variable anomenats estudiants, cadascun dels quals
és dels estudiants de tipus, que és el meu tipus de dades personalitzat.
I, en concret, dóna'm tres d'ells en el meu matriu.
>> Així que ara, què fem en aquest programa?
Heus aquí només per a la iteració del bucle de 0 a 3, perquè això és
qual cosa el valor dels estudiants és.
Només estic demanant a l'usuari dóna'm el nom de l'estudiant.
I després, en la línia 17, que tenir una línia sobretot familiar.
Tenim el nostre vell amic GetString a la dreta.
¿I quin tros de sintaxi és aparentment nova,
si mai has programat en C abans, i mai han utilitzat les estructures?
Sí?
>> AUDIÈNCIA: El .name.
DAVID J. Malan: El .name.
Però això no és massa d'un salt, perquè ara els estudiants suport d'E
li dóna a l'estudiant d'ordre i.
I si vols bussejar dins d'aquesta estructura,
només ha d'utilitzar un sol període i a continuació, el nom de la variable dins,
o la propietat dins d'aquest Vols tenir accés a.
De la mateixa manera llavors, si a continuació, demanar al usuari, dóna'm residència de l'estudiant,
es pot emmagatzemar de manera similar que cadena en la variable de residència a l'interior
que l'estructura dels estudiants.
>> I ara les coses es posen una mica de fantasia.
I això es va a veure en potser un munt bastant aviat.
Però veuràs això molt més en PSet 4, per la qual cosa anem a simplement mirar a ara.
Resulta que en la línia 23 a través 38, què creus que potser estic fent?
He tret els comentaris per avui, però la versió
del codi en línia per referència té tots els comentaris.
Què em sembla que estic fent?
>> AUDIÈNCIA: Guardar l'arxiu amb tot la informació que l'usuari ha introduït.
>> DAVID J. Malan: Sí, exactament, aquesta és una nova forma
que estem veient dues, una altra característica de C,
mitjançant el qual puc crear els meus propis arxius.
Fins ara, gairebé tots els programes que has escrit és apàtrida.
Tan aviat com es fa córrer, això és tot.
No hi ha memòria o record d'ella.
No hi ha cap fitxer desat.
Però si vostè vol guardar entrada que té
succeït, com en un joc o un programa així, resulta que podem fer-ho.
I veuràs això més en PSet 4 i en la Secció.
Però aquesta línia 23 essencialment crea un arxiu anomenat students.csv.
I que podria haver vist això abans.
Fins i tot si mai has estudiat CS abans, CSV és de variables separades per comes.
És com una molt pobre home versió d'un arxiu d'Excel,
el que significa que es pot obrir en Excel i en Nombres d'Apple,
i té files i columnes.
Però no és una propietat format com Microsoft o Apple.
Són només les comes que separen el valors que veurem en un moment.
>> I acaba de prendre una conjectura.
En la línia 23, en el mateix final, el meu segon argument
a aquesta nova funció anomenada f obert per obrir l'arxiu és w.
El que podria denotar w?
Sí?
>> AUDIÈNCIA: Se li permet escriure al fitxer?
>> DAVID J. Malan: Permet s'escriu al fitxer.
Així que hi ha un parell de variants que podem endollar aquí.
Però si el que vols llegir l'arxiu, és mirar-
i llegir-lo en la memòria, només ha d'utilitzar cometes "r".
Si voleu escriure al arxiu, utilitzeu cometes "w".
També ha annexar i un parell d'altres coses
si voleu modificar els arxius existents.
Ara seguirem veient a aquesta cosa, llavors ens tornarà a la línia 24.
NULL, resulta, és un valor especial que
poden ser retornats per certes funcions si alguna cosa ha anat wrong--
si el fitxer no existeix, si t'has quedat sense memòria,
o un munt d'altres errors.
Però per ara, anem a suposar que aquesta és la comprovació d'errors simplement convencional.
Aquí, a la línia 26, que estic iteració de 0 a 3 sobre tots els meus estudiants.
I això és una espècie de classe d'una nova funció, fprintf,
però només prendre una conjectura.
Si printf és només d'impressió una cadena amb format,
¿Què significa probablement fprintf?
AUDIÈNCIA: Imprimir a un fitxer.
DAVID J. Malan: Imprimiu una cadena amb format a un fitxer.
Això és el que la taxa addicional mitjans f és arxiu.
I el nou primer argument ha de ser la variable que representa el fitxer.
Llavors només tenim un format cadena com printf.
I tot i que aquest la sintaxi és nou, això només
significa connectar el nom de l'estudiant, plug-in de la residència d'estudiants, i després
amb fclose, tanqueu el fitxer.
I després lastly-- això és nou i tornarem a aquest
abans long-- estic alliberant l'estudiant per raons
això va passar per sobre d'allà.
Però tornarem a que abans de long--
això és a causa de com és GetString en realitat treballen sota de la campana.
>> Així que anem a fer una ullada ràpida aquí.
Si escric ls en el meu directori, adonar que no ho faig
tenir un arxiu anomenat students.csv, simplement no hi ha, no existeix.
Així que si ara puc compilar aquest programa, fer estructures-1 ,. / Estructures-1,
i jo vaig a seguir endavant i escriure Andi, que viu a Berkeley a Yale.
Haurem de Rob viu en Thayer aquests dies.
I arribarem amb el lloc on és, crec, Maria està en Mather,
si he recordat correctament.
>> Així que res sembla succeir.
Però si escric ls ara, hi ha students.csv.
Seguirem endavant i students.csv oberta.
Això és de nou una molt format d'arxiu de pes lleuger.
Però simplement he adoptat una convenció que tinc dues files i columnes aquí.
La primera columna és primers noms de les persones.
La segona columna és l'estudiant de dormitori, o universitat, o una casa, o el que sigui.
I ara m'he estalviat aquest permanentment en un arxiu.
>> Així que no és tan interessant.
Però això és només un esglaó en el camí ara de ser capaç de mantenir la informació
de forma permanent.
Així que anem a veure ara què més podem veure amb aquestes i altres característiques.
Però primer, qualsevol pregunta?
Això era molt, i això va ser ràpid.
Però veuràs un munt més en PSet 4, també.
Sí?
>> AUDIÈNCIA: Hi ha una manera de seguir afegint noms a aquest arxiu?
>> DAVID J. Malan: Bona pregunta.
Hi ha una manera de continuar afegint noms a aquest arxiu?
Sí.
I, de fet, si al final fins a tornar a obrir l'arxiu,
vostè utilitzaria cotització fi de la cita "a" per afegir,
que acaba d'afegir una nova línia, 1 nova línia una vegada i una altra, exactament.
Bona pregunta.
Altres preguntes?
Sí?
AUDIÈNCIA: Si va executar el programa de nou en aquest moment,
caldria seguir afegint noms a la Arxiu o hauria d'obrir un nou arxiu?
>> DAVID J. Malan: Ah, bona pregunta.
Si va executar el programa de nou a la dreta Ara, potser escrit en nous noms,
caldria afegir a l'arxiu o sobreescriure l'arxiu?
Això últim, perquè estic No s'utilitza el mode d'agregació.
I perquè estic cegament obrir l'arxiu per a escriptura,
que només va a sobreescriure l'arxiu.
Així que jo de fet que hagi de fer és afegir, si jo vull tenir en realitat un llarg termini
base de dades.
>> Ara CSV és útil, francament, fins i tot per com si ets writing--
i finalment veurem aquest més tard en el semestre quan
fem servir CSVs per a altres fins.
Si voleu emmagatzemar tota la gent que s'han registrat per algun esdeveniment,
o inscrit per la seva estudiant grup, o alguna cosa així,
emmagatzemar les dades en aquest tipus de format és molt pràctic.
A causa que, literalment, si eren per descarregar aquest arxiu.
Podia double-- i anem a tractar aquesta realitat
si tinc Excel o números aquí.
>> Vaig a botó dret del ratolí o control clic en el meu arxiu.
Vaja.
Feu clic dret o control clic en el meu arxiu.
Anem, el meu ratolí no està cooperant.
Download-- vaig a descarregar tots els arxius d'aquí, així
perquè jo pugui prendre aquest.
I anem a veure si això funciona students.csv-- primera vegada
He activat.
Ara volen veure els meus contactes.
Ara, m'he de registrar.
Vegi el fàcil que és utilitzar CSV?
Sí, segueix així fins a la data.
OK, ara estem preparats per a la classe.
OK, oh, què hi ha de nou?
OK, a prop.
Va ser màgic.
Bé, ara hem de actualitzar.
I ara, es va oblidar del que presento vaig obrir originalment,
però el que A-- aquí anem.
OK, així que ara tenim un arxiu d'Excel.
Gràcies.
>> OK, així que el que vaig fer va ser la part fàcil.
Per descomptat que podria haver instal·lat prèviament Excel o Numbers, o qualsevol programa.
Però això és bo, perquè ara puc manipular
les dades en un format estàndard.
>> Així que ara anem context canviar a on ho vam deixar
l'última vegada, que anava a començar per enlairar les rodes d'entrenament.
Però primer, no ho vas fer veure aquest dinar anterior
de nou està succeint aquí a Foc i Gel a Cambridge, Sitar a New Haven.
Registra't a la pàgina web CS50s ASAP per unir-se als estudiants CS50 i el personal.
>> Així que prenem les rodes d'entrenament fos el dilluns a causa de follows--
cordes ha estat declarat en Biblioteca CS50s durant algun temps.
I és bo, perquè permet que parlem de les variables com
paraules i frases completes i més.
Però resulta que la cadena no existeix.
Això és només un sinònim o un àlies, que hem creat una cosa que
en realitat és una mica més tècnica anomenada char *.
>> I de fet, vam veure un exemple d'un programa d'aquest dilluns
que no es va comportar bastant com esperàvem.
Aquest va ser l'arxiu, comparar-0.
I recorden que comparar-0, si Jo recompilar el programa de dilluns
i executar compari-0 i el tipus de mare a minúscules, i la mare en minúscules nou.
El programa va insistir que escriure coses diferents,
tot i que la mare, tot en minúscules, és idèntic visualment.
Llavors, ¿quina va ser la resposta curta per què l'equip pensa
aquestes dues cadenes són diferents?
Sí?
>> AUDIÈNCIA: [inaudible]
DAVID J. Malan: Correcte.
Així, la mare, el primer cop Escric en ella, està sent
emmagatzemada en algun lloc del meu equip memòria, però en una ubicació diferent
que la segona vegada que escric en mare.
Ara sense dubte és optimitzat.
L'equip podria ser intel·ligent i donar-se compte d'aquestes dues cadenes, hey,
són idèntics.
Permetin-me no redundant emmagatzemar-lo.
Però els ordinadors no fan això optimització llevat que digui que ho facin.
Així que, per defecte, que són només va a acabar
en dos llocs diferents en la memòria.
I així, per ser més clar, quan comparem les dues cadenes,
El primer va ser anomenat s, el segon va ser anomenat
t, el que era específicament I comparant aquí a la línia 13?
Sí.
>> AUDIÈNCIA: És el lloc en la memòria que la variable apuntarà a.
>> DAVID J. Malan: Exactament, jo era comparant el lloc en la memòria
aquelles variables que apuntaven a.
Així en concret, si la mare estava en el byte número 1, i 2, i 3,
i 4-- perquè recorden la barra invertida 0 ha de ser tot el camí al final.
I l'altra instància de la mare, m-o-m, va ser en la direcció 10, 11, 12 i 13.
Jo estava comparant 1, aquesta direcció, que la ubicació en la memòria,
contra 10, que és òbviament no és el mateix.
1 no és 10.
>> Així que això és agradable en què és bastant senzill.
Però és problemàtic en la mesura sembla que no podem comparar cadenes.
Així fundamentally-- i en aquest baix nivell,
si vostè vol posar en pràctica un programa per comparar
dues paraules separades que la usuari ha escrit quant a qualitat,
fan que s'alineen carbó per char, només en termes generals,
¿Què és el que hem de fer, pel que es veu?
No n'hi ha prou només per mirar aquestes dues direccions.
Què necessitem fer?
Sí?
>> AUDIÈNCIA: Iterar a través la cadena [inaudible].
>> DAVID J. Malan: Sí, anem a iterar a través de la cadena.
Utilitzarem un bucle for, un bucle while, o el que està més còmode.
I si tenim dues cadenes en algun lloc en la memòria, donem una ullada a cadascun
primer caràcter, llavors cada un és segon caràcter, a continuació, tercer, i quart,
i cinquè, fins que va colpejar quin valor especial sentinella?
AUDIÈNCIA: [inaudible]
DAVID J. Malan: Sí, la barra invertida zero, en el punt, ja sigui en cadena de
podem decidir que això és tot.
Hem aparellat cada personatge?
En cas contrari, retorna fals.
Si és així, torneu realitat.
I això és exactament el que aquesta versió del programa compara-1.c fa.
És idèntic al que mirat dilluns excepte que he I
lliurat de la paraula string-- encara que no té impact-- funcional tot
Que estic fent ara és l'eliminació algunes rodes d'entrenament visual,
sinó per veure clarament que s i t són direccions.
I això és el que l'estrella, l'asterisc, representa
és una adreça, també coneguda més tècnicament com un punter.
>> Així que quan em declaro en s la línia 9 i dir char * s,
això no vol dir que em donés una cadena.
Això vol dir que em doni una variable el propòsit en la vida és emmagatzemar una adreça.
Perquè jo estic a punt de posar el direcció d'una cadena en el mateix.
I, en efecte, GetString, per ser clar, no retorna una cadena.
No retorna mare barra invertida zero, per se.
Què significa GetString específicament i tornar precisament?
AUDIÈNCIA: [inaudible]
DAVID J. Malan: Una adreça, la direcció del primer caràcter
en alguna cadena s'ha aconseguit.
I pel que ara estem veient una paraula clau especial de nou.
I, vaig al·ludir a aquesta abans.
Això serà bo de convencions que anem a veure una vegada i una altra ara.
Estic comprovant per assegurar-se que s no és nul i t no és nul.
A causa de que la base de la meva realitat menció ràpida abans,
el que podria significar si GetString no torna una adreça, però N-O-L-L, que és de nou,
algun valor especial?
>> AUDIÈNCIA: Error.
>> DAVID J. Malan: És un error.
Alguna cosa ha anat malament.
I el que normalment que podria succeir, especialment
amb el que podria ser strings-- de longitud desconeguda en advance--
potser els equips dels sense memòria, potser
que ha escrit de tal llarga paraula o frase
o enganxat un gran assaig tals que no hi ha prou memòria.
I així GetString no pot tornar la direcció de tot l'assumpte,
de manera que només retorna res.
I diu un error ha ocorregut retornant el valor especial NULL.
És l'adreça de zero, per així dir-ho.
>> Ara resulta que C ve amb un funció que fa que iteració.
No tenim per implementar això amb un bucle o un bucle while nosaltres mateixos.
Podem utilitzar una funció, anomenada de manera succinta,
regiri un esborrany, o cadena comparar, la propòsit en la vida és fer exactament això.
Se li dóna dos punters, dues direccions, i va a anar a aquestes adreces
i després comparar carta per lletra per lletra per la qualitat,
detenint-se només quan el que és veritat?
Quan intuïtivament d'agitar un esborrany deixen d'iteració, per ser clars?
Quan es realitza una barra invertida 0 en qualsevol cadena, en el punt es pot decidir
té tot igualat, o ha hagut una discrepància?
>> Per tant, si correm això ara i tractar el nostre petit joc de capitalització,
així que compari-1, ./compare-1, i escrigui mare en minúscules en ambdues ocasions.
Ara és el mateix.
I si ho faig de nou amb minúscula i després potser majúscules.
Ara en veritat distingeix entre majúscules i minúscules.
Així que no és tan difícil o màgic, però sí ara explicar
el que està passant sota de la campana.
>> Llavors, què més es pot extreure que d'aquest tipus de lliçó?
Així que anem a fer una ullada a això.
Vaig a seguir endavant i escriure una programa ràpid aquí anomenat còpia-0.
I ara anem a seguir endavant i de fet farem esto-- amb el còpia-0,
fer una ullada al que tinc aquí.
La primera vegada que dic que l'usuari, dir alguna cosa.
Llavors si una cadena i vaig guardar en s.
Llavors puc comprovar si s és igual a és igual a NULL, simplement tornar 1.
Així que això és només la comprovació d'errors estàndard.
Res interessant ha succeït.
I de fet, si ens desfem de l'error xecs, això s'assembla a la setmana 1 codi
en el moment.
Però he començat a aconseguir un mica millor per això.
>> Ara bé, en la línia 16, fa una setmana, potser dia fins i tot un parell de minuts o fa,
es podria dir la línia 16 és la creació d'una variable anomenada t
i la còpia és en ella.
I això és una perfecta menjar per emportar raonable.
Però més exactament ara.
El que està succeint en la línia 16?
El que està sent copiat de dreta a esquerra?
Sí?
AUDIÈNCIA: És t rebent una adreça de s?
>> DAVID J. Malan: Exactament, t és aconseguir la direcció de s.
Així que per ser clar ara, si em vaig de nou a aquest exemple anterior
i extrec el que he escrit en.
I el que he vaig escriure en-- aquí està s, i aquí
és el que he escrit en algun lloc de la memòria, la mare i després una barra invertida
0 que s'agrega per a mi.
El vaig guardar aquí, recordar, això és en la posició 1, 2, 3, 4,
això és el que hi ha actualment al s.
Així que si en la línia 16, dic dóna'm una altra variable anomenada ti botiga
en en el valor de s, el s'emmagatzema aquí no serà mare
sinó només el número 1.
>> Així que si mirem cap al futur en aquest programa ara, ¿què passarà?
Així que observi que hi ha aquesta funció podria
han fet servir aquest temps enrere per César, o Vigenère, o potser no del tot.
Jo reclamo amb la meva printf, estic va capitalitzar la còpia t.
Primer a la línia 19, el seny ràpida control, controls strlen la longitud del t.
Perquè jo no vull tractar de capitalitzar alguna cosa
si no hi ha cadena d'allà.
Si l'usuari només cal prémer Enter, no hi ha res per treure profit.
Així que no vull fer la línia 21.
Així que la línia 21 està capitalitzant quina lletra, pel que sembla, en t?
>> AUDIÈNCIA: m?
DAVID J. Malan: Sembla com si fos la còpia quin?
AUDIÈNCIA: m.
DAVID J. Malan: Uh, m.
OK, així que la primera m, degut avís que estic
passant a ToUpper, que si mai has vist és
només una funció de capitalitzar com la seva entrada.
t suport de zero significa donar em el caràcter zero del t.
I llavors, com funciona això canvi d'imatge, per ser clar?
Què es necessita per ser reescrit o modificat respecte de s i t i la mare
zero barra invertida.
>> AUDIÈNCIA: [inaudible]
>> DAVID J. Malan: Sí, així que aquest aquí simplement
necessita per canviar-A-- fixar esto-- ha de canviar-se a una capital m.
Però ara, i mira endavant en el programa, si imprimeixo
s i t com puc netejar aquí, veure el que hi ha passarà imprimint s i t.
Així que copia-0, ./copy-0.
Déjame anar endavant i escric en mare en minúscules.
Observi l'original i la còpia s'han capitalitzat.
Per què?
Bé, s i t són els dos apunten a, si es vol, la mateixa quantitat de memòria.
I, francament, això s'està posant Realment uninteresting-- el fet
que estem utilitzant zero direcció aquí.
Vull dir, no m'importa on la matèria està en la memòria.
Ho sento, estic esborrant una mica massa.
Però jo no m'importa on són les coses a la memòria.
I així, de fet, el que programadors tendeixen a pensar
és que quan es parla de una adreça, o un punter,
a qui li importa on està en la memòria.
No m'importa si és en byte un o mil milions.
Jo només m'importa que aquesta variable és efectivament
assenyalant en aquest tros de memòria.
I així, a partir d'ara, en lloc d'objecció sobre les adreces de memòria arbitràries, anem a
simplement començar a dibuixar punters com punters, com fletxes.
Així que el que S i T són en realitat, d'acord amb aquest programa,
per la forma en què he creat t, és només dues variables separades
assenyalant al mateix tros de memòria.
I no ens importa on es trobin.
Així que podem abstreure aquest detall.
>> Llavors, com puc solucionar això?
Si vull escriure una versió de la còpia programa que en realitat copia la cadena
i capitalitza només el còpia, simplement intuïtivament,
el que ha d'haver una ingredient per a la nostra solució?
AUDIÈNCIA: [inaudible]
DAVID J. Malan: Necessitem un què?
AUDIÈNCIA: Tros de la memòria.
DAVID J. Malan: Necessitem altra part de la memòria, no?
No sabem com fer-ho, però, necessàriament.
Però quin tipus de necessitat que això passi de manera que la mare original en cas de baixa
acaba en aquest tros extra de memòria.
I després quan canvi la còpia, jo no volen canviar aquesta còpia aquí.
Jo en canvi vull canviar només això còpia perquè l'original no es modifica.
>> Així que, anem a veure com podem fer això.
En copy-1, que ja té estat desposseït de comentari,
però es comenta en línia.
En el seu lloc fem la following-- aquests línies són idèntics, porta-me'n una cadena
i en diuen és.
Però ara anem a veure un dels nostres més complex, però l'últim de la complexitat
per un temps, la línia 16 fa exactament això.
Així que si la seva còmoda, amb la foto acabem drew--
dóna'm un nou tros de memòria, copiar tot en ell,
anem a veure com traduïm això a codi.
>> Així que la línia 16, al costat de la mà esquerra, char * t em dóna aquesta caixa aquí.
Això és tot el que fa.
A la part dreta, m alloc o malloc,
és l'assignació de memòria, super luxós, una forma críptica de dir simplement
dóna'm un tros de memòria.
Quanta memòria necessitem?
Bé, és una mena de gran expressió.
Però anem a veure el que diu aquí.
Així que això, per descomptat, és donar me la longitud de cadena del s.
Així, la mare ha de ser què?
Així que només tres, no? mare és de tres caràcters.
No comptem el barra invertida zero quan
parlar de la longitud d'una cadena que és en realitat les lletres visibles humans.
Així que la mare, així que això em dóna 3.
Però esperi un minut, jo ara estic afegint 1.
Per què en realitat vull assignar els 4 bytes i no només 3?
Sí?
>> AUDIÈNCIA: Per al valor sentinella?
>> DAVID J. Malan: Exactament, per aquest valor sentinella.
Per a la barra invertida zero, Necessito 4 bytes en total.
Així que necessito la longitud de la cadena més 1.
I a continuació, només per al bé measure-- tot i que en aquest sistema,
Sempre serà 1-- que estic dient multiplicar aquest per la grandària d'un char.
Resulta que és sizeof un operador en C que
només te la diu nombre de bytes que és
requerida per a un cert tipus de dades.
No funciona per a les matrius, típicament, de vegades ho fa.
Però en el cas general, no.
Però em dirà quants bytes d'un Char és, que resulta és sempre 1.
Així que això és com multiplicar per 1.
>> Línia de mira tan super críptica de codi.
Però tot el que fa és dóna mi un tros de memòria.
Però tampoc sembla estar copiant res en aquesta memòria?
Encara no.
I així, què tinc a la línia 22 i 23, 24, 25, bé, jo simplement faig això.
I això és una espècie de antic coses de l'escola ara.
Això és com PSet 2, on estàs movent coses
voltant en la memòria, o més aviat en les cadenes.
>> Així que estic iteració de 0 a la longitud de la cadena s.
I estic copiant el caràcter d'ordre i en s en el caràcter d'ordre i en t.
I perquè jo, el programador, va fer Assegureu-vos d'assignar exactament tants bytes
ja que necessito, és perfecte un-a-one relació.
I copio mare en minúscules a la nova.
I després, finalment, faig aquesta línia.
I pel que l'efecte és només per capitalitzar aquest t aquí.
Així que molt d'absorbir, però si només consideres
el que realment està passant de sota el capó
s'acaba de moure aquests bytes voltant, tot el que
que es necessita per resoldre aquest problema és just per donar a aquest tros de la memòria.
Ara amb el risc de aclaparadora, deixa mostrar
un altre exemple que és gairebé idèntica, a excepció d'aquest
línia de codi.
Així que aquesta és la versió pirata d'aquest programa, si es vol.
Però anem a destil·lar en el que està passant.
Línia 24 solia ser aquest t suport d'I aconsegueix s abraçadora i.
Ara, vaig a canviar això a l'estrella molt més críptic t
més 1 és igual a l'estrella s més 1.
>> Així que el que està passant i per què tenim un personatge estrella?
Hem vist l'estrella abans, i s'està utilitzant de manera diferent aquí.
Anteriorment vam veure char *, ara que estic veient Una estrella al principi, i això està bé.
Perquè resulta que pot tipus d'inferir només
dels primer principis del que està passant.
Així que perquè quedi clar, el que és s?
La setmana passada, era una cadena.
Això no n'hi ha prou.
Què és s, específicament?
>> AUDIÈNCIA: [inaudible]
>> DAVID J. Malan: És un punter.
És l'adreça del primer caràcter que va escriure en.
OK, quin és t?
>> AUDIÈNCIA: [inaudible]
>> DAVID J. Malan: La direcció del primer byte
en t, que parteix de la memòria reasignada.
Així que resulta que quan iterar des de 0 fins a la cadena
longitud-- en primer lloc, i comença a 0, ja que
d'aquesta vella escola pel bucle.
Així que per simplicitat, anem a assumir que la primera línia de codi
és realment només això, la dreta.
Si i és zero, afegint zero a alguna cosa presumiblement
no va a tenir un efecte.
>> Llavors, què és aquesta paraula?
Resulta que l'estrella operador en aquest context
és la dereference operador, que és just
una forma elegant de dir anar a la següent adreça.
Així que si s és la direcció de la primera personatge en aquesta part de la memòria,
* S mitjans hi van.
I perquè hem dibuixat la imatge d'aquesta manera,
pot adoptar el següent model mental.
Si això és s, i dius * s * s, alguna cosa així com rampes i escales,
si vostè recorda el joc de la infància, és com seguir la fletxa i anar
a la direcció.
>> * T és la mateixa cosa.
Així que comença aquí, aneu al seu tros.
No puc dibuixar en aquesta pantalla d'aquesta manera.
* T vol dir anar aquí.
I després, el bucle for és només dient moure aquest personatge aquí,
moure aquest personatge aquí, moure aquest personatge aquí.
Però, com ho faig incrementación?
He de desfer el que acaba d'eliminar.
Això és el que normalment es coneix aritmètica de punters, que
significa matemàtiques amb direccions.
>> Si, en aquest bucle, Segueixo incrementant i,
i s és una adreça i t és un direcció, si jo segueixo afegint 1,
això només significa seguir endavant, i cap endavant, i endavant en la memòria.
És com Oxford Street, el carrer que l'edifici està en CS.
Els edificis CS està en 33 Oxford Street.
Així que si anés a fer 33 Oxford Street, més 1,
que porta a 34 Oxford Street, després 35 Oxford Street,
llavors 36 Oxford Street, qualssevol que edificis són en realitat - si és que existeixen.
I així, això és tot el que estem fent aquí amb l'aritmètica de punters.
>> Així que és una manera estupenda arcana d'expressar-nos.
Però tot el que està succeint sota de la campana
és només seguir aquestes direccions, com seguir un mapa, si es vol,
o seguint les fletxes com hem dibuixat a la pantalla.
OK, una gran quantitat de digerir.
Qualsevol pregunta sobre la sintaxi, els conceptes, punters, malloc, o similars.
Sí, per aquí primer.
>> AUDIÈNCIA: Llavors, on que diu * t és igual a ToUpper * t,
és que va a capitalitzar totes les lletres o sol--
>> DAVID J. Malan: Ah, molt bona pregunta.
Així que en aquesta línia d'aquí, 31, ¿Això va a capitalitzar
la primera lletra o la totalitat de les lletres.
Així que anem a respondre que a l'anar tornar als primers principis.
I els primers principis aquí em refereixo només cal anar a les definicions bàsiques
del que està involucrat.
Així ToUpper és una funció que capitalitza un char.
Això és tot.
* T vol dir anar al primer-- anar a la direcció en t.
Per tant, en la imatge, si aquest és el tros de la memòria ens van assignar amb malloc,
i això és t, * t vol dir anar aquí.
>> Mentrestant, vostè està passant aquest valor, minúscules m
a ToUpper, que està rebent de tornada M majúscula, on estàs posant ell?
Estàs posant en aquest mateix lloc.
I així perquè la lògica d'aquells definicions bàsiques és només
majúscula la primera lletra llevat que iterar amb i o un
de llaç o un bucle while, no va per fer alguna cosa més del que demanes.
Bona pregunta.
Sí?
>> AUDIÈNCIA: Per què s'utilitza el dereference mètode en lloc de
la matriu?
>> DAVID J. Malan: Ah, bona pregunta.
Per què utilitzar el dereference mètode en lloc del mètode de matriu?
No hi ha cap raó en particular, per ser honest.
I, de fet, per a aquest classe d'exemple, a la dreta,
Només estic argumentant fer la programa més complicat,
més ulls estan vidriosos, la gent està mirant
perquè això es veu super arcà, però tot i que està fent el mateix.
I així, francament, es tracta d'una solució innecessàriament visualment complexa
al problema.
>> Segueix sent un bon disseny, cinc de cinc per al disseny,
ja sigui en el suport notació o la notació punter.
Però- especialment quan arribem més tard en el curs de PSet maig
quan posem en pràctica aquest diccionari que He esmentat un parell de vegades--
anem realment es preocupen per la adreces de memòria de baix nivell
que realment entenem què està passant.
>> Però, per ara, resulta que aquesta línia de codi entre parèntesis aquí quadrats
en realitat no existeix.
Ells són el que s'anomena sucre sintàctic, que
és només una manera estranyament freda de dir la compilador converteix claudàtors siguin
que l'expressió matemàtica.
Així que és una convenció humana per poder simplement escriure
aquests suports molt fàcil d'utilitzar.
Però el que el compilador, so metàl·lic, que realment està fent qualsevol moment
escriviu el que està ressaltat en línia 24, sota la capella que és realment
la conversió a això.
És només més plaent com un ésser humà a llegir i escriure codi com la línia 24.
Però amb el temps els rodes d'entrenament també es desprenen
quan la pròpia comoditat es fa més fort.
>> Molt bé, així que recordar llavors que aquest Era el tipus de problema més gran
ens trobem.
I això és el que va provocar tot aquest maleïda conversa sobre els punters,
i adreces, i coses d'copiat.
Va ser perquè ens va espatllar sobre aquesta estúpida, estúpida qüestió, de manera que
He implementat logically-- amb Lauren aquí a la demo i el suc de taronja
en el milk-- 1 perfectament funció algorísmica correcta
per al bombament de dues variables ' valors, però la maleïda cosa
no tenia cap persistent o permanent, efecte en el meu codi.
>> ¿I per què va ser això?
En poques paraules, per què és això implementació de bescanvi
lògicament correcte, però no té cap impacte sobre les variables que es passen a la mateixa,
com x i y per a la principal?
Quina va ser l'essència de la qüestió?
Sí?
AUDIÈNCIA: A causa de la variable fa còpies de la variable en la passada
a través de la funció.
>> DAVID J. Malan: Exactament, quan es passa variables en una funció, o arguments
en una funció, són aprovada per còpia, que
vol dir que vostè obté un aspecte idèntic patró de bits per a tots dos X i Y,
anomenat aquí a i b.
I vostè pot fer qualsevol cosa que vulgui amb aquestes còpies,
però van a tenir cap efecte sobre la funció de trucada.
I, de fet, dibuixem que imatge a la pantalla, el record
l'última vegada, pel que si vostè realment pensar en el que és
passant per sota de la hood-- si això és la memòria de l'equip,
i aquí hi ha la part de memòria que s'utilitza per al principal,
aquesta és la part de memòria que s'utilitza per a l'intercanvi,
i té pel que fins i tot si principal dues variables, X i Y,
intercanvi podria tenir mirant idèntica valors, tots dos dels quals són 1 i 2,
però són completament diferents trossos de memòria.
>> Així que tenim una solució a això.
I, francament, sembla que ara tenir una solució a aquest problema, a la dreta.
Si ara tenim la capacitat de manipular les coses a través de les adreces
i, tipus de rampes i escales estil, seguiu aquestes fletxes
i anar a on vulguem en la memòria, ¿no ens
resoldre aquest problema passant de principal per intercanviar
no els valors que volen swap, però només intuïtivament
¿Què podríem passar per canviar el seu lloc?
>> [Interposant VEUS]
>> DAVID J. Malan: Per què no ho fem només passar-ho les direccions, oi?
Per què no li donem una permuta mapa del tresor, si es vol,
que condueix a la valors reals x i y.
Anem swap, en realitat canviar aquests bits originals, en lloc de
de pas còpies dels bits.
I així, de fet, això és el que hi ha serà la solució.
Aquesta versió aquí és clarament dolent i defectuós.
I ara, a primera vista, que només es veu com hem afegit un munt d'estrelles a l'atzar
i va creuar els dits que seria compilar.
Però, seria ara compilar.
>> Però anem a veure què vol dir això.
I, per desgràcia, els autors de C podria haver triat un altre símbol
per fer això una mica més clara, però l'operador estrella
té significat diferent en dos contextos diferents.
I hem vist tant, però anem a distingir.
>> Així que a la part superior hi ha, quan he canviat a i b
de ser int de la mala versió a int estrelles, a i b,
Anteriorment, es sencers.
Quins són aib ara el bé, la versió verda?
Són direccions.
Direccions del que, per ser clar?
Adreces de nombres enters.
Així que el fet que sóc dient mitjans int estrella
aquesta és l'adreça de un enter, específicament.
>> Així que ara compte en les línies de codi, alguna cosa més ha canviat gaire.
tmp segueix sent el mateix, perquè és sols un nombre sencer temporal,
hi ha màgia memòria allí.
Però ara necessita una estrella.
I, de fet, cada una altra menció de a i b,
adonar que tot el que és canviar de vermell a verd
és que estic anteposant les variables amb les estrelles.
Perquè jo no vull copiar a i b.
Perquè si jo copio a i b i d'intercanvi aib, què estic fet el canvi?
A només direccions, vull canviar el que està en aquestes direccions.
Vull anar-hi.
I pel que l'operador de l'estrella dins de la meva funció,
no dins de la llista de paràmetres, implica que vagi a aquestes adreces
i en realitat canviar aquests valors.
>> Llavors, què fa la foto ara veurà com el seu lloc.
Bé, si en comptes estic passant per A i B no 1 i 2--
Jo realment necessito afegir una altra definició aquí.
Així que suposo que aquest tros de la memòria està en la posició 10.
>> Això és en la posició 11, però això és una mica d'una simplificació,
Ara tinc dues opcions fan que passi x ei o puc passar les seves adreces?
Si pas les seves adreces com aquest, només
ara hem de posar en pràctica intercanvi pel codi de color verd
de manera que quan es veu una i quan b veu, no només has de copiar a i b
i moure la llet i suc de taronja.
El suc de la llet i taronja metàfora ara es trenca,
perquè aquestes són les tasses dels mapes de líquids i no.
Nosaltres en canvi hem d'anar per fer front a 10 i ens
hagi d'anar al front 11, i a continuació, realitzar aquesta lògica intercanvi.
>> Així que la lògica és la mateixa, però necessitem una manera lleugerament diferent
d'accedir a aquestes variables.
I així, al final, el que el programa s'ha de veure com és això.
En swap.c copiat literalment, i enganxar la versió verda.
Però he de fer un canvi.
No n'hi ha prou només per canviar d'intercanvi.
Quina altra línia de codi Què he de canviar?
Sí?
>> AUDIÈNCIA: On pren els arguments.
>> DAVID J. Malan: On pren el seu argument.
Així que si em desplaço fins principal, em no només pot passar en x i y,
i, ho prometo, l'última peça de nova sintaxi avui.
He de passar no xi i, però la direcció de x i y.
I resulta que, el símbol que els autors de C van escollir
és si s'utilitza un signe aquí, no per s'ha de confondre amb el signe bit a bit,
si s'utilitza un símbol d'unió aquí i un signe aquí,
això s'adona que, ¿Quina és la direcció de x,
potser és 10, quin és el direcció de i, potser és
11, i passa aquells al seu lloc.
>> Així que molt d'absorbir tots alhora.
Però vegem ara ràpidament els nostres quatre minuts per al final
on les coses poden sortir malament.
I com un a part, en realitat Vaig prendre aquesta imatge,
TF va prendre aquesta fotografia d'un any o dos enrere.
Així que aquesta és la cantonada posterior d'Eliot Dining Hall.
Els punters són potser els més difícils tema que cobrim en CS50.
Així que si vostè es preocupa el tipus del pendent és com potser és
més d'un pal d'hoquei així, donar-se compte
estem a punt de tipus d'un pic a termes de la complexitat conceptual.
>> I porto a col·lació aquest foto, perquè et juro
a déu, en la tardor de 1996, quan vaig prendre CS50 amb el meu company d'ensenyament,
Nishat Mehta, em va asseure a la cantonada del Eliot D. Hall durant el dinar,
o el sopar, o alguna cosa per intentar per ajudar-me a entendre punters.
I aquí és on vaig estar setmanes després que es va introduir en la conferència quan
Finalment vaig entendre punters.
I tinc l'esperança que aquest farem clic molt abans per a vostè.
Però adonar-se'n absolutament entre els temes més sofisticats
hem vist.
Però és un dels més poderosos.
I quan ho aconsegueixes, és realment tot només va a finalment s'uneixen.
Així que pot estar segur que no ho fa necessitarà tota lavabo a l'actualitat.
>> Així que aquí està l'últim programa veurem.
I anem a acabar amb una ràpids tres minuts d'animació amb plastilina
presa per el nostre amic, Nick Parlant.
Aquí hi ha un programa, que en els dos primers línies declara una variable x i y.
Tots dos dels quals són adreces d'enters, punters AKA.
A continuació, assignar suficient memòria per emmagatzemar un int
i emmagatzemar la direcció que la memòria en x.
Per tant, és encara més simple que l'exemple anterior.
Dóna'm 4 bytes de memòria, aquest és la mida d'un int,
i posar aquesta direcció en x.
Aquesta línia vol dir aquí anar a l'adreça de x
i posar el significat de la vida, el número 42 allà.
Però aquesta línia em preocupa.
Star i significa anar a la direcció en i, i posar el nombre de mala sort 13 allà.
Per què és perillós, en aquest punt en la història- encara que va dir ràpidament
en els nostres últims minuts aquí-- per què és dolent
per a mi dir, anar a la direcció d'i?
>> AUDIÈNCIA: No té [inaudible].
DAVID J. Malan: Jo no tinc posar res en i.
Llavors, quin és el valor de i, en aquest punt de la història?
No tenim ni idea.
És cert valor d'escombraries i ni sap Binky.
Si poguéssim acabar amb aquesta nota.
>> [REPRODUCCIÓ DE VÍDEO]
>> -Escolta, Binky, desperta.
És temps per a la diversió punter.
>> -Què és això?
Assabenti dels punters?
Oh, llaminadura.
>> -Bé, Per començar, crec que estem necessitarà un parell de punters.
>> -D'ACORD.
Aquest codi assigna dos punters que pot apuntar a nombres enters.
>> -ok, Així veig el dos punters, però ells
no semblen estar apuntant a res.
>> -Això És cert.
Inicialment punters no connecti amb res.
Les coses que apunten són anomenada pointees i la que van ser creats
és un pas separat.
>> -Oh, Dreta, dreta.
Ho sabia.
Els pointees estan separats.
Llavors, com assignar un pointee?
>> -ok, Bé aquest codi assigna un nou pointee nombre enter,
i aquesta part fixa xa apunten a aquesta.
>> -Escolta, Que es veu millor.
Així que faci alguna cosa.
>> -ok, Vaig a eliminar la referència del punter x per emmagatzemar el nombre 42 en la seva pointee.
Per aquest truc, necessitaré el meu vareta màgica de l'eliminació de referències.
>> -La Seva Vareta màgica de l'eliminació de referències?
Uh, això, això és genial.
>> -Això És el que el codi es sembla.
Vaig a configurar el nombre i-
>> [POP SO]
>> -Escolta, Mira aquí va.
Així, fent un dereference en x segueix la fletxa per accedir al seu pointee.
En aquest cas, per emmagatzemar 42 allà.
Hey, intenteu fer servir per emmagatzemar el nombre 13 a través de l'altre punter, i.
>> -D'ACORD.
Vaig a anar per aquí ai, i obtenir el número 13 de posada en marxa.
I després prendre la vareta de eliminació de referències i sol--
>> [Buzzer SOUND]
>> Oh, bé això no va funcionar.
Digui, uh, Binky, no ho faig pensar eliminació de referències
i és una bona idea, perquè l'establiment el pointee és un pas separat.
I jo no crec que mai vam fer.
>> -Hmm, Bon punt.
>> -Sí, Ens van assignar el punter, i, però mai ens vam posar a apuntar a un pointee.
>> -Hmm, Molt observador.
-Escolta, Et veus bé allà, Binky.
¿Es pot arreglar perquè els punts I a la mateixa pointee com x.
>> -És Clar, Jo faig servir el meu vareta màgica d'assignació de punter.
>> -És Que serà un problema, igual que abans?
>> -No, Això no toca els pointees.
Només canvia un punter perquè apunti a la mateixa cosa--
>> [Popping SO]
--com altra.
>> -Oh, ja ho veig.
Ara I apunta al mateix lloc que x.
Així, espera, ara i es fixa.
Té un pointee.
Així que vostè pot provar la vareta de eliminació de referències tornar a enviar el 13 més.
>> Oh, bé, aquí va.
>> Escolta, mira això.
Ara dereferencing obres en i.
I pel fet que els punters estan compartint que un pointee, tots dos veuen el 13.
>> -Sí, Compartir, eh, el que sigui.
Per tant, anem a canviar de lloc ara?
>> Oh, mira que estem fora de temps.
>> -But--
>> -Només Recorda les tres regles de punter.
Número 1, l'estructura bàsica és que vostè té un punter,
i apunta a un pointee.
Però el punter i pointee estan separats.
I l'error comú és la creació d'un punter
però que s'oblidi de donar-li una pointee.
>> Número 2, desreferència punter comença en el punter
i segueix el seu ratolí a sobre per accedir al seu pointee.
Com tots sabem, això només funciona si hi ha és un pointee, quin tipus de torni
a la regla número 1.
>> Número 3, punter assignació té un punter
i canvia a apuntar a la pointee mateix com un altre punter.
Així que després de la cessió, els dos punters
apuntarà a la mateixa pointee, De vegades això es diu compartir.
I això és tot el que cal fer, de veritat.
Adéu ara.
>> [FI DE REPRODUCCIÓ]
>> DAVID J. Malan: Això és tot per CS50.
Gràcies al professor Nick Parlant.
Ens veiem la setmana que ve.
>> [REPRODUCCIÓ DE MÚSICA ELECTRÒNICA]