DAVID J. MALAN: Este es CS50 y este es el comienzo de la semana cuatro. Y, muchacho, es Volkswagen en problemas todo por culpa de software. Echemos un vistazo. [REPRODUCCIÓN DE VÍDEO] -Cars, Los personajes más inteligentes en las películas de Rápido y Furioso. Esta semana fabricante de automóviles alemán Volkswagen encontró en medio de un escándalo de proporciones potencialmente criminales. -Volkswagen Se prepara para miles de millones en multas, posibles cargos criminales para sus ejecutivos, como la compañía se disculpa para la manipulación de los 11 millones de coches al ayudarla a vencer las pruebas de emisiones. Modelos diesel -Ciertos eran diseñado con un sofisticado software que la información usada incluyendo el posición de la dirección y el vehículo acelerar para determinar el coche era someterse a las pruebas de emisiones. Bajo esa circunstancia, el motor reduciría las emisiones tóxicas. Pero el coche fue manipulada a puente que cuando se estaba siendo conducido. Las emisiones aumentaron de 10 a 40 veces por encima de los niveles de EPA aceptables. [FIN DE REPRODUCCIÓN] DAVID J. MALAN: Así que vamos a mira esto y ver exactamente cómo esto podría ser implementado y cómo esto podría afectar tantos coches como este. Así que en mi mano aquí son la prensa lanzamiento que fue emitida por la EPA-- el Medio Ambiente Agencia de Protección cual es la agencia reguladora estadounidense que maneja las preocupaciones ambientales, y luego el real aviso legal que era enviar a Volkswagen hace apenas unos días. Así que la EPA escribe, y revela ahora públicamente, un software sofisticado algoritmo en cierta Vehículos Volkswagen detecta cuando el coche está en pruebas de emisiones oficiales y convierte las emisiones completos controla solamente durante la prueba. La eficacia de estos vehículos contaminación dispositivos de control de emisiones es enormemente reducido durante toda la conducción normal situaciones. Esto se traduce en coches que cumplen con la estándares en el laboratorio o pruebas estación, pero durante el funcionamiento normal emitir oxides-- nitrógeno o NOx-- de hasta 40 veces la norma. El software producido por Volkswagen es un dispositivo de fin de la cita cita, derrota, tal como se define por el Clean Ley de Aire en los EE.UU.. Ellos van a decir que la EPA y otra agencia descubierto el dispositivo manipulador software después de un análisis independiente por investigadores de West Universidad de Virginia. NOx contribuye a la contaminación el dióxido de nitrógeno, ozono troposférico, y las partículas finas. La exposición a estos contaminantes se ha relacionado con una amplia gama de efectos graves de salud, incluyendo aumento del asma ataques y otros respiratoria enfermedades que pueden ser lo suficientemente graves enviar a la gente al hospital. La exposición a ozono y materia en partículas tiene también ha asociado con prematura muerte por respiratoria relacionada o cardiovascular efectos relacionados. Los niños, los ancianos, las personas con enfermedad respiratoria preexistente están particularmente en riesgo de efectos en la salud de estos contaminantes. Baste decir, es muy grave. Y vamos a leer sólo un extracto más y luego vamos a echar un vistazo a las implicaciones subyacentes de esto en el contexto de un coche. En concreto, Volkswagen fabricado e instalado software en la llamada control electrónico module-- o ECM-- de estos vehículos que detectados cuando el vehículo se está probando para el cumplimiento de las normas de emisión de la EPA. Sobre la base de diversos insumos, incluido el posición de la rueda de dirección, vehículo velocidad, la duración del motor de operación, y la presión barométrica, estos insumos precisamente seguido de los parámetros del procedimiento de ensayo utilizado para federal las pruebas de emisiones para la certificación de la EPA propósitos. Durante las pruebas de emisiones de la EPA, el software vehículos ECM corrió software que produjo resultados de emisiones compatibles. El resto del tiempo, el software ECM vehículo corrió un camino separado calibración que redujo la eficacia de la sistema global de control de emisiones, específicamente el catalítica selectiva reducción del NOx magra trap-- que ya lo veremos en un momento. Como resultado, las emisiones de NOx aumentado por un factor de 10 a 40 veces por encima de los niveles compatibles con la EPA dependiendo del tipo de ciclo de conducción. Así que lo que esto realmente significa, y la código fuente para el software de funcionamiento en el Volkswagen de que no tiene sin embargo, dado a conocer públicamente, es que, efectivamente, este equivalente es en algún lugar en el interior del código de Volkswagen. Si usted está siendo probado, y si el coche detecta ciertos factores ambientales al igual que el volante posición o el movimiento o falta de ella del coche o cualquier número de otros factores que son la hipótesis actualmente a ser parte de esta fórmula, simplemente se encienden controlar las emisiones completas. En otras palabras, empiezan emitiendo menos de los contaminantes. De lo contrario, en todos los demás situación cuando no se detecta como en el laboratorio, simplemente no lo hacen. Y así se puede simplificar esto en más pseudocódigo de hormigón con algo Me gusta esto. Si las ruedas están dando vuelta pero el volante no es, sugerente que el coche está en algún tipo de cilindro giratorio pero en algún tipo de almacén está probando, a continuación, se comportan como el EPA le gustaría que usted. De lo contrario no. Así que vamos a echar un vistazo en un corto vídeo que echa un vistazo a lo que las implicaciones son de este hecho mecánicamente. [REPRODUCCIÓN DE VÍDEO] -Última Viernes la EPA anunció que algunos Autos Volkswagen Audi hicieron entre 2009 y este año estaban usando un dispositivo llamado derrota moverse por las leyes de emisiones diseñada para mantener el aire limpio. Pero, ¿qué significa eso exactamente? Bueno, los coches modernos tienen docenas de los ordenadores dentro de ellos. Y algunos de esos equipos ayudar a coordinar las funciones del motor para una óptima el rendimiento mientras se asegura que no hay demasiada basura que sale del tubo de escape. Ellos realmente han estado trabajando de esta manera desde hace varias décadas. Básicamente, cada parte del motor de un coche moderno tiene un sensor o controlador en ella, y estas computadoras están leyendo en los datos de miles de veces por segundo para preparar ajustes al igual que la proporción de combustible al aire eso va en los cilindros. Estos Volkswagen engaño y modelos de Audi son los motores diesel, y los diesel tienen una más realmente importante equipo parámetros controlados, que es la cantidad de combustible no quemado ir en el escape. Ahora que suena mal. No suena como usted quiere combustible no quemado de entrar en el tubo de escape. Pero en el caso de una diesel, usted tiene algo llamado una trampa de NOx que es un dispositivo que absorbe y trampas para los óxidos de nitrógeno que son contaminantes que haría de lo contrario ir a la atmósfera. Y el efecto de esa trampa de NOx se ve reforzada con el combustible sin quemar. Así que un dispositivo manipulador es un programa especial dentro de estos equipos que pueden hacer que sea verá como el coche cumple con las emisiones normas incluso cuando no lo hace. Volkswagen tenía un problema en sus manos. Sus motores diesel eran conocidos para conseguir un gran ahorro de combustible, pero la trampa de NOx sólo funciona bien cuando se está utilizando más combustible. Así que el coche sería detectar, el uso de este dispositivo de la derrota, cuando se estaba haciendo una de las emisiones prueba, sería utilizar más combustible, hacer bien el trabajo trampa de NOx, emisiones estarían bien. Pero entonces usted consigue en el camino, el dispositivo se apaga, usted está quemando menos combustible pero usted está poniendo tanto como 40 veces más contaminantes a la atmósfera. Pero, ¿cómo lo hizo diablos el coche sabe que era se está probando para el cumplimiento de las emisiones? La EPA dice que fue un sofisticado sistema que comprueba cosas como la posición del volante, la velocidad, el tiempo que el motor estaba encendido, e incluso la presión atmosférica. En otras palabras, hubo ninguna manera esto fue accidental porque el software fue diseñado con mucho cuidado para detectar una prueba oficial de emisiones. Eso es algo de muy serio engaño y eso es ¿por Volkswagen está en tales serios problemas. De hecho, su consejero delegado, Martin Winterkorn, simplemente renunció. Entonces, ¿qué pasa después? Bueno, si eres uno de los millones de media Jetta diesel, Beatles, Golfs, Passat, o Audi A3S efectúa, La buena noticia es es de que su coche está todavía seguro para conducir. Usted no tiene que dejarlo a un lado hasta que Volkswagen emite un retiro. Pero en algún momento son probablemente va a tener para actualizar el software dentro de su coche. Cuando eso sucede usted puede ser tener menos millas por tanque. Los abogados ya están preparando para demandas colectivas lo que los propietarios podrían quedar compensado en algún momento en el futuro. Pero eso no va a suceder en el corto plazo. [FIN DE REPRODUCCIÓN] DAVID J. MALAN: Así que esto plantea en realidad una interesante cuestión de imagen más grande en cuanto a la confianza. ¿Correcto? Todos nosotros tienen iPhones o Androids o algo en nuestros bolsillos más probable estos días, o portátiles en nuestros largos que son software que se ejecuta hecho por Apple y Microsoft y racimos de otras empresas. Pero, ¿cómo sabemos que lo que estos productos de software están haciendo es en realidad lo que estos compañías dicen que están haciendo? Por ejemplo, ¿quién puede decir que cada vez que hacer una llamada en su iPhone o teléfono Android o similares, que ese número de teléfono tampoco es siendo subido al servidor de alguna empresa debido a algún programa que tienes escrito, si se trata de la operación sistema en sí como iOS o Android, o porque usted ha descargado alguna aplicación de terceros que de alguna manera es escuchar a todo lo que estás escribiendo en o todo lo que en realidad estás diciendo. ¿Cómo sabes que, cuando se ustedes están ejecutando Clang O Hacer compilar su software propio en CS50, cómo ¿te el propio personal de que CS50, por medio de la biblioteca CS50, No ha sido la tala cada cadena que jamás ha llegado o cada pulgada que has conseguido? Bueno, ciertamente se podría mirar en el código fuente de algo como la biblioteca CS50, que podría mirar el código fuente para el sistema operativo Linux que se ejecuta en IDE CS50. Pero una presentación increíble se le dio en 1984 en la recepción del Premio Turing por un informático muy famoso conocido como-- llamado Ken Thompson, quien recibió el Premio Turing, que es una especie de ciencia de equipo Premio Nobel, si se quiere, por su trabajo en un sistema operativo llamado Unix, que es muy similar en espíritu para lo que utilizamos, que es Linux. Y la pregunta que le hizo en su discurso de aceptación, en esencia por el que se fija el marco para años y años de discusión acerca de la confianza y la seguridad, era esto. ¿Hasta qué punto si uno la confianza de un declaración que un program-- una pieza de software-- está libre de los caballos de Troya? Tal vez sea más importante confiar la gente que escribió el software. Y, de hecho, nos hemos vinculado a la charla que él dio al aceptar este premio en los años 80 en el sitio web del CS50 en la página de Conferencias para hoy. Porque lo que verás es que en realidad le da bastante simple ejemplo de cómo incluso un compilador como Clang o lo que sea compiladores otros han utilizado en el pasado, ¿y si incrusta en el que el compilador nosotros están utilizando es un poco si condición de que esencialmente dice, si usted nota que el código está utilizando la función GetString o la getInt función, adelante e inserte una puerta trasera o un caballo de Troya de tal manera que ese programa ahora cuenta con algunos ceros y los que lo hacen algo malicioso. Registro de la totalidad de su pulsaciones de teclado, carga de los datos a algún servidor, o realmente cualquier cosa. Y lo que Ken Thompson va a hacer en su charla es demostrar que, incluso si usted tiene acceso a la fuente código de un compilador que maliciosamente podría estar haciendo esto, no importa porque hay este huevo y la gallina realidad del pasado que muchos años mediante el cual los compiladores se utilizan para compilar ellos mismos. En otras palabras, camino de vuelta cuando alguien tenía que haber escrito el primer compilador. Y a partir de entonces, cada vez que he actualizado un compilador cambiando su código fuente, la adición de características y recompilarla para gente como nosotros a utilizar, así, que están usando la vieja versión del compilador para compilar el nuevo versión del compilador. Y si usted echa un vistazo en la charla que ha dado, verás que ya de que la circularidad, en realidad se puede tener errores o Troyanos incorporados en el software estamos utilizando. E incluso si nos fijamos en la código fuente de los programas, ni siquiera podría ser evidente debido a que el engaño es en realidad de alguna versión anterior de un compilador que desde entonces ha sido la inyección de la amenaza en nuestro software. Lo cual es sólo para decir, que realmente no puede y no debe confiar en el software que se ejecuta en nuestros ordenadores portátiles o teléfonos o cualquier número de lugares. Y, de hecho, más adelante en este semestre cuando empezamos a hablar de la programación web y en realidad empezar a construir aplicaciones web nosotros mismos, hablaremos de éstos amenazas y otros. Ahora, es posible que se haya preguntado y se dio cuenta que había un diminuto Darth Vader en los clips que The Verge mostraba allí acerca de Volkswagen. Si que nunca has visto, me pensamos que debería aligerar el estado de ánimo, porque esto es todo muy deprimente y alarmante. Voy a mirar hacia atrás en el Super Bowl 2011 cuando un comercial por Volkswagen-- y esto casi los hace agradables nuevo-- salió al aire por primera vez en la televisión. Es el segundo clip 60 que creo que usted disfrutará. [REPRODUCCIÓN DE VÍDEO] [MÚSICA - TEMA DE "STAR WARS"] [Perro ladra] [CAR COMIENZA] [FIN DE REPRODUCCIÓN] DAVID J. MALAN: Sí. Sólo estaba revisando. Ese coche está en la lista de violaciónes. Correcto. Así que nos fijamos en algunos Pseudocódigo hace un momento. Y aquí está una más grande fragmento de código pseudocódigo que hemos visto un par de veces hasta ahora. Y vamos a usar esta es una oportunidad ahora para introducir una nueva programación técnica que hicimos ver algorítmicamente la semana pasada cuando miramos fusión tipo. Pero vamos a formalizarlo y ver cómo podríamos utilizarlo en código real, y luego vamos a utilizar este técnica por el camino más probabilidades de resolver otros problemas. Así que este fue uno de los primeros programas que nunca escribió, aunque de Código pseudocódigo. Y lo que este programa nos permitió hacer curso era encontrar Mike Smith en una guía telefónica. Y cuenta, en particular, las líneas de ocho y 11, que tenía esta declaración en Ir a. Y de hecho, cierta idiomas, C entre ellos, en realidad tienen un declaración que es, literalmente, ir a que le permite saltar a una línea específica. Es generalmente mal visto porque que se puede abusar fácilmente y usted puede empezar a saltar de su programa por todo el lugar en oposición al uso de la clase de la lógica y el flujo de control que hemos utilizado hasta ahora con sólo bucles y condiciones y similares. Pero podemos simplificar este algoritmo en el código de pseudocódigo de la siguiente manera. En lugar de esta iterativo o bucle enfoque donde siempre regresamos y de ida y vuelta a la línea de tres, ¿por qué no sólo tipo de Punt y más en general, dicen en línea de siete y 10, basta con sustituir esos dos pares de líneas con, más si Smith es anterior en el libro que vamos a buscar Mike en el media izquierda del libro. Porque si Smith es más tarde en el libro, buscar Mike en la derecha la mitad del libro. Y ya notar la circularidad. ¿Correcto? Estoy en busca de Mike en la guía telefónica y después Finalmente me pegué tal vez línea de siete o tal vez la línea 10 y mi instrucción para mí es la búsqueda Mike en la mitad de la guía telefónica. Bueno, ¿cómo puedo buscar Mike? Estoy en el medio de la búsqueda de Mike, ¿por qué estás suerte de que me envía en un círculo? Pero eso está bien porque lo que es sucediendo al tamaño del problema, como está escrito en la línea 7 y 10? No sólo estamos diciendo búsqueda para Mike, buscar Mike. Estamos diciendo específicamente qué? Buscar por él en la mitad izquierda de la mitad derecha que es efectivamente la mitad del tamaño del problema. Así que está bien que estamos tipo de participar en esta circularidad, este argumento circular, porque al menos estamos haciendo que el problema más y más pequeña. Y, finalmente, vamos a llegar que el llamado caso base, donde tenemos una sola página izquierda- como nuestro voluntario la semana pasada did-- teníamos una página la izquierda y luego no lo hacemos tiene que seguir buscando Mike Smith porque está bien en esa página o no lo es. Entonces, ¿cómo podemos poner en práctica esta idea, este especie de circularidad en el código real? Bueno, podemos aprovechar una técnica eso es generalmente conocida como recursividad. Y hemos visto esto en el pseudocódigo para el ordenamiento por mezcla la semana pasada. Recordemos que este fue el pseudocódigo para el ordenamiento por mezcla. Podría decirse que es aún más simple que burbuja o la selección o la ordenación por inserción sólo en términos de la simplicidad con el que puede expresarlo. Pero eso es porque estamos especie de circular diciendo: buscar algo mediante la búsqueda de nuevo. Pero estamos buscando, ya sea en la mitad izquierda o la mitad derecha y luego, eventualmente estamos la fusión en este caso. Pero aquí, también, con esas dos líneas de clasificación, nos volvemos a tener presente idea de recursividad. Y concretamente lo que esto significa, en el contexto de un algoritmo, es que un algoritmo es recursivo si se utiliza o se hace llamar. O en términos de C, una función es recursive-- una función llamada foo es recursivo si foo, en algún lugar de su código fuente, llama a la propia función foo. Y eso es malo si todo foo alguna vez lo hace es llamar a sí mismo una y otra vez. Está bien si foo se detiene el tiempo, al igual que ordenamiento por mezcla, al decir, espera un minuto, si este problema es super pequeña, por ejemplo, o lo encontré quien soy buscando, simplemente volver. No de forma recursiva, no lo hagas cíclicamente nuevo llamarme. Y así vamos a echar un vistazo a cómo esto podría funcionar. Así que voy a seguir adelante y abierto dos ejemplos de código fuente aquí. Una de ellas se llama sigma 0. Y esto no es en absoluto recursivo, pero echemos Un vistazo a lo que hace este programa. He despojado toda comentarios de ella, pero todos del código fuente en CS50 de página comentarios si querer leer a través de él de nuevo más tarde. Y vamos a hacer un par de cordura comprueba aquí. Así que en la parte superior de este código, que tenemos son CS50.h. ¿Qué hace esto? ¿Por qué aquí? En términos sencillos razonable. ¿Qué hace? Sí. AUDIENCIA: ¿Así que la función getInt funciona. DAVID J. MALAN: Para que la función getInt funciona. Porque dentro de este archivo, CS50.h, que veremos en poco tiempo en términos de su código fuente, tiene un montón de funciones declared-- getInt, GetString, y un montón de otros- y, a menos en realidad tenemos que Incluyen línea, el compilador no es Clang va a saber que existe. Y mismo ocurre con la línea dos donde se define int printf, que es una función seguimos usando un poco. Ahora, la línea de cuatro parece un poco raro porque es sólo un chiste. Tiene un punto y coma, sin rizado llaves, no hay código dentro de ella. Pero lo que hicimos nosotros llamamos esta cosa de semana pasado? Sí. Así, un prototipo. ¿Y por qué tenemos una prototipo que parece a ser un poco redundante normalmente porque normalmente ver la función de nuevo más adelante en el archivo, ¿verdad? Así que ¿por qué no eres más que tener-- rascándose la cabeza, pero voy a tomar. Sí. AUDIENCIA: [inaudible] la función después de la principal. DAVID J. MALAN: Exactamente. Para que el compilador te conoce finalmente va a definir o implementar después de que la función principal, presumiblemente. Así Clang y la mayoría compiladores son una especie de tonto y que sólo sabrán lo que les digas. Y si desea utilizar una función llamada sigma, usted enseña mejor el compilador que existe de antemano. Ahora, en sí principal, incluso aunque es un montón de líneas, es bastante familiarizado con suerte por ahora. Tiene un do while cuyo propósito en la vida aquí aparentemente es conseguir un entero positivo desde el usuario. Y justo mantenerlo molestando o ella hasta que cooperar. Luego, en la línea 16 que tengo una llamada interesante. IntAnswer. Que en la mano izquierda lado me da un Int que puede almacén-- llamada Answer-- que se va a almacenar, al parecer, el valor de retorno de sigma. Así sigma es sólo una nombre arbitrario pero significativo que yo he dado a una función cuyo propósito en la vida es tomar uno argument-- lo llamaremos N en este caso-- y acaba de tomar la suma de ese número más cada número positivo que es menor que ella. Así que si paso en el número 2 de sigma, quiero añadir 2 más 1 además 0-- no 0-- manera que me da 3. Si paso de 3 a sigma, quiero tiene 3 más 2 más 1, lo que me da 6. Etcetera. Por lo tanto, sólo se suma todo el números menores que o iguales a ella. Ahora, aquí sólo voy para imprimir la respuesta. Así como una comprobación de validez rápida, vamos a hacer sigma 0-- sigma slash dot 0-- y déjame escribo en 2. Y de hecho consigo 3. Permítanme escribo en 3. Yo a la verdad consigo 6. Y si alguien puede hacer los cálculos rápidamente, si hago 50 ¿qué voy llegar? AUDIENCIA: [inaudible]. DAVID J. MALAN: Bueno, no. Pero 1275 que está bastante cerca. Así que esto es el resultado de hacer 50 más 49, más 48, más 47, más 46 hasta el fondo a 1. Así que eso es todo sigma hace. Pero vamos a ver cómo hemos implementado ahora. Así que aquí es la propia función. Y esto no parece tener nada que ver con la recursividad todavía. De hecho, estamos usando un técnica de la vieja escuela. Estoy inicializar una variable llamada suma a cero, entonces tengo una foreloop aquí, y estoy declarando un Int llamada I, haciéndola igual a 1-- aunque podría ponerlo igual a cero, pero desde que estoy haciendo, además, a quién le importa si es cero o uno. Se va a tener ningún efecto. Así que estoy iteración siempre que I es menos de o igual a m, que es el argumento de que fue aprobada en. Y entonces yo sigo incrementando I. Y idea del bucle de todo lo que estoy haciendo es hacer suma más iguales I. Y eso es deliberado. Yo no quiero hacer, en este caso, como suma plus plus. Quiero añadir realidad el valor actual de I que mantiene cada vez más grande y más grande y más grande a la cuenta en ejecución. Y entonces vuelvo suma. Y así respuesta obtiene la suma de valor. Y luego imprimirlo. Así que hay una oportunidad aquí, sin embargo, para simplificar tipo de este código conceptualmente y el tipo de golpe de uno mente en términos de la simplicidad a pesar de que toma un tiempo para ordenar de apreciar por qué este es de gran alcance en estos pequeños ejemplos. Aquí es así que la sigma uno-- segunda versión de este código. Todo hasta la parte superior es idéntica manera la misma historia se aplica como antes. Pero ahora vamos a ver el aplicación de sigma que He reducido a sólo estos lines-- cuatro líneas de código, de verdad, además de algunas llaves y espacios en blanco. Pero, ¿qué estoy haciendo? Si m es menor que o igual a cero, tengo que manejar tipo de ese caso super simple. Y si usted me entregue cero o nada negativa que es simplemente extraño, Yo sólo voy a arbitrariamente pero consistentemente volver a cero. No quiero que esta cosa entrar en algunos infinita raro bucle debido a un valor negativo. Así que estoy diciendo, si me das cero o menos, voy a volver a cero. Pero eso es bueno, porque eso es que sola página de la guía telefónica lo que queda. Estoy mordiendo un problema muy específico y no llamar a algo de forma recursiva. Pero en la línea 31, lo que No me parece que estoy haciendo? Los paréntesis son sólo mantienen cosas, con suerte, un poco más claro. Pero todo lo que estoy haciendo es que soy regresar M-- lo de entregar mí-- más la valor de M-- lo siento, más el valor de sigma de m menos 1. Entonces, ¿qué significa esto? Si me das el número 3 como entrada, la respuesta que quiero conseguir en última instancia, es 6 ya 3 más 2 más 1 6 me da. Pero, ¿cómo lo pienso cómo se está ejecutando el código? La primera vez que yo llamo sigma y paso en el valor 3, eso es como decir que en una pieza de papel, aquí está el valor 3 y me han pasado este como sigma. 3 es, obviamente, no inferior a 0 por lo la condición IF no se aplica. El más lo hace. ¿Entonces que debo hacer? Quiero volver m, que es 3, además de sigma m menos 1. Así que permítanme un seguimiento de esto. Voy a poner esto pedazo de papel hacia abajo. ¿Y qué valor, para ser claro, voy a pasar en sigma en este punto de la historia? ¿Qué número? 2, ¿verdad? 3 menos 1 es 2. Así que sólo necesito un poco trozo de papel aquí. Así que ahora sigma se está llamado de nuevo. Y me he puesto deliberadamente esto abajo porque es algo así como una pausa esa versión de la historia porque ahora estoy centrado en señal de m menos 1. Así que era m 3, m menos 1 es 2. Así que aquí es 2 que he estado pasé. 2 es, obviamente, no menos de 0 para que el caso no se aplica. Else vuelvo m, que es esto cosa, además de sigma de lo que de valor? Así que si sigma de 1-- porque m es en este momento 2 para 2 menos 1 es 1. Así que ahora tengo sólo el valor 1. Estoy pasando simplemente el número 1 a la función sigma-- o yo mismo aquí-- modo 1 no es, obviamente, menor que cero, todavía no se aplica. Retorno Else 1 más sigma de qué? 0. Así que permítanme recuerdo. Voy a volver a eso más adelante. Ahora voy a seguir adelante y jota el número 0, porque eso es mi argumento o parámetro. Estoy pasé el número 0 y, finalmente, este proceso apenas de repetirme anuncio nauseum cesa porque lo Qué hago una vez que veo esto 0? Vuelvo cero. Así que ahora usted tiene que rebobinar la historia. Si ahora voy hacia atrás en el tiempo, ¿Qué fue lo más reciente Hice si estuviera literalmente rebobinar un vídeo? Voy a recoger el más reciente 1 y eso me da 1 más 0 es 1. Si sigo rebobinado de la historia, eso me va a dar 2 plus este valor corriente, que es 1. Así que eso es 3. Y entonces yo voy a seguir rebobinado. La primera vez que puse el número 3-- modo 3 más 3 me da 6. Y ahora, si ha rebobinado el video hasta este punto, esta era la muy primera pregunta que hice. Cuando pasó 3, lo que es de 3 sigma? Es de hecho 6, la suma de todos estos pedazos de papel. Así que si eso toma un poco de tiempo para envolver su mente alrededor, eso está bien. Pero consideran que fue un poco-- que era muy deliberada que Apilé estos números en la parte superior de uno al otro. Es un poco como tener un memory-- un registro en el tiempo, como un depurador en un video, que, efectivamente, puedo retroceder en. Y vamos a volver a esa metáfora en sólo un poco. Pero primero, resulta que hay un montón de geeks y gente divertida, Supongo que, en Google. Ojalá alguien que es muy bueno en la mente de buscar en Google subiendo por un momento y ayúdame busco algo? Clave muy, muy bajo. Alguien que nunca es llegar antes, tal vez. OK. ¿Sí? Vamos. Baja. ¿Cómo te llamas? Sam Sam. DAVID J. MALAN: Sam, vamos hacia abajo. Este es el mismo. Encantada de conocerte. Oye. Vamos otra vez. Así que todo lo que necesito que hagas, si usted podría, Sam, aquí es Google. ¿Se puede buscar el término recursividad? No lo estropees. Y ahora let's-- sí. Aceptar Haga clic en eso. Mejor que haga clic. Ahh, lo consigue. ¿No? OK. Así que vamos a hacer un par de los demás. No tanto relacionada académicamente aquí, pero tienen que jamás buscado en Google para anagrama? SAM: No. DAVID J. MALAN: OK. Búsqueda de anagrama en lugar de recursividad. ¿Qué te parece torcida. ¿Alguna vez has buscado torcida? Ahora, éste es un poco difícil de ver pero espero everything's-- Aceptar. Es sólo tú y yo disfrutando de esto. OK. Así que finalmente, este one's-- que es un poco torcida. Ahora haga un rollo de barril. Maravilloso. Correcto. Muchísimas gracias a Sam. Aqui tienes. Gracias. Entonces, ¿qué está pasando en todo de estos ejemplos tontos? Así que en realidad, debajo de la capucha de Millones de líneas de código de Google al parecer es un poco tonto SI condiciones que son esencialmente comprobar si el usuario tiene escrito en esta frase, hacer algo que probablemente tuvo una cantidad no trivial de tiempo para poner en práctica sólo para ser divertido de esta manera. Pero eso es todo lo que se reduce hasta debajo de la campana. Pero, por supuesto, la recursividad es más de los más geeks ejemplo entre esos trucos especiales. Y seguro que hay otros por ahí así que tal vez ni siquiera hemos descubierto por el momento. Así que eche un vistazo, o considerar Ahora el siguiente programa, y ciertamente asir cualquier de estos en su salida. Voy a seguir adelante y abrir un programa que es va a tratar de intercambiar dos valores. Pero antes de ir allí, vamos a hacer esto. ¿Podríamos conseguir uno más voluntario, que pienso? ¿Te gustaría ser voluntario? ¿No? Vamos arriba. Vamos arriba. Correcto. Así que su nombre es qué? LAUREN: Lauren. DAVID J. MALAN: Lauren. Vamos arriba, Lauren. Así que Lauren está siendo desafiado aquí como sigue. Encantada de conocerte. Así Lauren aquí tiene delante de sus dos tazas vacías. Y tenemos algunos de naranja jugo y leche y vamos a ir adelante y hacer lo siguiente. Sólo vamos a llenar este. Unas onzas de leche por aquí y vamos a llenar un poco de jugo de naranja por aquí. Y delante de todos estos miembros de la audiencia, intercambiar los dos valores de estas tazas. Poner el jugo de naranja en el vaso de leche y la leche en la taza de jugo de naranja. ¿Cómo se hace esto si estuviera en casa y tenía acceso a otros materiales? LAUREN: Ponlo en otra taza. DAVID J. MALAN: OK. Así que vamos a echar un temporal variables, si lo haremos. Y seguir adelante ahora y poner en práctica este mismo procedimiento de intercambio. Tan bueno. Hemos puesto DO en el temporal variables, la leche en la variable DO, y ahora la variable temporal en la variable leche. OK. Así que muy bien hecho hasta ahora. Así que resulta fuera-- sostener que pensado por un momento. Aquí, sólo friki que un poco, este sería el código C correspondiente que simplemente implementamos. Teníamos dos entradas, A y B, ambos que sólo tendremos que decir con sencillez son int de. Y notar aquí, si quiero cambiar los valores de dos variables, a y b, que en verdad necesitamos un intermediario, un variable temporal, una taza temporal, en el que el vertido uno de los valores por lo que tenemos un marcador de posición para él. Pero entonces el código es exactamente como Lauren aquí implementado. Ahora, sólo para obtener una poco más loco, resulta que usted puede hacer esto sin una variable temporal. Para hacer esto correctamente, sin embargo, vamos a tener que hacer trampa con algo de química. Tenemos algunas copas de más aquí. Así que la cosa más cercana que se ve como la leche y el agua perhaps-- o leche y OJ-- es que tenemos alguna agua, por lo que vamos a llenar este uno con unas cuantas onzas de agua clara. Eso es probablemente demasiado. Sí. Eso es definitivamente demasiado. Mantenga en un segundo. Y ahora tenemos petróleo, que, según recuerdo de la clase de química de la escuela secundaria, espero que no se mezcla con agua. Pero que tipo de clase de se parece a la leche y zumo de naranja. Así que ahora, sin utilizar una variable temporal, puedes intercambiar esos dos valores? Así aceites entra en la taza de agua, el agua entra en la taza de aceite. LAUREN: No hay otras copas? DAVID J. MALAN: No hay otras copas. Y yo no he hecho probado esto antes de este año así que no sé si esto va a realmente trabajar químicamente. Eso no tenía que suceder. ¿Está funcionando? Correcto. Así que separar? Bien. Ahora llegamos a obtener la agua en la otra copa. Concentradores de química más inteligentes posible probablemente hacer esto mejor que yo. LAUREN: El agua está en la parte inferior. DAVID J. MALAN: El agua-- que era lo que es clave la última vez que hicimos esto. Tienes que hacerlo en el orden correcto. Sí. Eso está bien. Así que ahora tenemos dos tazas de aceite. OK. Eso está bien. Pero químicamente si esto funcionó de yo-- LAUREN: Esta es el agua. DAVID J. MALAN: Eso es todo agua. Correcto. Pero eso sigue siendo la misma copa que antes. Así vierta it-- intentarlo allí. OK. Este es un buen uso del tiempo de clase hoy. OK. Así que ahora nosotros-- agradable. Algo así. Correcto. Así que es muy bueno. ¡Gracias a Lauren. Muy bien hecho. Así que para hacer estallar sus mentes, y esto es tal vez algo jugar con si te gusta en ID CS50, puede, de hecho, intercambiar dos variables sin utilizar un número entero temporal. Y este es el código C correspondiente. Y si te acuerdas de la última Miércoles, hemos introducido, aunque brevemente, algunos de los nuevos operadores en C. Y lo hace Alguien recuerda lo que la pequeña zanahoria símbolo es, ese pequeño triangular símbolo desde el teclado representa? ¿Qué operador de bits? AUDIENCIA: EXOR. DAVID J. MALAN: EXOR. Exclusivo o. Así que si quieres, sólo por diversión en casa, para dar a y b de dos arbitraria valores como cualquier eight-- y yo elegiría un valor de ocho bits. Si usted hace esto con 32 bits, obtendrá muy rápidamente aburrido. Pero acaba de dar una de ocho bits valor que es lo que sea, uno o dos, y darle b un valor similar. Y a continuación, utilizando la definición de XOR desde el pasado miércoles, solicitar que poco a poco, cada uno de esos ocho bits en cada uno de a y b, y luego hacer exactamente por este código. Y no es lo correcto que se ve aquí en la pantalla. En efecto, se reduce a tres operaciones XOR y de alguna manera mágicamente a y b intercambiarán posiciones sin perder ninguna información. Así que el truco aceite y el agua es el más cercano encarnación mundo real Se me ocurrió para imitar eso. Pero es seguramente más fácil utilizar una variable temporal, como en este caso. Y esto también se dice una oportunidad, también, este tipo de micro optimización, como un científico de la computación diría, mientras que tipo de diversión alardear de cómo se hizo esto sin como el intercambio con una variable adicional, que no es tan convincente. Debido a ahorrar 32 bits, como en el caso de un int real, No es todo lo que convincente en un sistema donde usted podría estar usando decenas de megabytes o aún más tales memoria estos días. Y de hecho, cuando lleguemos a un conjunto de problemas más adelante y se implementa hechizo corrector y usted el reto de hacerlo con esto como poco RAM y tan poco tiempo posible en el que computer-- todavía tener una semana para implementar it-- podrás tener-- podrás el reto de minimizar esos recursos. Y eso es realmente la única ocasionar este semestre donde se le anima a afeitarse fuera incluso el mejor rendimiento cuesta lo contrario. Así que-- ¿cómo podemos ver esto en código real? Déjame ir por delante ahora y abrir un ejemplo que deliberadamente se llama No swap, porque no lo hace De hecho cambiar las variables como en realidad se podría esperar. Así que vamos a echar un vistazo. He aquí un programa que no tiene CS50 biblioteca pasando, simplemente estándar de E / S. Ahora tenemos un prototipo por encima de la tapa de intercambio que acaba de significa que tiene que ser definido más adelante. Y aquí es principal. Me asignaron arbitrariamente x e y, respectivamente, los valores de uno y dos sólo porque son pequeñas y fácil que pensar. Y entonces sólo tengo un montón de printfs donde tengo una comprobación de validez. x es 1 ey es 2 es presumiblemente lo que esos printfs dirán. Así que no hay magia hasta el momento. Entonces me voy a reclamar con imprimir def, intercambiando dot dot dot. Voy a llamar a la permuta función, pasando en x e y. Y supongamos por ahora que intercambio se lleva a cabo exactamente como lo era hace un momento con una variable temporal. Y por lo que pretendo con valentía, cambié. x es ahora esto e y es ahora que. Pero el archivo, por supuesto, se llama n Swap. Así que vamos a ver realmente lo que sucede. Si compilo sin swap y luego hacer ./noswap, x es 1, y es 2. Intercambio de casas intercambiado. x es 1, y es 2. Así que en realidad parece estar viciado incluso aunque swap-- vamos a desplazarse hacia abajo ahora-- se implementa exactamente por la código que propuso hace un momento. Así que no vamos a conseguir la suposición con las cosas XOR por ahora. Esto también debería funcionar al igual que con la leche y zumo de naranja, pero no parece estar funcionando. Así que vamos a hacer esto otra vez. Tal vez yo no estaba corriendo bien. Así que vamos a correr No Intercambiar nuevo. Quizás yo-- no. Así que es simplemente no funciona. Así que vamos a hacer un poco de comprobación de validez. Déjame ir por delante aquí en Intercambiar y acaba de agregar, espera un minuto, a es% i / n y vamos plug-in el valor de una. Porque realmente quiero para ver lo que está pasando. Y, en efecto, se trata de una técnica de depuración que usted podría estar utilizando en horas de oficina o en casa ya, similar a la primera mitad de Dan Vídeo de Armendáriz en PSET3 en donde introdujimos print def como una técnica recomendada, al menos para los casos simples. Déjame ir adelante y corro hacer sin intercambio de nuevo, ./noswap. Interesante. Así cuenta de lo que parece ser cierto. X es 1, y es 2, pero a es 2 cuando b es 1. Así que esos dos de alguna manera se canjearon pero x e y no están siendo intercambiados. Así que para ser claros, lo que está pasando es, aquí tengo xey y esas son las variables locales en el alcance de principal, estoy pasando x e y intercambiar. Ahora, swap, como una función separada, es libre de llamar a sus argumentos o su parámetros de lo que quiera. Foo o bar o xoy o aob. Sólo para dejar claro que ellos son no idéntica a x e y per se, Lo he dicho a y b. Pero podríamos llamarlos lo que queramos. Y por lo que parece se está pasando de intercambio x-- conocido como A-- y es se pasa Y- conocido como b. De alguna manera, estas tres líneas son el canje de esos valores exactamente como Lauren hizo con la leche y zumo de naranja. Pero cuando imprimimos los valores, a y b son de hecho cambiar pero xy Y tienen ningún cambio a ellos. Recordemos que x e y son aquí. Así que podemos ver esto a través de Otra técnica también. Y esto también es una técnica incrustado en un problema establecido tres. Vamos a seguir adelante y hacer esto en CS50 Identificación si usted no tiene ya. En el lado derecho que tener esta pestaña depurador. Y si abre esto, hay algo de información arcana eso es lanzado en usted al principio. Pero vamos a burlan de esto aparte muy rápido. Así que uno, ver las variables locales. Resulta que construir en IDE CS50, y una gran cantidad de entornos de programación más en general, es un depurador. Una herramienta que te permite ver visualmente lo que está pasando dentro de su programa sin tener que recurrir a la adición printfs y compilar y ejecutar y la adición de printf y compilar y correr, que ya, en horario de oficina o en el hogar, es probable que haciendo bastante tedioso. Así que aquí, en un momento, estamos va a ver en tiempo real los valores de nuestras variables locales. También vamos a ser capaces de establecer los llamados puntos de ruptura que oportunidades en mi programa para hacer una pausa ejecución en una línea específica de código que tengo curiosidad por saber. ¿Correcto? Estos programas se ejecutan en una fracción de segundo. Es un poco agradable para nosotros los seres humanos más lentas para ser capaz de hacer una pausa, tomar un momento, consulte lo que está sucediendo a su alrededor una cierta línea de código sin el arado programa a través de él y acabado por completo. Así que a los puntos de ruptura nos va a permitir a romper y hacer una pausa en un punto determinado. Pila de llamadas es una forma elegante de diciendo qué funciones son actualmente siendo llamado en el momento. Principal se llama siempre primero. Pero si Principal llama función denominada Swap, estamos en realidad va a ver esto Torre de las funciones que han sido llamada en orden cronológico inverso. Así que vamos a ver eso. Me voy a alejar. Voy a volver a mi código. Y sólo porque quiero ser pedante aquí, Voy a seguir adelante y haga clic justo a la izquierda de la línea cinco. Y eso crea un punto rojo. Y note en el lado derecho que el depurador sabe, bueno, Que acabo de decir un punto de interrupción en línea noswap.c cinco, específicamente en esta línea de código. Así que el depurador sabe que yo han solicitado que la próxima vez Tengo mi programa se pausa ejecución no en lugar de sólo corriendo todo super rápido. Así que ahora voy a hacer clic en el Depurar botón en la parte superior del IDE y eso va a hacer lo siguiente. Se va a abrir un principio algo miedo segundo terminal mirando window-- depuración remota desde acoger tal y tal-- y vamos a volver a lo que todo lo que significa en poco tiempo. Pero lo que es importante, por ahora es que ese punto rojo fue golpeado, el depurador tiene deliberadamente pausa execution-- no en esa línea en sí, sino en la primera línea de código real en esa función. Y por eso la línea siete es ahora resaltado en amarillo. Y ahora vamos a echar un vistazo en el lado derecho. Parece que, por defecto, lo suficientemente bien, x tiene lo que de valor? 0. E y tiene lo que de valor? Cero. Y eso es de esperar en el sentido que x e Y- que line-- amarilla tiene aún no ejecutado. Así que x no deben tener el valor 1. Podría tener cualquier otro valor, un valor llamado de basura. Y tenemos la suerte de que es cero en este punto, esencialmente. Así que ahora sólo hay unos pocos botones tenemos que cuidar acerca al depurar de esta manera. Nótese aquí, tenemos un botón Reproducir. Y si jugamos o golpear reanudar, eso es sólo va a ejecutar a través de el resto del programa o hasta que choca con otro punto de interrupción. Pero yo no he puesto ningún otro puntos de ruptura por lo que es justo va a correr hasta el final. Ese tipo de derrotas las propósito de hurgar. Así que en vez, me importa estos iconos a la derecha. Y si se ciernen sobre ellos, como se debe también, verás pequeños consejos herramienta tips--. Este es un paso más. Ahora eso no significa salto la siguiente línea de código. Eso sólo significa ejecutarlo y pasar a la siguiente, pasar a la siguiente, pasar a la siguiente. En otras palabras, a través de ese botón, puedo caminar a través de mi código de un paso a la vez. Línea por línea, literalmente. Ahora, a la derecha de eso, hay otro que veremos en un momento. Esta es la llamada Step Into icono que es me va a permitir buceo en otra función. Pero vamos a ver esto en un momento. Así que voy a hacer clic pasar por encima. Y ahora note, como hago clic este botón en la parte superior derecha, mantener los ojos más o menos bajo Local Variables y ver qué sucede con x. x es ahora 1 porque el línea amarilla se ha ejecutado y nos hemos trasladado a la línea 8. Y en un momento y esperemos que debería convertirse 2. Ahora, nada tan interesante que pasa por un poco. Todo esto es es printf. Y cuenta, en mi terminal secundaria ventana, veo la salida de definición de impresión. Y ahora tengo que hacer una decisión del programador. Puedo pasar por encima de esta línea de código, ejecutarlo, pero no conseguir curioso sobre lo que hay dentro. O puedo paso realmente en él e ir dentro de Intercambio de sí mismo. Así que vamos a hacer el segundo. Déjame ir adelante y haga clic en No Step Over pero Step Into. Aviso, de repente, los cambios en las ventanas para resaltar la primera línea de código en Cambiar. Esa es la línea 21. Y ahora, ¿qué clase de cobarde es que, si se mira por aquí, como se esperaba, una coma b es 1 y 2, respectivamente. ¿Por qué es temp 32767? Recordando que la temperatura, al igual que la taza vacía hace un momento, se declara aquí en la línea 21. ¿Por qué 32.000 Quiero decir, ¿por qué es sólo algún valor raro? ¿Sí? AUDIENCIA: No es inicializado. DAVID J. MALAN: Es No ha inicializado. Así que nuestro equipo siempre tiene memoria física. Inclusive de RAM física. Y siempre de cero y uno está ahí, ¿verdad? Debido a que estamos usando nuestra computadora todo el día, está utilizando el CS50 IDE o los servidores de todo el día. Así que la memoria RAM o bien tiene algunos ceros o alguien de o algunos ceros y unos. No importa si es o no los estés usando. No se puede tener en blanco espacios en los que quieren bits. Son ya sea ceros y unos. Así resulta que la temperatura, ya que no hemos inicializado todavía, tenemos esos 32 bits, pero no he ha inicializado a los valores conocidos. Así que lo que fueran más recientemente utilizado para-- los 32 bits-- sólo estamos viendo los artefactos de algunos uso previo de aquellos particulares 32 pedacitos. Tan pronto como haga clic en Paso a paso por embargo, uf, temperatura se va a poner el valor 1. Y si lo hago de nuevo, a es va a ser dado el valor 2 y luego b va a ser dado el valor 1. Y así, lo que es bueno ahora en este punto de la historia es que el depurador es mostrándome, super lenta a mi propio ritmo, lo que el estado de Swap es. Pero fíjate en la parte superior aquí, previo aviso que la pila de llamadas en realidad tiene dos capas a la misma. Ahora el que ha destacado como Swap, si hago clic en Principal lugar, observe cómo cambian las variables locales debido a que el desarrollador puede simplemente hop vuelta y entrar en cualquier ámbito diferente. Así que a pesar de que estamos haciendo todo esto trabajar e intercambiar correctamente a y b, si voy a ir y venir entre Permuta donde a es 2 y b es 1 y Main, ha Principal visto afectada en absoluto? No. ¿Cuál es la comida para llevar en esta lista? Bueno, resulta que cualquier momento se llama a una función como Swap, y se le pasa argumentos, lo que estás pasando a la función swap en este caso es una copia de esos argumentos. Así que si x e y son cada uno, respectivamente 32 bits, lo swap es conseguir es dos nuevos locales variables o argumentos, llamado y B-- pero aquellos son arbitrarias nombres-- pero el patrón de ceros y queridos en el interior de A y B son fila para ser idéntica a x e y pero no son la lo mismo que x e y. Es como si tiene Principal en su pedazo de papel el número 1 y 2 para x e y, y luego cuando manos que pedazo de papel para intercambio, Intercambiar pone muy rápidamente su propia pluma, escribe 1 y 2 en su propia hoja de papel, manos atrás xy original Principal y luego hace su propia cosa con a y b. Y ahora esto es super importante porque esto tiene implicaciones no triviales para realmente escribir código correcto porque parecería que no podemos cambiar dos variables. He escrito una función Intercambiar correcta. Hemos implementado con Lauren como una función de intercambio correcto en la realidad, pero aparentemente nada de eso asuntos si no puede en realidad intercambiar dos valores de forma permanente. Así que tenemos otra manera para conseguir realmente en esto, y tenemos que ser capaces de realmente resolver este problema. Y resulta fuera-- y nos va a venir volver a esta imagen en particular antes long-- esta es una manera de que puede dibujar la memoria del equipo. Es sólo un rectángulo. Usted podría dibujar cualquier número de maneras, pero es conveniente para dibujar como un rectángulo por la siguiente razón. Vamos a empezar hoy y más allá hablando de la llamada pila. Y la pila es sólo un trozo de RAM-- un trozo de memory-- funciones que tienen acceso cuando se les llama. Y así resulta que en la parte inferior de esta pila es donde todas las variables locales de principales y org C y org V y todas esas cosas se va a ir de forma predeterminada. Y si Principal pide alguna otra función como Swap, así, Traga va a conseguir otra capa de la memoria por encima de ella. Y por lo que acaba de darle una somera rápida foto de esto, si yo voy aquí-- y dejé mi Espejo esto en el los gastos generales como bien-- lo que realmente tengo, si nos preocupamos sólo de la parte inferior de esta imagen, por ahora, es que cuando ejecuto un programa de y Main se llama, Principal se le da un trozo de RAM en mi equipo que es en la parte inferior de esta llamada pila. Y yo voy a dibujarlo deliberadamente como un cuadrado. Así que es como 32 bits o cuatro bytes. Y si esta función principal tiene una variable llamada x con un valor de 1 y tiene una variable llamada y con el valor de 2, que es como tomar esta astilla de memoria que Principal ha sido propuesta por el operativo sistema y dividiéndolo de modo que la primera variable local va aquí, el segundo va aquí, y eso es todo. Cuando principal llama Swap, Intercambiar obtiene su propio trozo de la memoria que vamos a dibujar como este desde el sistema operativo, y que va a tener su variables locales propios basados en nuestra aplicación anterior con variables locales una y b que en un principio obtener los valores 1 y 2. Pero entonces, tan pronto como sea el código de Swap ejecuta, y Lauren realidad intercambia el DO y la leche, lo que está pasando? Pues bien, este 2 está convirtiendo en un 1, este 1 está convirtiendo en un 2, y, por cierto, hay una variable temporal que está siendo usado todo ese tiempo que con el tiempo se va. Pero no importa la cantidad de trabajo que usted hace en esta línea de-- en este espacio de memoria, x e y son completamente intacta. Así que necesitamos alguna manera de dar Intercambiar y funciona como si acceso secreto, si se quiere, a funciones como-- a la memoria como x e y. Así que echemos un vistazo a un ejemplo que ayuda a ver exactamente lo que ha estado pasando todo este tiempo. Voy a seguir adelante y abrir Comparar Cero. Y yo voy a cerrar nuestra depurador, voy para cerrar este mensaje en busca de miedo los justos dice, espera un minuto, estás en la depuración media. Voy a ocultar esta pestaña aquí sólo para volver a la simplicidad. Así que no te preocupes si GDB es asesinado. Eso sólo significa que el programa tiene sido dejar de fumar, deliberadamente, en este caso, De mi. Y ahora Comparar Zero hace esto. Estoy usando el CS50 biblioteca de E / S estándar. Tengo una función principal que primero dice, dicen algo, y obtiene una cadena. Luego dice una y otra consigue otra cadena. Y notar que estas dos cadenas se llaman s y t, respectivamente. Y ahora este programa, Comparar Zero, su propósito en la vida, se supone que me dicen, lo escribo lo mismo? Y así me voy a volver a la semana uno. Estoy usando mi operador de igualdad iguales que es el operador de la calidad. No es el operador de asignación, el operador de igualdad. Sólo estoy comparando s y t. Así que vamos a realmente seguir adelante y hacer esto. Y voy a seguir adelante y hacer comparación Cero. Yo voy a hacer ./comparezero. Y yo voy a ir adelante y decir algo como, vamos a hacer mamá en minúsculas y ¿qué hay de la mamá en mayúsculas. Y por supuesto que escribo cosas diferentes. Correcto. Eso es de esperar. Vamos a correr de nuevo. Las dos veces lo hacen en minúscula, minúscula. Eso se ve súper idéntica a mí. Intro. OK. Tal vez es sólo raro porque no está gustando mi gramática. Así que vamos a hacer un MOM de capital, capital de MOM, idénticos. Cosas diferentes. Entonces ¿por qué es eso? Bueno, lo que realmente está pasando de debajo del capó aquí? Así que vamos a volver más aquí por un momento y considerar lo GetString es en realidad haciendo. Cuando se llama a GetString, que es una función que nos escribió y que llega de alguna manera una secuencia de caracteres del usuario. Y vamos a suponer que la primera vez que llamo GetString, eso me da un trozo de memoria que se parece a esto. Y si he escrito en minúsculas m-o-M-- y lo que va después de él? Sólo una comprobación de validez rápido. Cero barra invertida. Lo sabemos. Y recordamos que jugamos todo con el nombre de Zamila y un montón de otros nombres cuando Rob estaba aquí buscando a lo que está pasando dentro de la memoria. Así que la historia es exactamente la misma. Esto es lo que GetString está volviendo a mí. Ahora, mi código hace un momento almacena el valor de retorno de GetString en una variable llamada s. Y entonces la segunda vez que me llamaba, se almacena en una variable llamada t. Así que si me voy de aquí, necesito para dibujar este variable-- locales y estoy por lo general va a dibujar una cadena como sólo-- vamos llamarlo s-- como una pequeña plaza aquí. Y ahora, ¿cómo somehow-- mamá ir dentro de esta variable s? Bueno, tenemos que volver a los primeros principios aquí. ¿Qué está GetString realidad regresaba? Así resulta que M-O-M barra invertida cero, y cualquier número de otras cadenas en memoria como Zamila y Rob o Andy o cualesquiera otros, son, por supuesto, en nuestro RAM o memoria de ordenador. Y la memoria RAM tiene como-- tienes un giga de RAM, dos gigas de RAM, o mil millones o dos mil millones de bytes, o tal vez aún más en estos días. Así que vamos a suponer, para los propósitos de la actualidad, que no importa cómo numeramos ellos, pero podemos numerar cada de los mil millones o dos mil millones de o cuatro mil millones de bytes. Y digamos que arbitrariamente que esta es la primera picadura, mordedura segundos, tercero cuarto. Deliberadamente no estoy usando cero para hoy, pero vamos a volver a eso. Así, en otras palabras, si este es el primera vez que estoy usando el programa, Sólo estoy teniendo suerte y la primera mordedura es en la ubicación a una y luego dos luego tres de cuatro. Y si seguía dibujo, número de la caja dos mil millones sería hasta aquí. Entonces, ¿qué piensa usted, entonces, GetString realidad regresa? No está volviendo H-O-H barra invertida cero per se, ya que claramente no caben en la caja que he dibujado. Entonces, ¿qué otra cosa podría GetString realidad Volveremos todas estas semanas? La respuesta está en el tablero de aquí en alguna parte. No puede caber H-O-H barra invertida cero, así que lo que podría tener sentido en su lugar? Si tuviera que ser super inteligente, poniendo en el denominado sombrero de ingeniería, ¿qué podrías volver? ¿Cuál es la menor cantidad de información usted podría volver que haría aún le permiten encontrar M-O-M en la memoria? ¿Sí? AUDIENCIA: Uno. DAVID J. MALAN: One. ¿Y por qué uno? AUDIENCIA: Porque sería decirle a donde vayas [inaudible]. DAVID J. MALAN: Exactamente. Yo sólo voy a devolver la dirección de la cadena que he conseguido. La dirección de esta caso es ubicación a una. Así que lo que realmente está siendo almacenada en s-- y cada variable de cadena tanto far-- simplemente ha sido el dirección de esa cadena. Mientras tanto, si llamo GetString una segunda vez y yo escribir, literalmente, la misma cosa-- M-O-M con lowercase-- M-O-M y otra barra invertida cero, y ahora tal vez mi programa de estado funcionando durante algún tiempo así que quizás esto es 10, esto es la ubicación 11, esto es 12, esto es 13. Los equipos que utilizan algún otro memoria por cualquier razón. ¿Y ahora qué pasa en mi segundo variable en mi programa de t? 10. Exactamente. Y así, cuando nos fijamos en la código fuente de este programa donde yo simplemente estoy tratando para comparar los dos valores, es S igual igual at, ¿cuál es la respuesta humana obvio? Así que no, porque 1 no es igual a 10. Y así, en este documento se encuentra un oportunidad para nosotros de verdad que sólo tiene que ir de nuevo a, de nuevo, primero principios y pensar, bueno, lo que está pasando debajo de la campana? Hemos estado hablando acerca de bits y bytes y la memoria, pero en realidad es útil para entender porque cuando usted llama GetString, a pesar de que pensamos que es regresar H-O-H o cadena mamá o Andy o Zamila o similares, técnicamente es sólo devolver la dirección de esa parte de la memoria. Pero eso esta bien. Porque ¿cómo sé donde termina la cadena? Si tan sólo me dan el principio? Bueno, la barra invertida cero, ¿no? Justo a tiempo lineal que pueda imprimir con definición de impresión M-O-M. Y tan pronto como veo barra invertida cero, no me importa donde empecé, Ya sé implícitamente donde tengo que terminar. Y por lo que hoy se cumple el beginning-- y déjame hacer esto de forma espectacular porque nos pasó por un montón de problemas para conseguir éstos aquí entrenando wheels-- por lo que hoy las ruedas de entrenamiento comienzan a desprenderse y nos revelan por lo menos: [Aplausos] Eso fue bien vale la pena el viaje a Target esta mañana, ¿no? Así ahora-- existe, resulta cabo, no hay tal cosa como una cadena. Cadena no existe. Es un sinónimo que hemos tenido en el interior de la biblioteca CS50. De ahora en adelante, vamos a empezar a llamar s y t no secuencias pero estrellas Char. Y la estrella carbón vamos desmenuzar poco tiempo. Pero esto es decir, que incluso si continuamos utilizando GetString por ahora, técnicamente que debería estar diciendo estrellas carbón y la estrella de carbón. Y resulta que lo que la estrella va a significar algo llamado un puntero o una dirección. Y, de hecho, un teaser para lo que se avecina es ese 20 segundo clip de nuestra amigo Nick Parlante en Stanford que, hace bastante tiempo, pasar una cantidad ridícula de tiempo, lo mejor que puedo decir en su cocina o el sótano de su casa, hacer animación con plastilina introducción al mundo un personaje llamado Binky con los que va a se introducirá la próxima vez para los punteros. Así que aquí es un adelanto de lo que está por venir. [REPRODUCCIÓN DE VÍDEO] -Oye, Binky. Despertarse. Es tiempo para la diversión puntero. -¿Que es eso? Entérese de los punteros? Oh, chuchería. [FIN DE REPRODUCCIÓN] DAVID J. MALAN: Y en esa nota, nos vemos el miércoles. Correcto. ¿Quién es el baile? Vamos. ¿Quién es el baile? ¿Quieres que ponerlo en marcha? Voy a ponerlo en marcha. Woooo! LAUREN: lujo dulce Moisés.