[Música tocando] DAVID J. Malan: Isto é como un seminario hoxe calouro. Aceptar. Entón, moi chuvioso para fóra. Isto tende a ocorrer aos mércores, pero todo máis oportunidade para preguntas hoxe. Entón, imos comezar realmente co filme en só un momento. Pero imos comezar grandiosa como sempre. Este é CS50, e este é o fin de semana 4. Entón, se xa asistiu Televisión ou unha película na que hai algúns especialistas en informática e a policía, ou FBI, ou algunha axencia está intentando incorporarse algúns adversario, así, ten Probablemente xa escoitou a expresión "mellorar" en que de algunha maneira que técnico Magic amplía infinitamente zoom para ver os criminais identidade ou o número da tarxeta o mesmo brillo dun espello ou o brillo de ollos de alguén. Entón, en realidade, imos dar un ollo algunhas desas escenas de Hollywood. [REPRODUCIÓN DE VIDEO] -OK, Agora imos dar unha boa ollada en ti. -Segure-Lo. Executa iso de volta. -Espera un minuto. Desprácese á dereita. -Non, Que conxelar. -Pantalla completa. -OK, Que conxelar. -Tighten-Se en que, vai? -vector En que cara pola roda traseira. -zoom En dereito aquí neste lugar. -Con O equipo certo, a imaxe podería ser ampliada e afiada. -Que é iso? -É Un programa de mellora. -Pode-Se claro que calquera? -Eu Non sei. Imos melloralo. A6 sección -Aprimore. -I Aumentada o detalle, e- Creo que hai abondo para mellorar, liberalo para miña pantalla. -Eu Reforzada a reflexión nos seus ollos. -Imos Executar este través mellora de vídeo. -Edgar, Pode mellorar isto? -Espera. -Eu Benvida a traballar sobre esta reflexión. A reflexión de -Alguém. -Reflection. -Hai Un reflexo da cara do home. -O Reflexión. -Hai Unha reflexión. -zoom En no espello. -Vostede Pode ver un reflexo. -Pode Vostede mellorar a imaxe a partir de aquí? -Pode Vostede mellorar o ben aquí? -Pode Vostede mellora-lo? Pode mellora-lo? -Podemos Mellorar iso? -Pode Vostede mellora-lo? -Mantenha Un segundo, eu vou mellorar. En -zoom na porta. -Times 10. -zoom. -move In. -Máis. Espera, pare. -Stop. -pause-lo. -Rotate Nos 75 graos en torno á vertical, por favor. -Stop. Voltar para a parte Sobre a porta, unha vez máis. -Got Un intensificador de imaxe que pode bitmap? Ei, quizais poidamos utilizar o Pradeep Sen método para ver nas fiestras. Software -Este é o estado da arte. -O Valor propio é desligado. -Con O dereito combinación de algorithm-- Eliminación toma de -El algoritmos ao seguinte nivel, e podo usalos para mellorar esta foto. -Lock En e ampliar o eixe z. -Aprimore. -Aprimore. -Aprimore. -Freeze E mellorar. [FIN DE REPRODUCIÓN] DAVID J. Malan: Todo ben, entón todos estes son realmente palabras. Eles só están amarrados xuntos nun forma que non é realmente sensata. E, de feito, CS50 e cursos como tende a arruinar unha morea de televisión e películas Para ti. Porque cando estes expertos en informática están despexado termos e dicindo cousas extravagantes como vectores propios, eo eixe-z, e calquera número de outros realmente termos máis técnicos, realmente están só amarre palabras xuntas con demasiada frecuencia. É que unha das nosas esperanzas é que, como efectos secundarios de cursos toma como este, será máis persoas no mundo realmente ser capaz de pesar e só moi lixeiramente influír no calidade e precisión deses filmes? De feito, imos dar un ollo a realidade. Entón aquí está a foto do equipo Mary, un dos nosos compañeiros de ensino. E supoño que é sospeitoso de algo. E, con todo, hai un reflexo de algún anaco de evidencia no seu ollo, ou na reflexión dos seus lentes. Ben, se facemos exactamente como as películas propoñer, na que estamos zoom e "mellorar", esta é a cantidade de información é na cara de Mary cando captura unha imaxe con esa resolución orixinal. E, de feito, pode ver isto. E estes son o que son chamados píxeles, P-X-I-E-L-S, que é só unha praza tipicamente que é un punto que compón unha imaxe. E de volta o día, e, de feito, incluso hoxe con algunhas das TVs LED de hoxe ou televisores LCD, que ten un no seu cuarto ou na casa, se ir cara arriba super próximo a el, e especialmente se é unha televisión un pouco máis vello, probablemente pode incluso ver eses puntos e iso é o que compoñer unha imaxe. E non hai máis información que este. Poderiamos "mellorar", no sentido de suavización sobre as cousas e tipo de inferindo tipo de, tipo que cor debe ser preto aos ollos de Mary para que non é realmente tan pixelizada. Pero se eu continuar ampliando, non é a cara mal no seu ollo. Como iso é todo o información que temos. Non pode crear información a partir da nada. Había só un finito número de bits de alí. Así, no Conxunto de problemas 4, onde ten unha oportunidade xogar con este tipo de mundo. En Conxunto de Problemas 4, vai explotar o mundo de gráficos e forense, e realmente escribir código que recupera imaxes perdidas. Vai escribir un código que manipula imaxes existentes e, finalmente, entender o que é pasando baixo o capó. E, ao parecer, é realmente non tan complicado. Por exemplo, se quixésemos representan un rostro sorridente onde con eses píxeles negros, ou estes puntos negros, Ben, nós poderíamos simplemente representar Los como realmente un bitmap. E se nunca tiña oído falar que expresión bitmap, quizais agora comeza a facer unha pouco máis de sentido hoxe. Xa sabemos o que é un pouco. É 0 ou 1. E un mapa é só algo como un anaco de papel que lle dá direccións e ten quizais unha reixa de coordenadas x e y. Entón aquí está un mapa de bits. É un mapa de bits en que 1 é un parecer vai representar un pixel branco, e un 0 vai representar un pixel negro. Pero certamente podería lanzalo ao redor. Realmente non importa, Sempre que esteamos consistente. E aquí está como, en binary-- dentro de memoria dun ordenador, ou mesmo dentro dun ficheiro no seu disco drive-- pode almacenar a máis simple das imaxes da cara do smiley. Pero o que temos, por suposto, falta nesta imaxe? Cor, non? É un seguinte paso evidente ou centrado para mellorar este coa cor. Entón, por desgraza, con só un único bit, 0 ou 1, poderiamos representar cores. Isto podería ser vermello ou azul, ou Black, ou branco, ou verde, ou cor de rosa, ou calquera par de cores. Pero, para simplificar, imos simplemente asumir branco e negro. Entón, o que loxicamente que necesitamos se nós quere aplicar cor nunha imaxe? O que temos que facer? Coma se o factor limitante aquí é que, cun pouco só se pode representan dous estados, 0 ou 1, branco ou negro, o que quere facer? Audiencia: máis datos. DAVID J. Malan: máis bits, , Yeah máis datos, máis bits. E, de feito, iso é exactamente como imaxes en cor son representadas. En vez de usar un único bit, unha 0 ou 1 para cada pixel, cada punto, acaba de usar múltiple. Quizais use 8, quizais, máis comunmente utilizar 24 e, de feito, no Conxunto de problemas 4, vai xogar con un arquivo formato que usa 24 bits normalmente. Pero a maioría de vostedes probablemente están familiarizado con JPEGs. Se xa tomadas unha foto no seu teléfono, ou enviados ou visto algo sobre Facebook ou Flickr, calquera número de sitios baseados en fotos, ten Probablemente xa viu unha imaxe JPEG antes. E ao parecer, este é o ficheiro formato que imos usar en PSet 4, en que vai ter que recuperar imaxes que eu accidentalmente borrados dun tarxeta de memoria corrompida na cámara, se quere. E parece que, a pesar de JPEG é moi sophisticated-- é moito máis sofisticado que os puntos en branco e negro vimos hai pouco, porque hai algoritmos sofisticados que realmente son usados ​​para comprimir un arquivo JPEG, para que pode ter un moi bo, calidade de imaxe, pero usando relativamente poucos bits. E nós imos voltar a compresión antes de tempo. Acontece que o primeiro tres bytes dun image-- JPEG non importa o que teña tomado unha foto de-- son os valores 255, 216, 255. Noutras palabras, se só ver que o patrón de bits, aquí representada como tres bytes, ou 24 bits en total, unha elevada probabilidade, pode inferir que está mirando para el este tres primeiros bytes dun JPEG. E iso é o que se coñece como a sinatura dun JPEG. Unha morea de formatos de ficheiro aí, tenden a comezar con certos estándares de 0s e 1s, para que Windows e Mac OS, e IOS, Android e saber que tipo de ficheiro que son, en suma ao ficheiro de chamada extensión que unha morea de arquivos teñen. Se ten .jpg, iso é outra pista para o equipo. Entón, imos agora mirar para este un pouco máis tecnicamente. Sabemos que o decimal sistema é de 0 a 9. Sabemos binario é 0 e 1. E se pensas que volta a PSet 0 tivemos que loitar con, para algo, algo chamado hexadecimal, onde ten 16 díxitos, 10, en vez de ou en vez de 2. E eses díxitos, por convención, son de 0 a 9 e, a continuación, unha mediante f, onde f representa o que número decimal, así como a sanidade rápida comprobar? Entón, 15. E un debe representar 10, só por natureza da orde que eu dei. É só unha convención arbitraria, pero é moi estándar. Polo tanto, se miramos para este patrón de tres bytes-- imos pode comezar a ollar para el de unha forma consistente coa forma como científicos da computación en xeral mirar e pensar sobre arquivos. Certamente pode pensar en arquivos 0s e 1s, e decimal, pero, en realidade, tendemos a usar binario ou, máis tipicamente hexadecimal-- de volta de PSet 0. Entón deixe-me propor que 255, 216, e 255 son só estes patróns de 0s e 1s. E pode comprobar que se quere facer a matemática de Semana 0. Pero, por agora, só supor que se trata realmente correcta. Acaba reescrito tres decimal números como tres valores binarios. Agora o que eu vou facer é basta engadir un espazo en branco, só polo amor de lexibilidade. E observen, eu só vou para mover as cousas separadas. Polo tanto, antes de, despois, antes, despois. Eu estou facendo nada máis interesante que só estendendo para fóra cousas así que a notificación de cada conxunto de oito bocados agora dous conxuntos de catro bits. Isto é útil porque hexadecimal é particularmente elegante porque cada díxito hexadecimal entre 0 e F, ou, máis especificamente, 0 a 15, pode ser representada con exactamente catro anacos. Noutras palabras, se en hexadecimal quere representar un 0, é só 0000, catro ceros. E se quere representar 15, é 1111, que é catro bits. E se fai as contas, se este é o lugar queridos, este é o lugar 16s, que dará vocę-- si que está pasando a-- moito, en binario, que lle vai dar 15, queridos lugar, twos lugar, catro e oito lugar. Entón deixe-me propor que que conxunto de catro bits na esquerda é o que nós imos chamar f. É o maior número que pode representar con catro bits. E xa sabemos de hexadecimal, f é o maior díxitos en hexadecimal. Temos outro f alí, máis por alí dous. E de momento, pode ter en fe que eu fixen o dereito de Matemáticas e que a metade esquerda deses bits, 1101, é o mesmo que d en hexadecimal. E a man dereita, 1000, está só a 8. E iso é fácil de ver, non? A 8 represents-- é correcto debaixo daquel lugar oitos. Polo tanto, temos unha na columna oitos e nada nos fours, twos queridos ou. Entón, agora máis convencional, o ser humano tende para escribir díxitos hexadecimais como este, só esmaga-los xuntos, e entón prefixar-los con 0x. Isto significa máis que unha pista visual para un human-- aquí ven un value-- hexadecimal porque que non poderían ser evidente. O que significa dicir, en definitiva, que o estándar de ceros e uns, ou o patrón de hexadecimal díxitos equivalentemente que é comezará a buscar no Conxunto de problemas 4 é isto-- e do Conxunto de problemas 4 especificación andará Lo través deste en máis detail-- pero perciben como unha especie de misterioso como este pode parecer a primeira vista, vai comezar a ver moito iso. E, de feito, mesmo en GDB, a depurador introducimos o luns e Dan introduce no PSet 3, vai moitas veces para amosar-lle valores hexadecimais só porque eles tenden a ser máis convencional que decimal ou binario no mundo dos ordenadores. Agora imos poñer isto en contexto. Moitos de vostedes poden lembrar este imaxe aquí, que veu dunha cousa? Vista, polo que aínda antes do que que, Windows XP fixo esta estrea. Polo tanto, esta é unha fermosa paisaxe. E, de feito, se fuçar online-- Creo que é un artigo da Wikipedia, en que alguén moi sorprendente saíu atopamos a localización no mundo creado súa cámara en precisamente o dereito Place-- e que hoxe parece como-- pero é exactamente a mesma configuración. Esta imaxe, con todo, é un ficheiro chamado formato de mapa de bits, b-m-p. E nós estamos indo tomar un super- rápido ollar sobre o que iso significa. Pero bitmap é só un xeito diferente de imaxes que representan aínda usando píxeles en 0s e 1s, en última instancia. Pero polo ollar rápido, ten unha firma máis interesante ó final do ficheiro. Non é só tres bytes, no canto hai unha morea de modelos de bytes que teñen significado predeterminado. Por exemplo, en algún lugar na primeiros bytes dunha imaxe bitmap será o tamaño do imaxe, o ancho da imaxe, a altura da imaxe, de xeito metadatos útiles, se quere. Información útil que o Photoshop ou programar todos os gráficos que está a usar se realmente se preocupan. Entón, máis sobre isto en Problema xogo 4, pero esta é só para dicir que ao final do día todos os formatos de ficheiro que está a usar para arquivos de Microsoft Word anos--, Números arquivos, ficheiros de Excel calquera número de formatos de ficheiro que pode ter algún extensión de arquivo coñecidos son só 0s e 1s debaixo do capó. E o ser humano decidiron o que as convencións son, o que patróns de 0s e 1s representan arquivar unha palabra contra un arquivo de Excel, contra calquera número de outros formatos de ficheiro. Así, en PSet 4, vai ter un oportunidade de xogar con iso. Pero o que significa ter un struct. Este é realmente un agradable segue agora en C, que ten só un par características adicionais que non mirei aínda. É unha linguaxe moi pequeno e un dos as características agradables sobre C é un struct. Por exemplo, se quería represent-- imos di que quería ter unha variable que representa un alumno nalgún programa. Quizais estivese escribindo un curso programa de rexistro, ou núcleo de compra ferramenta, ou algo parecido. Cales son anacos de datos relacionados a un estudante que vén á mente? Como un estudante é representado con que valores? Si? Ten un nome como un estudante. O que máis fai un típico estudante ten? Audiencia: [inaudível] DAVID J. Malan: Entón, desculpe. Audiencia: Idade. DAVID J. Malan: Unha idade ou aniversario equivalentemente, si. Que mais? Audiencia: número de identificación? DAVID J. Malan: Entón un número de identificación, quizais un número de teléfono, quizais un dormitorio ou casa, ou facultade, ou algo parecido. Calquera número de anacos de datos que pode ter na súa lista de contactos é o que podería establecer un estudante. Entón, se nós queriamos facelo, o código, poderiamos facer algo simple como este. Podemos ter un programa para que ten, digamos, int main (void). E se eu queira representar un estudante podería ter, por exemplo, unha cadea chamada nome para ese estudante, unha cadea chamada dormitorio para ese estudante, quizais un int chamado ID para ese estudante. E por que eu estou usando corda, I Debe volver e poñer-se CS50.h. Poida que eu vou ter stdio.h. Entón deixe-me facer os cautelarmente e eu son vai chamar este student.c de momento e salva este. E agora podo facer algo con estas variables. E nós só estamos indo a escribir que, como un comentario no código pseudo, porque non é interesante o que facemos agora. OK, polo tanto, este é un programa que dalgún xeito almacena un estudante. O que quero facer, si quere almacenar dous estudantes? Entón, o meu primeiro instinto vai dar todo certo, agarde un minuto, se eu tivera outro alumno por que non me só facer nome da secuencia 2, secuencia de dormitorio 2, int id2. E fixemos gone polo que antes e cal foi a nosa solución para o que parece para ser unha especie de copia de masilla hackish traballo aquí? Audiencia: Unha matriz. DAVID J. Malan: Si, poderíamos usar unha matriz. Por aquí moi rapidamente pasa a ser difícil. Ten que clasificar de forma arbitraria comezar a nomear todas estas variables. E ti, o humano, ten que manter seguir o que corresponde Aceptar NAME2 con dorm2 corresponde coa ID2. El só se fai unha desorde. Por iso, é moito máis fácil, recordar algunhas semanas só para ter que chamados nomes de cadea e quizais darnos tres delas. E entón quizais temos dormitorios cordas e teñen tres destes, ou cunha constante, int IDs e teñen tres delas. Pero aínda agora que se sente un pouco desleixado, certo. Estamos a falar de estudantes e aínda Realmente estou me deter sobre o nivel baixo detalles de implementación. O estudante é un nome e un dormitorio e ID. Por que non podo simplemente declarar unha variable chamado estudante e chamalo s. E se eu queira outro estudante, por que non eu só chamalo t. Ou, se eu queira un grupo enteiro de estudantes, por que non eu só dicir que teño toda unha clase de estudantes, e é tres deles. Noutras palabras, por que non podo vir co meu propio tipo de datos, chamado Estudantes, dentro dos cales é un nome, é un ID, é un dormitorio, é calquera número de outros campos. E resulta que pode facer exactamente isto. Entón C ten este recurso chamado struct. Isto é un recurso de linguaxe que nos permite facer exactamente isto. Eu estou indo a ir adiante e abrir structs.h onde estamos indo a ver o seguinte definición dun estudante. Acontece que - e este é mesmo máis simple do que o que implica un ID un momento atrás. Se quere vir cara arriba con o seu tipo de datos caseiro, e ademais de Int, e carbón animal e flotar e todos eses outros que existen, pode facelo literalmente escribindo typedef struct, a continuación, algunhas claves, dentro do cal lista das variables que quere asociar a esta nova datos personalizado escriba como un nome e un dormitorio, e logo, tras as claves dar un nome para o novo tipo de datos. Así, por exemplo, estudante. E o que é bo sobre iso agora é que se miramos o código correspondente, a convención, en primeiro lugar de todo, é poñer este nun ficheiro chamado algo dot h, un ficheiro de cabeceira, que non ten comezou a utilizarse nos moito. Pero imos comezar usando un pouco agora. E o que podemos facer con iso, en definitiva, nestas poucas liñas de código é declarar o que tipo de datos, un estudante. E agora imos usalo. Vou agora entrar en un arquivo chamado structs1.c. E imos dar un ollo a un algunhas características aquí. Entón, as cousas aquí enriba é principalmente familiar, e nós imos volver ao que non é familiarizado en só un momento. Isto, obviamente está incluída a miña propia arquivo de cabeceira, que é novo, así como, agás para PSet 3 onde, recall, temos helpers.h. Entón pode lembrar helpers.h #include. Por que eu estou usando comiñas no canto de corchetes angulares? Cando eu escollo entre eles? Case sempre eu parezo para usar soportes angulares. E entón, de súpeto, en liña de seis Estou usando comiñas dobres. Por que podería ser? Si? Audiencia: [inaudível] DAVID J. Malan: Isto é un real, o que? Audiencia: É na súa IDE. DAVID J. Malan: Si, que está no meu IDE real. E non imos debruzouse sobre o IDE, xa isto é só unha ferramenta que está a usar. Isto está no meu actual directorio, especificamente. Entón structs.h é o meu propio arquivo non instalado no IDE, no propio sistema operativo, ao contrario, está no meu directorio actual. Así, a convención é se quere para incluír o seu propio ficheiro de cabeceira, acaba de usar comiñas dobres. O que chamamos esa cousa en liña 8, dun modo xeral? Isto é o que? algo # define. Isto representa constantes, non? Se quere ter un valor no seu programa que use un todo chea de veces, é boa convención para inclui-lo para fóra, declaralo la, co símbolo de hash definir, a continuación, por convención, en todos maiúsculas word-- aínda que non sexa estrictamente necesario, pero é convención humana para capitalizar constantes de xeito que xa saltan fóra en ti visually-- espazo e entón o valor que quere ser equivalente ao que o nome da constante. Sen punto e coma, pero simplemente siga este estándar existe. Entón, o que estou facendo neste código real. Entón, imos dar un ollo o principal programa aquí. Na liña 12, porque eu incluíron structs.h, Agora teño Magic no meu eliminación dun novo tipo de datos. Eu só non teñen acceso á int, e char, e float, e corda, e azul e outros. Agora teño acceso a un tipo de datos do alumno. Así, en liña 12, eu estou quedando dous ideas-- un un tipo de datos personalizado e dous, utilizando unha matriz. E así, este programa se Quero realmente apoiar tres estudantes diferentes no meu programa, eu pode simplemente dicir me dea unha variable chamados alumnos, cada un dos cales é de estudantes tipo, que é o meu tipo de datos personalizado. E, especialmente, dáme tres dos na miña matriz. Entón, agora, o que facemos neste programa? Aquí é só un para a iteración de loop de 0 a 3, que é porque cal é o valor de estudantes é. Eu só estou pedindo ao usuario dáme o nome do alumno. E, a continuación, na liña 17, nós ter unha liña na maior parte da familia. Temos o noso vello amigo GetString á dereita. E o anaco de sintaxe é aparentemente nova, se nunca programado en C antes, e nunca usou as estruturas? Si? Audiencia O .name. DAVID J. Malan: O .name. Pero iso non é moi de un salto, porque agora os alumnos adaptador dálle o estudante i-th. E se queres mergullo dentro desta estrutura, non necesitará empregar un único período e a continuación, o nome da variable dentro, ou a propiedade dentro dese Quere ter acceso. Do mesmo xeito, a continuación, se eu, a continuación, solicitar que o usuario, dáme dormitorio do alumno, pode almacenar de forma semellante que cadea variábel dormitorio dentro de que a estrutura estudante. E agora as cousas están un pouco extravagante. E iso vai ollar quizais nun lote moi pronto. Pero vai ver isto moito máis en PSet 4, entón, basta ollar para el agora imos. Acontece que na liña 23 a través 38, o que pensas que eu estou facendo, quizais? Eu eliminar os comentarios para hoxe, pero a versión do código en liña referencia ten todos os comentarios. O que parece que estou facendo? Audiencia: Gardar o ficheiro con todas a información que o usuario inseriu. DAVID J. Malan: Si, exactamente, esta é unha nova forma que estamos a ver dous, Outra característica de C, en que podo crear meus propios arquivos. Ata agora, case todos os programas escribiu é apátrida. Así que está feito en execución, é iso. Non hai memoria ou recordo del. Non hai ningún ficheiro gardado. Pero se quere gardar entrada que ten pasou, como nun xogo ou un programa como este, ao parecer podemos facelo. E vai ver isto máis en PSet 4 e na Sección. Pero esta liña 23 esencialmente crea un ficheiro chamado students.csv. E pode ver iso antes. Aínda que nunca estudase CS antes, CSV é variables separadas por comas. É como un home moi pobre de versión dun arquivo de Excel, o que significa que pode ser aberto en Excel e en números de Apple, e ten liñas e columnas. Pero non é unha propiedade formato como Microsoft ou Apple. É só comas que separan o valores que veremos en un momento. E só dar un palpite. Na liña 23, no final, o meu segundo argumento a esta nova función chamada f aberto para ficheiro aberto é w. O que pode denotar w? Si? Audiencia: Permite que gravar o ficheiro? DAVID J. Malan: Deixa gravar o ficheiro. Polo tanto, hai un par de variantes que podemos conectar aquí. Pero se só quere ler o ficheiro, que é miralo e le-lo para a memoria, vostede non necesitará empregar entre comiñas "r". Se quere escribir para o ficheiro, use entre comiñas "w". Hai tamén é engadir e un par de outras cousas se quere modificar os ficheiros existentes. Agora imos seguir vendo este cousa, entón imos voltar á liña 24. NULL, ao parecer, é un valor especial que poden ser devoltos por certas funcións se algo foi wrong-- se o ficheiro non existe, se queda sen memoria, ou unha morea de outros erros. Pero, de momento, imos só supoñer que esa comprobación de erros é só convencional. Aquí na liña 26, eu estou iteración 0-3 sobre todos os meus alumnos. E este é o tipo de especie dunha nova función, fprintf, pero só dar un palpite. Se printf é só impresión unha cadea formatada, o que fprintf probablemente significa? Audiencia: Imprimir nun ficheiro. DAVID J. Malan: Imprimir un cadea formatada para un arquivo. Iso é o que a adicional f medios é ficheiro. E o novo primeiro argumento ten que ser a variable que representa o ficheiro. Entón só temos un formato corda así como printf. E aínda que esta sintaxe é novo, iso só significa conectar o nome do alumno, plugin do dormitorio estudantil e, a continuación, con fclose, pecha o arquivo. E entón lastly-- isto é novo e nós imos voltar a este antes long-- Estou liberando o estudante por razóns que pasou alí enriba. Pero imos volver para que, antes de long-- iso é debido a como é GetString realmente traballando baixo o capó. Entón, imos dar un ollo rápida aquí. Se eu escribir ls no meu directorio, notar que eu non fago ten un arquivo chamado students.csv, simplemente non existe, non existe. Entón, se eu agora compilar este programa, facer structs-1 ,. / Structs-1, e eu estou indo a ir adiante e escribir Andi, que vive en Berkeley na Universidade de Yale. Nós imos ter que Rob vive Thayer estes días. E imos chegar a onde é, penso eu, María está Mather, se eu ter lembrado correctamente. Polo tanto, nada parece ocorrer. Pero se eu escribir ls agora, hai students.csv. Imos adiante e students.csv aberto. Esta é unha vez un moi formato leve. Pero eu simplemente adoptou unha convención que eu teño dúas liñas e columnas aquí. A columna é primeiro primeiros nomes da xente. A segunda columna é o estudante de dormitorio, ou facultade, ou casa, ou outros adornos. E agora eu teño gardado ese permanentemente nun arquivo. Polo tanto, non é tan interesante. Pero este é só un trampolín agora para ser capaz de manter a información permanentemente. Entón imos ver agora o que máis podemos facer esas e outras características. Pero, primeiro, algunha pregunta? Isto foi moito, e iso foi rápido. Pero vai ver unha chea máis en PSet 4, ben. Si? Audiencia: Existe unha maneira de continuar a engadir nomes para o ficheiro? DAVID J. Malan: Boa pregunta. Existe unha maneira de continuar engadindo nomes para o ficheiro? Si. E, de feito, se acabar se re-abrir o ficheiro, usaría Cita unquote "a" por acréscimo, que quere só de engadir unha nova liña, a nova liña de novo e de novo, exactamente. Boa pregunta. Outras preguntas? Si? Audiencia: Se executou o programa de novo agora, sería continuar a engadir nomes para o arquivar ou sería abrir un novo ficheiro? DAVID J. Malan: Ah, boa pregunta. Se executou o programa de novo á dereita agora, quizais ingresaran en novos nomes, sería engadir ao ficheiro ou substituír o ficheiro? Este último, porque eu son non usar o modo de datos anexados. E porque son só cegamente abrir o ficheiro para escrita, é só ir para substituír o ficheiro. Entón, eu sería realmente cómpre facer é engadir, se eu queira realmente ter un longo prazo base de datos. Agora CSV é útil, francamente, mesmo para como se é writing-- e imos finalmente ver este a finais do semestre, cando usamos CSVs para outros fins. Se desexa almacenar todas as persoas que rexistrarte para un evento, ou se inscribiu para o alumno grupo, ou algo parecido, almacenar os datos neste tipo de formato é super cómodo. Porque, literalmente, se eu foron para descargar este arquivo. Podería double-- e imos realmente tentar iso se eu tivera Excel ou Numbers aquí. Vou botón dereito do rato ou control-clic meu arquivo. Whoops. Botón dereito do rato ou control click co meu arquivo. Imos, meu rato non está cooperando. Download-- vou descargar todos os ficheiros aquí para só así podo pegar este. E imos ver se funciona primeira vez students.csv-- Eu activada. Agora queren ver os meus contactos. Agora, eu teño que rexistrar. Vexa como é fácil usar CSVs? Si, mantéñase o actualizado. OK, agora estamos preparados para a clase. OK, oh, o que hai de novo? OK, pechar. Iso foi máxica. OK, agora temos que actualizar. E agora, se lle esqueceu o que arquivar I orixinalmente inaugurado, pero o que A-- alí imos nós. OK, entón agora temos un arquivo de Excel. Grazas. OK, entón o que eu fixen foi a parte fácil. Claro que eu podería preinstalado Excel ou Numbers, ou calquera programa. Pero iso é bo, porque agora podo manipular os datos nun formato estándar. Entón agora imos contexto pasar a onde paramos última vez, o que era para comezar para sacar rodinhas. Pero, primeiro, non fixo vexa este xantar antes está de novo pasando aquí no lume e Xeo en Cambridge, sitar en New Haven. ¡Rexístrate neste sitio o máis rápido posible CS50s para unirse a estudantes CS50 e empregados. Por iso, tomou rodinhas o luns como follows-- corda fose declarada en Biblioteca CS50s durante algún tempo. E é bo, porque permite nós para falar variables como palabras e frases completas e máis. Pero resulta cadea non existe. Isto é só un sinónimo ou un alias, que creamos para algo que en realidade, é un pouco máis técnico chamado un char *. E, de feito, vimos un exemplo dun programa o luns que non se comportou así como esperabamos. Este foi o arquivo, compararse 0. E lembrar que compararse 0, se Eu recompilar programa de luns e executar compararse 0 e escriba nai en minúscula e nai en minúsculas novo. O programa insistiu I escriba cousas diferentes, aínda que a nai, todo en minúsculas, é idéntica visualmente. Entón, cal foi a resposta curta por que o ordenador pensa estas dúas secuencias son diferentes? Si? Audiencia: [inaudível] DAVID J. Malan: Correcto. Entón, a nai, a primeira vez Eu escrebela no, está a ser almacenado nalgún lugar no meu ordenador de memoria, pero nun lugar diferente que a segunda vez que eu escribir nai. Agora que seguramente podería ser óptimo. O ordenador pode ser intelixente e realizar estas dúas cordas, hey, son idénticos. Deixe-me redundantemente almacena-lo. Pero os ordenadores non teñen isto optimización a menos que diga a eles para. Entón, por defecto, son só vai acabar en dous lugares diferentes na memoria. E así, para ser máis claro, cando nós comparamos as dúas cordas, O primeiro foi chamado s, o segundo foi chamado t, o que foi que eu especificamente comparando aquí na liña 13? Si. Audiencia: É o lugar da memoria que a variable pode apuntar. DAVID J. Malan: Exactamente, eu estaba comparando o lugar na memoria que estas variables apuntado. Entón, en concreto, a nai estaba en número de bytes 1 e 2, e 3, 4-- e lembre-se porque a barra invertida 0 que ser todo o camiño ao final. E a outra instancia da nai, m-o-m, Foi no enderezo 10, 11, 12 e 13. Eu estaba comparando 1, ese enderezo, esa localización na memoria, contra 10, que é obviamente, non é o mesmo. 1 non é 10. Polo tanto, este é agradable en que é moi sinxelo. Pero é problemático na medida en que parece que non conseguimos para comparar cadeas. Entón fundamentally-- e neste nivel baixo, se quería aplicar un programa para comparar dúas palabras separadas que o usuario escribiu en para a calidade, facer eles se aliñan para carbonizar char, só en termos xerais, o que necesitamos facer, ao parecer? Non é suficiente só para ollar os dous enderezos. O que necesitamos facer? Si? Audiencia: iterado a string [inaudível]. DAVID J. Malan: Si, imos percorrer a cadea. Imos usar un loop, un loop while, ou o que sente máis cómodo. E se temos dúas cordas nalgún lugar na memoria, imos ollar para cada un de primeiro carácter, a continuación, cada segundo é personaxe, entón terceiro e cuarto, e quinto, ata chegar o valor especial sentinela? Audiencia: [inaudível] DAVID J. Malan: Si, a barra invertida cero, momento no que en calquera cadea Podemos decidir que é iso. Temos correspondido cada personaxe? Se non, volverá false. Se é así, return true. E entón iso é o que esta versión do programa compararse 1.c fai. É o mesmo que o que nós mirou luns, agás que eu teño se librar da palabra string-- aínda que non ten impact-- funcional todo Eu estou facendo agora eliminando algunhas rodinhas visuais, pero a ver claramente que s e t son enderezos. E iso é o que a estrela, o asterisco representa é un enderezo, tamén coñecido técnicamente máis como un punteiro. Entón, cando eu declarar s en liña 9 e dicir char * s, iso non significa darme unha corda. Isto significa darme unha variable cuxo propósito na vida é para gardar un enderezo. Porque eu estou a punto de poñer o dirección dunha cadea para el. E, de feito, GetString, para ser claro, non retorna un cadea. Ela non retorna nai barra invertida cero, per se. O que especificamente GetString e precisamente volver? Audiencia: [inaudível] DAVID J. Malan: un enderezo, o enderezo do primeiro carácter nalgunha corda que chegase. E agora estamos a ver a palabra chave especial de novo. E, eu aludiu a que antes. Isto vai ser bo convenio que veremos de novo e de novo agora. Estou comprobando para asegurarse de que s non é nulo e t non é nulo. Porque con base na miña realmente rápida mención anteriormente, o que pode significar, se non volve GetString un enderezo, pero de N-L-L-L, que é novo, algún valor especial? Audiencia: Erro. DAVID J. Malan: É un erro. Algo foi mal. E o que tipicamente pode ocorrer, especialmente co que se pode strings-- de lonxitude descoñecido en advance-- quizais os ordenadores dos sen memoria, quizais escribiu, de tal longa palabra ou frase ou pegado un gran ensaio tal hai non só a memoria suficiente. E así GetString non pode volver a dirección da cousa toda, polo que só volve nada. E el di que un erro ocorreu retornando o valor especial NULL. É a dirección cero, por así dicir. Agora, descóbrese C vén cun función que fai a iteración. Non hai que aplicar iso con un loop ou un loop while nós mesmos. Podemos utilizar unha función, chamado de forma sucinta, trasfega comp ou cadea de comparación, cuxa propósito na vida é facer exactamente isto. Vostede darlle dous punteiros, dous enderezos, e que vai para estes enderezos e entón comparar carta letra por letra para a calidade, parando só cando o que é verdade? Cando intuitivamente debe trasfega comp deixar a iteración, só para quedar claro? Cando chega unha barra invertida 0 en calquera corda, en que punto pode decidir ten todo combinado, ou houbo unha discrepancia? Entón, se nós funcionan este momento e tentar o noso partido pouco capitalización, así que comparar-1, ./compare-1, e escriba nai en minúsculas ambas veces. Agora é o mesmo. E se eu facelo de novo con minúsculas e entón quizais maiúsculas. Agora é realmente distingue entre maiúsculas e minúsculas. Entón, non tan difícil ou máxico, pero agora explicar o que está a suceder debaixo do capó. Entón, o que máis podemos extraer dende este tipo de lección? Entón, imos dar un ollo niso. Eu estou indo a ir adiante e escribir programa rápido aquí chamado copy-0. E agora imos ir adiante e, de feito, imos facer isto-- con copia-0, Bótalle un ollo ao que eu teño aquí. I primeiro informar ao usuario, diga algo. Entón eu recibín unha cadea e eu almacenado s. Entón eu comprobar que s é igual a é igual a NULL, pode voltar 1. Polo tanto, esta é só a comprobación de erros estándar. Nada interesante aconteceu. E, de feito, se nos livrarmos do erro a comprobación, esta parece ser unha semana de código no momento. Pero eu comecei a estar un pouco mellor sobre iso. Agora, na liña 16, unha semana, quizais día ata unha parella ou minutos, pódese dicir liña 16 é a creación dunha variable chamada t e copia é para el. E iso é un perfectamente takeaway razoable. Pero ser máis preciso momento. O que está a suceder na liña 16? O que está a ser copiado da dereita á esquerda? Si? Audiencia: É t obter un enderezo de s? DAVID J. Malan: Exactamente, t está a recibir o seu enderezo de s. Así, para ser claro agora, se eu for de volta a ese exemplo anterior e eu sacar a cousa que eu escriba. E o que eu escriba em-- aquí está s, e aquí é o que eu escriba en algún lugar memoria, nai e, a continuación, unha barra invertida 0 que se engade para min. O que eu almacenados aquí, recordo, este está na posición 1, 2, 3, 4, iso é o que está actualmente en s. Polo tanto, na liña 16, digo me dea outra variable chamada t e tenda en polo valor de s, que fica almacenado aquí non vai mom senón só o número 1. Polo tanto, se miramos cara ao futuro neste programa agora, o que vai pasar? Entón, teña en conta que non hai esta función pode utilizaron este un tempo para César, ou Vigenère, ou que non en todos. Eu reclamo co meu printf, eu son vai capitalizar a copia t. Primeiro na liña 19, sanidade rápida verificación, comprobacións strlen a lonxitude de t. Porque eu non quero tentar capitalizar algo se non hai ningunha secuencia de alí. O usuario simplemente premer Intro, non hai nada para capitalizar. Entón eu non quero facer liña 21. Entón liña 21 está capitalizando que carta ao parecer en t? Audiencia: m? DAVID J. Malan: Mira como se fose copiar cal? Audiencia: m. DAVID J. Malan: Uh, m. OK, entón o primeiro m, porque aviso que estou pasando para toupper, que se nunca viu é só unha función para capitalizar como a súa entrada. t significa dar soporte de cero mo cero de t. E así como fai este cambio de imaxe, para ser claro? O que ten que ser reescrito ou alterado en relación a s e t e nai de cero barra invertida. Audiencia: [inaudível] DAVID J. Malan: Si, polo que este un aquí simplemente precisa mudar a-- corrixir isto-- Debe ser cambiado un capital m. Pero agora, mire a finais do programa, se eu imprimir s e t como eu limpar aquí, ver o que é ocorrerá imprimir e s t. Entón, faga copy-0, ./copy-0. Deixe-me ir adiante e escriba na nai en todas as minúsculas. Teña en conta o orixinal e a copia ser capitalizados. Por que? Ben, s e t son ambos a apuntar cara, se, o mesmo anaco de memoria. E, francamente, iso está quedando uninteresting-- realmente o feito que estamos a usar o enderezo de cero aquí. É dicir, eu realmente non me importa onde o material está na memoria. Sentímolo eu estou apagando un pouco máis. Pero eu realmente non me importa onde as cousas están na memoria. E así, de feito o que programadores tenden a pensar é que cando fala de un enderezo ou un punteiro, quen lle importa onde está na memoria. Eu non me importa se é en byte un ou mil millóns. Só me importa que esta variable é eficaz apuntando a que pedazo de memoria. E así, a partir de agora, máis que tergiversar sobre enderezos de memoria arbitrarias, imos pode comezar a deseñar punteiros como punteiros, como frechas. Entón, o que s e t realmente son, segundo este programa, por mor de como eu criei t, é só dúas variables separadas apuntando para o mesmo anaco de memoria. E non nos importa onde eles están. Así, podemos abstraerse ese detalle. Entón, como fago para solucionar isto? Se eu queira escribir unha versión da copia programa que realmente copia a secuencia de caracteres e capitalizar só o copia, só de forma intuitiva, o que ten que ser un Ingrediente para a nosa solución? Audiencia: [inaudível] DAVID J. Malan: Necesitamos unha cousa? Audiencia: Peza de memoria. DAVID J. Malan: Necesitamos outro anaco de memoria, non? Non sabemos como facelo aínda, necesariamente. Pero eu medio que ten que isto ocorre de xeito que a nai orixinal no caso de menor acaba nese anaco extra de memoria. E entón cando cambiar a copia, eu Non quero cambiar esa copia aquí. I en vez quere cambiar só este copia do orixinal, de xeito que permanece inalterada. Entón, imos ver como podemos facelo. En copy-1, que xa ten foi desposuído de comentario, pero é comentado en liña. Nós en vez facer a estes following-- liñas son idénticos, me unha corda e chamalo s. Pero agora imos ollar para un dos nosos máis complexo pero o último de complexidade por algún tempo, liña 16 fai exactamente iso. Polo tanto, se o seu cómodo co imaxe que drew-- déame un novo anaco de memoria, copiar todo para el, imos ver como podemos traducir isto para código. Así a liña 16, na parte esquerda, char * t dáme esa caixa por aquí. Isto é todo o que fai. No lado dereito, m alloc, ou malloc, é a distribución de memoria, super extravagante, un xeito enigmática de só dicir déame unha peza de memoria. Canta memoria necesitamos? Ben, é unha especie de gran expresión. Pero imos ver o que di aquí. Entón, iso, por suposto, é dar- me a lonxitude da corda de s. Entón, a nai debe ser o que? Entón, só tres, non? nai é de tres caracteres. Non contar co barra invertida cero cando falar a lonxitude dunha cadea é de feito, as letras visíbeis humanos. Entón nai, entón iso me dá 3. Pero agarde un minuto, eu agora estou engadindo 1. Por que realmente quero reservar 4 bytes e non só 3? Si? Audiencia: Para o valor de sentinela? DAVID J. Malan: Exactamente, para ese valor de sentinela. Á barra invertida cero, Necesito total de 4 bytes. Entón, eu teño da lonxitude da corda máis unha. E, a continuación, só para unha boa measure-- malia neste sistema, está sempre será 1-- digo multiplicar este por o tamaño dun carbón animal. Acontece que é sizeof un operador en C que só dille o número de bytes que é requirido para un determinado tipo de datos. Non funciona para matrices, normalmente, ás veces fai. Pero, no caso xeral, sen. Pero me vai dicir cantos bytes un char é, o que acaba sempre 1. Entón, iso é como multiplicar por 1. Liña de ollar tan super enigmático de código. Pero todo o que fai é dá me unha peza de memoria. Pero iso parece estar copiando algo no que a memoria? Aínda non. E entón o que fago na liña 22, e 23, 24, 25, así, eu simplemente facelo. E este é o tipo de material escolar vello agora. Isto é debido a PSet 2, onde está só movendo as cousas en torno á memoria, ou mellor, en cadeas. Entón, eu estou repetindo de 0 a a lonxitude da cadea s. E eu estou copiando o personaxe i-th n para o personaxe i-th en t. E porque, o programador, feita Asegúrese de reservar exactamente como moitos bytes como eu teño, é perfecto un a un. E eu copiar nai en minúsculas ao novo título. E entón, finalmente, fago esa liña. E así o efecto só é para capitalizar esta t aquí. Entón, unha morea de absorber, pero se considerar só o que realmente está a suceder por baixo do capuz é só movendo estes bytes arredor, todo o que é necesaria para resolver este problema é só para dar este anaco de memoria. Agora, co risco de esmagadora, deixe-me amosar outro exemplo que é case idénticas, excepto para esta liña de código. Polo tanto, esta é a versión de hackers deste programa, se quere. Pero imos só destilar Lo en o que está pasando. A liña 24 é usado para ser este t soporte i recibe soporte s i. Agora, eu estou cambiando isto para a estrela máis enigmática t máis 1 é igual a estrela máis 1 s. Entón o que está a suceder e por que temos un personaxe estrela? Vimos a estrela antes, e está a ser usado de forma diferente aquí. Xa vimos char *, agora estou vendo Unha estrela no inicio, e iso é OK. Pois parece que pode tipo de inferir só daqueles primeiro principios que está a suceder. Entón, só para quedar claro, o que é s? A semana pasada, foi unha cadea. Iso non é suficiente anymore. ¿Que é s, especialmente? Audiencia: [inaudível] DAVID J. Malan: É un punteiro. É o tipo de escola primeiro carácter ingresaran en nós. OK, o que é t? Audiencia: [inaudível] David J. Malan: A enderezo do primeiro byte en t, que pedazo de memoria realocada. Así, verifícase que, cando iteración de 0 diante ata a cadea length-- ante todo, i Comeza a 0, porque desta antiga escola para cousa loop. Entón, só para simplificar, imos supoñer que a primeira liña de código é realmente só iso, non. Se I é cero, cero, engadindo a algo presuntamente non vai ter un efecto. Entón, cal é a palabra? Acontece que a estrela operador neste contexto é o dereference operador, que é só un xeito elegante de dicir ir ao seguinte enderezo. Polo tanto, se s é a dirección do primeiro personaxe neste anaco de memoria, * S medios ir máis alá. E porque temos deseñada a imaxe deste xeito, pode adoptar o seguindo o modelo mental. Se esta é a s, e di * s * s, tipo de como ramplas e escaleiras, se se lembra do xogo desde a infancia, é como seguir este frecha e vai para o enderezo. * T é o mesmo. Entón comeza aquí, vai para o seu anaco. Non podo simplemente deseñar sobre Nesta pantalla desta forma. * T significa que ir aquí. E, a continuación, o loop for só dicindo mover ese personaxe aquí, mover ese personaxe aquí, mover ese personaxe aquí. Pero como podo facer iso incrementação? Necesito desfacer o que eu acaba de eliminar. Isto é o que normalmente se chama aritmética de punteiro, que significa matemáticas con enderezos. Se, neste loop for, Eu sigo incremento i, e s é un enderezo de correo t é un enderezo, se eu simplemente seguir engadindo 1, isto significa só seguir adiante, e para adiante, e para adiante na memoria. É como Oxford Street, o rúa que o edificio está no CS. Os edificios do CS é de 33 Oxford Street. Entón, se fose facer 33 Oxford Street máis 1, que o leva ata 34 Oxford Street, a continuación, 35 Oxford Street, logo 36 Oxford Street, calquera que edificios realmente son - se os houbese. E así, iso é todo o que estamos facendo aquí coa aritmética de punteiro. Polo tanto, é un xeito super arcano de expresarnos. Pero todo o que está pasando debaixo da capa só está seguindo estes enderezos, como seguir un mapa, se quixeren, ou a raíz frechas como temos deseñado na pantalla. OK, unha morea de dixerir. Calquera pregunta sobre a sintaxe, conceptos, punteiros, malloc, ou semellantes. Si, aquí en primeiro lugar. Audiencia: Entón onde iso di * t é igual a toupper * t, é o que vai capitalizar todas as letras ou apenas-- DAVID J. Malan: Ah, pregunta moi boa. Entón nesa liña aquí, 31, é que isto vai capitalizar a primeira letra ou de todas as cartas. Entón, imos responder a iso, vai de volta aos primeiros principios. E primeiros principios aquí quero dicir só tes que ir para as definicións básicas que toma parte. Entón toupper é unha función que capitalizar un char. Iso é todo. * T significa ir ao first-- ir ao enderezo en t. Así, na foto, se este é o anaco de memoria que alocados con malloc, e este é t, * t significa ir aquí. Mentres tanto, está pasando ese valor, minúsculas m para toupper, está a recibir de volta M maiúscula, onde poñelas? Está poñendo-o no mesmo lugar. E así por que a lóxica dos definicións básicas é só capitalizando a primeira letra a non ser que interactuar con i ou un loop ou un loop while, non vai para facer algo máis que preguntar iso. Boa pregunta. Si? Audiencia: Por que use o dereference método, no canto de matriz? DAVID J. Malan: Ah, boa pregunta. Por que usaría o dereference método, no canto do método de array? Ningunha razón en particular, para ser honesto. E, de feito, para este tipo de exemplo, dereito, Estou só discutindo facendo o programa máis complicado, Máis ollos están vidrosos, a xente a visitar a porque este parece super arcano, pero mesmo que está facendo o mesmo. E así, a verdade, esta é unha solución innecesariamente complexo visualmente ao problema. É aínda bo deseño, cinco de cinco para o proxecto, se é na franxa notación ou a notación de punteiro. Mas-- especialmente cando chegamos máis tarde no curso en PSet 5 cando Implementar este dicionario que Eu mencionar un par de vezes-- imos realmente se preocupan o enderezos de memoria de baixo nivel que realmente entendemos Qué está a pasar. Pero, por agora, parece que este liña de código corchetes aquí cadrados non hai realmente. Son o que se chama azucre sintático, que é só un xeito estrañamente legal de dicir a compilador convértese corchetes ser que a expresión matemática. Polo tanto, é unha convención humana para poder escribir só estes soportes moi doado de usar. Pero o que o compilador, clang, está realmente facendo calquera momento escribe o que está en destaque na liña 24, debaixo da capa é realmente convertelo lo a este. É só máis prazeroso como un ser humano a ler e escribir código como liña 24. Pero, finalmente, os Rodas pequenas veñen off cando o propio confort está máis forte. Todo ben, entón recordar, a continuación, que este Era o tipo de maior problema Deparamo-nos. E iso é o que desencadeou todo este conversa maldita sobre punteiros, e enderezos, e copiando cousas. Foi porque tropezou este problema parvo, parvo, polo cal Eu apliquei logically-- con Lauren aquí na demo eo zume de laranxa no milk-- un perfectamente algorithmically función correcta para cambiar dúas variables ' valores, pero a maldita cousa non teñen ningunha persistente, ou permanente, efecto sobre o meu código. E por que isto? En poucas palabras, por que é isto implantación de cambio loxicamente correcta, pero non ten impacto sobre as variables que son pasados ​​para el, como x e y a principal? Cal era a esencia da cuestión? Si? Audiencia: Por variable feito copias da variable no pase a través da función. DAVID J. Malan: Exactamente, cando pasa variables nunha función, ou argumentos nunha función, son pasou por copia, que significa que comeza un idéntico á procura patrón de bits para cada X e Y, chamado aquí ae b. E pode facer calquera cousa quere con estas copias, pero eles van ter ningún efecto sobre a función de chamada. E, de feito, que extraemos imaxe na pantalla, Lembre última vez, en que se realmente pensar sobre o que é pasando baixo o hood-- se esta é a memoria do seu ordenador, e aquí é o anaco de memoria que está a ser usada para o principal, este é o anaco de memoria que está a ser utilizada para intercambio, e así mesmo se principal ten dúas variables, X e Y, de intercambio pode idéntica á procura valores, ambos os cales son 1 e 2, pero son totalmente diferentes anacos de memoria. Entón, necesitamos unha solución para iso. E, francamente, parece que temos agora ten unha solución a este problema, non. Agora temos a capacidade de manipular as cousas por medio de enderezos e, unha especie de ramplas e escaleiras estilo, siga estas frechas e ir a calquera lugar que queremos na memoria, non poderiamos nós solucionar este problema pasando de principal de intercambiar non os valores que queremos intercambio, pero só de forma intuitiva o que poderiamos pasar cambiar no seu canto? [Interpoñendo voces] DAVID J. Malan: Por que non só pasalo os enderezos, non? Por que non imos dar un cambio mapa do tesouro, se quixeren, que leva-o para o reais valores x e y. Imos intercambio, realmente cambiar eses bits orixinais, no canto de só de paso copias dos bits. E así, de feito, que é o que se vai ser a solución. Esta versión é aquí claramente malo e fallo. E agora, a primeira vista, só mira como nós engadimos unha morea de estrelas aleatoriamente e cruzou os dedos que ía compilar. Pero sería agora compilar. Pero imos ver o que significan estas cousas. E, por desgraza, os autores de C podería escoller outro símbolo para facer deste un pouco máis clara, pero o operador estrela ten un significado diferente en dous contextos diferentes. E vimos que logo, pero imos distinguir. Así, na parte superior alí, cando eu mudei a eb de ser int de na malo versión para int estrelas, a e b, Anteriormente, foron enteiros. Que son a e b agora en o bo, versión verde? Son enderezos. Enderezos de que, para ser claro? Enderezos de enteiros. Así, o feito de que eu son dicindo medios int estrela este é o enderezo de un enteiro, especificamente. Entón agora notar nas liñas de código, outra cousa tamén cambiou. tmp segue sendo o mesmo, porque é só o número enteiro temporal, ningunha máxica memoria alí. Pero unha empresa precisa dunha estrela. E, de feito, as outra mención de a e b, entender que todo o que é cambiar de vermello a verde é que eu estou prefixing as variables con estrelas. Porque eu non quero copiar ae b. Porque se eu só copiar a eb e intercambio a e b, o que realmente cambiar? Só enderezos, quero cambiar o que está en estes enderezos. Quero ir máis alá. E así o operador estrela dentro da miña función, non dentro da lista de parámetros, significa que ir para estes enderezos e realmente cambiar estes valores. Entón, o que fai a imaxe agora ollar como no seu lugar. Ben, en vez diso estou pasando por A e B non 1 e 2-- En realidade, eu teño engadir outra definición aquí. Entón supoño que este anaco de memoria está na posición 10. Esta é a situación 11, pero este é un pouco de unha simplificación, Agora teño dúas opcións pasar x e y é pasar seus enderezos? Se eu pasar os seus enderezos como este, eu só Agora necesitamos aplicar de intercambio por o código verde de xeito que, cando se ve un e cando b ve, non só copiar a eb e mover o leite e zume de laranxa. O zume de laranxa e leite metáfora agora rompe, porque estes son vasos de mapas de líquido e non. Nós en vez que ir para tratar 10 e nós que ir para xestionar 11, e a continuación, realizar esa lóxica cambio. Así, a lóxica é a mesma, pero necesitamos un xeito lixeiramente diferente de acceder a estas variables. E así, ao final, o que o programa ten que mirar como é iso. En swap.c literalmente copiados e pegado a versión verde. Pero eu teño que facer un cambio. Non é suficiente só para cambiar intercambio. Que outra liña de código necesito cambiar? Si? Audiencia: Onde leva os argumentos. DAVID J. Malan: Onde que leva o seu argumento. Entón, se eu rolar ata a Main, I Non pode simplemente pasar x e y, e, eu prometer, o último peza de nova sintaxe hoxe. Necesito pasar non xe y, pero a dirección de X e Y. E ao parecer, o símbolo que os autores do C escolleu é se usa un e comercial aquí, non para ser confundido co bit a bit e comercial, se usa un e comercial aquí e un e comercial aquí, esta figura para fóra para vostede, cal é a dirección de x, quizais é 10, cal é o enderezo de y, é posible que 11, e pasa os no seu lugar. Así, unha gran cantidade de absorber toda dunha vez. Pero imos ver agora rapidamente nosas restantes catro minutos onde as cousas poden dar mal. E como un aparte, en realidade, Eu tomei esta imaxe, TF tomei esta imaxe dun ou dous anos. Entón que é o canto de atrás de Eliot Comedor. Os punteiros son quizais o máis difícil tema que nós Cubrimos en CS50. Entón, se se preocupa o tipo de inclinación é como é posible que máis dun stick de hockey así, entender nós estamos achegando de un pico en termos de complexidade conceptual. E eu traio este foto, porque eu xuro a deus, no outono de 1996, cando eu asumir CS50 co meu compañeiro de ensino, Nishat Mehta, el me sentou-se na canto do Eliot D. Hall durante o xantar, ou cea, ou algo para tratar para me axudar a entender punteiros. E este é o lugar onde eu estaba semanas despois que foi introducida en charla cando Finalmente entender punteiros. E eu estou esperanzas de que esta vai facer clic moito máis cedo para ti. Pero entender iso absolutamente entre os temas máis sofisticados nós miramos. Pero é entre os máis poderosos. E cando obtelo, é realmente todo só vai finalmente chegar xuntos. Así, a certeza de que non fai necesitamos todos pía hoxe. Entón aquí está o último programa imos ollar. E imos rematar con unha rápidas tres minutos de claymation feita polo noso amigo, Nick parlante. Aquí está o programa, que en os dous primeiros liñas declara unha variable x e y. Ambos os cales son enderezos de enteiros, punteiros aka. Nós, entón, reservar o suficiente memoria para almacenar un int e almacenar a dirección en que a memoria de x. Entón, é aínda máis sinxela que o exemplo anterior. Déame catro bytes de memoria, que é o tamaño dun int, e poñer este enderezo en x. Esta liña aquí significa ir ao enderezo en x e poñer o significado vida, o número 42 alí. Pero esta liña me preocupa. Protagonizar y significa ir ao enderezo en y, e poñer o número 13 desdichados alí. Por que é perigoso, neste punto nas story-- aínda que rapidamente dixo nas nosas minutos minguantes aqui-- por que é malo para min dicir, ir ao enderezo en y? Audiencia: non Ten [inaudível]. DAVID J. Malan: Non teño poñer calquera cousa en y. Entón, cal é o valor de y, neste punto da historia? Non temos idea. É un valor de lixo e non sei Binky. Se poderíamos rematar con esta nota. [REPRODUCIÓN DE VIDEO] Ei, Binky, acorde. É hora para o desfrute punteiro. -Que é iso? Máis información sobre punteiros? Oh, Goody. Ben, para comezar, eu creo que estamos Vai ter un par de agullas. -OK. Este código aloca dous punteiros que pode ligar a números enteiros. -OK, Ben vexo o dous punteiros, pero non parecen estar apuntando para calquera cousa. -É Correcto. Inicialmente punteiros non ligan con nada. As cousas que ligan con son chamado pointees e configuralo los é un paso separado. Ah, non, non. Eu sabía. Os pointees son separados. Entón, como reservar un pointee? -Ok, Ben este aloca código unha nova pointee enteiro, e iso define Parte X para apuntar para el. Ei, que parece mellor. Así facelo facer algo. -OK, Eu vou cancelar o punteiro x para almacenar o número 42 na súa pointee. Para este truco, vou ter a miña vara máxica de dereferencing. -O Seu Varinha máxica de dereferencing? Uh, iso, iso é gran. -Este É o que o código parece. Eu só vou facer que o número correo [POP SOUND] Ei, mira alí vai. Entón, facendo unha dereference en x segue a frecha para acceder ao pointee. Neste caso, para almacenar 42 en alí. Hey, proba usalo para almacenar o número 13 a través do outro punteiro, y. -OK. Eu só vou pasar por riba aquí para y, e obter o número 13 set up. E, a continuación, tomar a vara de dereferencing e apenas-- [Buzzer SOUND] Oh, hey que non funcionou. Diga, uh, Binky, non creo dereferencing y é unha boa idea, porque a configuración o pointee é un paso separado. E non creo que nunca fixen iso. Hmm, bo punto. -Si, Alocamos o punteiro, y, pero nunca define-lo para ligar a un pointee. Hmm, moi observador. Ei, está a buscar boa alí, Binky. Pode resolve-lo así que os puntos y ao mesmo pointee como x. -Claro, Eu uso a miña vara máxica de asignación de punteiro. -É Que será un problema, como antes? Non, este non toca nas pointees. Só cambia un punteiro para apuntar para o mesmo coisa-- [Estalo] -Como outro. Ah, eu vexo. Agora y apunta para o mesmo lugar que x. Entón, agarde, agora y é fixo. Ten un pointee. Entón podes probar a vara de dereferencing novo para enviar a 13 over. Ah, OK, aquí vai. Ei, mira isto. Agora dereferencing obras sobre y. E por que os punteiros están compartindo que un pointee, os dous ven a 13. -Si, Compartir, uh, calquera que sexa. Entón, imos cambiar de lugar agora? -Ah, Mira que estamos fóra do tempo. -But-- -Só Lembrar as tres regras de punteiro. Número 1, a estrutura básica é que ten un punteiro, e apunta ata un pointee. Pero o punteiro e pointee son separados. E o erro común é a creación dun punteiro pero para esqueza darlle un pointee. Número 2, dereferencing punteiro comeza o punteiro e segue a súa frecha sobre para ter acceso ao seu pointee. Como todos sabemos, iso só funciona se hai é un pointee, que tipo de recibe de volta a regra número 1. Número 3, punteiro asignación leva un punteiro e cambia-lo para apuntar para o pointee mesmo como outro punteiro. Así, tras a concesión, os dous punteiros ha apuntar ao mesmo pointee, Ás veces iso é chamado de reparto. E iso é todo o que existe para ela, realmente. Bye-bye agora. [FIN DE REPRODUCIÓN] DAVID J. Malan: Isto é todo para CS50. Grazas ao Profesor Nick parlante. Imos velo a próxima semana. [MÚSICA Electrónica DE XOGO]