>> 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.
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.