[REPRODUCCIÓN DE MÚSICA] DAVID J. MALAN: Muy bien. Esto es CS50, y esto es el comienzo de la semana dos. Empecemos, pues, hoy con un error. Un error, por supuesto, es un error en un programa, y obtendrá muy familiarizados con este concepto si nunca has programado antes. pset0 y ahora pset1. Pero vamos a considerar algo un poco simple al principio. Este programa aquí que yo tiró juntos por adelantado, y afirmo que esto debe imprimir 10 estrellas de la pantalla utilizando printf, pero está aparentemente Buggy en alguna manera. Dado que especificación que debe imprimir 10 estrellas, pero no es así, aparentemente, lo que usted reclamar es el error? ¿Sí? Así que es un fuera por un error, y ¿qué quieres decir con eso? Okay. Excelente. Así que hemos especificado un valor inicial de cero para i, y hemos especificado un valor de n de 10, pero nosotros hemos usado menor o igual a. Y la razón de que esto es de dos personajes y no sólo un símbolo, como en un libro de matemáticas, es que usted no tiene una forma de expresar la un equivalente de caracteres. Así que eso significa menos de, pero si usted comienza a contar desde cero, pero se cuenta hasta el final a través de e igual a 10, usted es, por supuesto, va a contar 11 cosas en total. Y por lo que vamos a imprimir 11 estrellas. Entonces, ¿qué podría ser una solución para esto? ¿Sí? Así que ajustar el menos o igual a sólo ser menor que, y hay, reclamo, tal vez otra solución, también. ¿Qué puede ser que otra cosa que hacer? ¿Sí? Así que empieza a igualar a 1, y dejar el menor que o igual a. Y, francamente, me gustaría reclamar que, para un humano típico, Esto es probablemente más sencillo. Empieza a contar en 1 y contar hasta a 10. Básicamente hace lo que quiere decir. Pero la realidad es en programación, como hemos visto, los informáticos y programadores generalmente no empezar a contar desde cero. Y así está bien una vez te acostumbras a él. Su estado de salud general algo así como menos. Así que simplemente una lógica error que podríamos ahora fijar y finalmente volver a compilar esto y conseguir apenas 10. Bueno ¿qué tal este error aquí? Aquí, otra vez, reclamar que tengo un objetivo de imprimir 10 stars-- uno por línea esta vez, pero no es así. Antes de que nos proponemos lo la solución es, lo que hace este imprimo visualmente si yo fuera a compilar y ejecutar este programa qué te parece? ¿Sí? Estrella. Así que todas las estrellas en el misma línea es lo que he oído, y luego el carácter de nueva línea. Así que vamos a tratar de eso. Así hacen con errores-1, entrar, y veo el comando clang que hablamos la última vez. ./buggy-1, y de hecho veo todas las 10 estrellas en la misma línea a pesar de que yo reclamo En mi especificación sólo un comentario en la cima el código que tenía la intención de hacer una por línea. Pero esto se ve bien. Ahora la línea 15 se ve como si estuviera la impresión de una estrella, y luego la línea 16 parece como si yo fuera la impresión un carácter de nueva línea, y los dos están tan sangría Yo estoy dentro del bucle claramente. Así que no debería estar haciendo la estrella, nueva línea, estrella, nueva línea, estrella, nueva línea? Sí? Sí, a diferencia de un lenguaje como Python, si usted está familiarizado, indentación no importa al equipo. Lo único que importa a la humana. Así las líneas mientras que aquí me he inventado 15 y 16-- que se ve hermosa, pero la computadora no le importa. El equipo se preocupa por realmente tener llaves alrededor de estas líneas de código. Así que es clear-- al igual que en Scratch-- que esas dos líneas de código debe ser ejecutado. Como uno de los rompecabezas amarillo de Scratch piezas una y otra vez y otra vez. Así que ahora si puedo volver a ejecutar este program-- ./buggy-2-- Hm. Tengo un error ahora. Lo que me olvidé de hacer? Sí, así que no me compilarlo. Así que con errores-2. No existe el archivo porque no lo hice realmente compilar la segunda versión. Así que ahora interesante no declarado no variable-- 2. Estamos haciendo 1. Hacer ./buggy-1-- buggy 1-- y ahora cada uno de ellos está en la misma línea. Ahora hay una excepción a esta supuesta afirmación mía que necesitáis estas llaves. Cuando es en realidad AUTORIZACIÓN-- si has notado en la sección o textbooks-- omitir las llaves? ¿Sí? Exactamente. Cuando sólo hay una línea de código que quieren ser asociados con el bucle como en nuestro primer ejemplo. Es perfectamente legítimo omitir las llaves sólo como una especie de conveniencia del compilador para usted. ¿Sí? Buena pregunta. ¿Se consideraría un error de estilo? Nos promote-- como en CS50 guía de estilo, la URL para el que está en pset1-- que siempre utilizar las llaves. Ciertamente, si usted es nuevo en la programación. La realidad es que no somos va a prohibir que de hacer estas comodidades. Pero si usted es sólo el en el ritmo de las cosas, absolutamente solo utilice siempre el rizado apoyos hasta que llegue la caída de ella. Buena pregunta. Bien. Así que entonces era un error. Al menos en algo bastante simple. Y sin embargo, usted podría pensar que esto es bastante rudimentaria, ¿verdad? Esta es una especie de la primera semana de ver el lenguaje como, ver sus errores en el mismo. Pero la realidad estos son realmente representativa de algunos problemas bastante aterradoras que pueden surgir en el mundo real. Así que algunos de ustedes pueden recordar si usted sigue de noticias de tecnología, o quizás incluso atrapados viento del este en febrero de este último año que Apple tenía cometido un pequeño error en ambas iOS, el sistema operativo en sus teléfonos, y también Mac OS, el sistema operativo en sus computadoras de escritorio y portátiles. Y viste titulares como este. Y a partir de entonces, Apple prometido corregir este error, y muy rápidamente hizo fijarlo en iOS, pero en última instancia, fija en Mac OS también. Ahora ninguno de estos titulares sola realidad revelar lo que era el problema de fondo, pero el error se reduce en última instancia a un error en SSL, Secure Sockets Layer. Y cuento largo, este es el software que nuestros navegadores y otros software utilizado para hacer qué? Si dijera que SSL es involucrados, cada vez que visite una URL que comience con HTTPS, lo que entonces podría estar relacionado con SSL? Cifrado. Así que vamos a hablar de esto en los próximos días. Cifrado, el arte de la aleatorización información. Pero cuento largo, Apple Hace algún tiempo había cometido un error en la implementación de SSL, el software que implementa en última instancia URL como HTTPS o máximo conexiones allí también. El resultado de lo cual es que su conexiones podría potencialmente ser interceptado. Y sus conexiones eran no necesariamente cifrado si has tenido algún tipo malo en el medio usted y el sitio web de destino que sabía cómo tomar ventaja de esto. Ahora Apple finalmente publicó una solución para este último, y la descripción de su arreglo era esto. Transporte seguro no para validar la autenticidad de la conexión. El tema fue abordado por restauración que faltan etapas de validación. Así que esta es una explicación muy ondulado mano para simplemente decir que metimos la pata. Hay, literalmente, un línea de código que fue con errores en la implementación de SSL, y si usted va en línea y la búsqueda de este usted puede encontrar realmente el código fuente original. Por ejemplo, esta es una captura de pantalla sólo una parte de un archivo bastante grande, pero esta es una función aparentemente llamado SSL verificar intercambio de claves del servidor de suscripción. Y se necesita un montón de argumentos e insumos. Y no nos vamos a centrar demasiado en los pequeños detalles que hay, pero si usted se centra en el código dentro de ese superior function-- vamos zoom sobre eso. Es posible que ya sospechar lo que el error podría aún si no tienes ni idea en última instancia, lo que estamos viendo. Hay una especie de anomalía aquí, que es lo que? Sí, no me gusta la mirada de dos Goto falla. Francamente, no sé muy bien qué Goto FALLO significa, pero tener dos de ellos espalda con espalda. Eso como que me frota intelectualmente por el camino equivocado, y, de hecho, si nos acercamos en sólo esas líneas, esto es C. Así que una gran cantidad de código de Apple está a su vez está escrito en C, y esto al parecer es realmente equivalent-- no que bastante indentación versión, pero si reconoce el hecho de que no hay llaves, lo que Apple realmente escribió era el código que ve como este. Así que he has alejado y yo fija la indentación en el sentido que si no hay llaves, que segundo Goto fallan es en amarillo se va a ejecutar sin importar qué. No está asociado con la condición if por encima de ella. Así que incluso más, si no bastante entender lo que esto podría posiblemente estar haciendo, saber que cada uno de estos conditions-- cada una de estas líneas es un paso muy importante en el proceso de comprobar si sus datos son en realidad cifrada. Así saltarse uno de ellos pasos, no es la mejor idea. Pero porque tenemos esta Ir a segunda falla en amarillo, y porque una vez que tipo de estéticamente moverlo a la izquierda donde se lógicamente es en este momento, lo que Qué significa esto para la línea de código de abajo que Goto segundo fallas pensaría usted? Siempre va a ser omitido. Así gotos están generalmente mal visto por razones que no vamos a entrar en realmente, y de hecho en CS50 no tendemos para enseñar esta Goto declaración, pero se puede pensar en Goto fallar en el sentido de ir salto a alguna otra parte del código. En otras palabras saltar por encima esta última línea por completo, y así el resultado de esta estúpida simple error que se acaba resultado de alguien probablemente copiar y pegar uno también muchas veces era que todo el la seguridad de iOS y Mac OS era vulnerable a la interceptación por malos desde hace bastante tiempo. Hasta que Apple finalmente fija esto. Ahora bien, si algunos de ustedes son en realidad corriendo versiones antiguas de iOS o Mac OS, usted puede ir a gotofail.com que es un sitio web que alguien creó para determinar esencialmente mediante programación si el equipo sigue siendo vulnerable. Y, francamente, si lo es, es probablemente una buena idea para actualizar el teléfono o tu Mac en este momento. Pero allí, justo testimonio de cuán una apreciación de éstas nivel inferior detalles y bastante ideas simples puede realmente traducirse en decisiones y los problemas que affected-- en este caso-- millones de personas. Ahora una palabra sobre la administración. Sección comenzará el próximo domingo. Usted recibirá un correo electrónico por el fin de semana de la sección, y en ese momento el proceso de resección se iniciará si no tienes se dio cuenta de que ahora tienen algunos de los nuevos conflictos. Así que esto sucede todos los años, y nos se acomoda en los días por venir. Oficina horas-- hacen mantener un ojo en esta programación aquí. Cambia un poco esta semana, en particular el tiempo de inicio y la ubicación, así que consulte con que antes de dirigirse a las horas de oficina cualquiera de las siguientes cuatro noches. Y ahora unas palabras sobre la evaluación, especialmente en lo que te sumerjas en un problema establece uno y más allá. Así por la especificación, estos son por lo general los ejes a lo largo de la cual evaluamos su trabajo. El alcance se refiere a lo que medida sus implementos de código las características necesarias por nuestra especificación. En otras palabras, la cantidad de un conjunto pieza hizo morder fuera. ¿Hiciste un tercio de ella, un medio de ello, el 100% de la misma. Incluso si no es correcta, la cantidad que consiguió? Así que captura el nivel de esfuerzo y de la cantidad a la que poco alejado de la los problemas del conjunto de problemas. Correctness-- éste, a ¿En qué medida, es su código coherente con nuestra especificaciones y libre de errores. Así funciona correctamente? Si le damos un poco de entrada, lo hace nos dan el resultado que esperamos? Design-- ahora esta es la primera de particularmente los cualitativos, o los que requieren el juicio humano. Y, de hecho, es por eso que contamos con un personal de tantos compañeros de enseñanza y curso ayudantes. ¿Hasta qué punto es su código bien escrito? Y de nuevo se trata de una muy evaluación cualitativa que trabajará con usted en bidireccionalmente en las semanas por venir. Así que cuando usted no recibe solamente en los resultados numéricos, sino también unas partituras escritas, o retroalimentación mecanografiado, o comentarios por escrito en las palabras en inglés. Eso es lo que vamos a utilizar para conducir que hacia realmente escribir un mejor código. Y en la conferencia y en la sección, trataremos señalar salir-- tan a menudo como nos puedes-- lo que hace que un programa no sólo correcta y funcionalmente bueno, sino también bien diseñado. El más eficiente que podría ser, o incluso la más hermosa que puede ser. Lo que nos lleva al estilo. Estilo en última instancia es un juicio estético. ¿Elegiste bien nombres para las variables? ¿Te sangría su código correctamente? ¿Se ve bien, y por lo tanto, es fácil para otro ser humano leer su respectiva de su corrección. Ahora por lo general por el plan de estudios, anotamos estas cosas en una escala de cinco puntos. Y permítanme recalcar el punto que tres es de hecho bien. Muy rápidamente hacer amigos empezar a hacer aritmética. Cuando llegan a tres de cada cinco en la corrección de algún conjunto de procesadores y piensan maldita, me va a 60% que es esencialmente un D o un E. Esa no es la forma en que pensar en estos números. A tres es en verdad bueno, y lo que en general, se puede esperar en el comienzo del término es que si usted está recibiendo un montón de three's-- tal vez un par de ferias, un par de fours-- o un par de dos en dos, un par de fours-- eso es un buen lugar para empezar. Y mientras vemos un trayectoria ascendente en el tiempo, usted está en un buen lugar. La fórmula que utilizamos para cosas de peso es esencialmente esto por el plan de estudios, que simplemente significa que tenemos dar más peso a la corrección. Debido a que es muy a menudo la corrección que lleva la mayor parte del tiempo. Confía en mí ahora. Usted encontrar-- al menos en una pset-- que pasar el 90% de su tiempo trabajando en 10% del problema. Y todo tipo de obras a excepción de uno o dos errores, y esos son los errores que mantenerte despierto hasta tarde por la noche. Esos son los que suerte de escapar. Pero después de dormir en ella, o asistir a las horas de oficina o hacer preguntas en línea, se cuando se llega a ese objetivo 100%, y es por eso que el peso corrección más. Diseñar un poco menos, y estilo un poco menos que eso. Pero hay que tener en estilo mente-- es tal vez la más fácil de éstos a morder según la guía de estilo. Y ahora, una más grave observar en la honestidad académica. CS50 tiene la triste distinción de siendo el mayor productor de la Junta Ad casos casi todos los años históricamente. Esto no se debe a que los estudiantes hacen trampa en CS50 más que cualquier otra clase, pero debido a la naturaleza de la obra, el hecho de que es electrónico, el hecho de que lo buscamos, y el hecho de que somos los informáticos, Puedo decir que estamos por desgracia muy bueno en lo detecte. Así que ¿qué significa esto en términos reales? Así que, por el plan de estudios, la filosofía del curso realmente no se reducen a ser razonable. Hay esta línea entre haciendo el trabajo de uno por su cuenta y conseguir un poco de ayuda razonable de un amigo, y de plano hacer ese trabajo para su amigo, o enviándole su código de modo que él o ella puede simplemente tomar o pedir prestado a la derecha. Y que cruza la línea que dibujan en la clase. Vea, el plan de estudios en última instancia, para las líneas que dibujamos como razonable y el comportamiento irracional, pero lo que realmente hace hervir abajo a la esencia de su trabajo que necesitan ser tu propio al final. Ahora, con esto dicho, hay una heurística. Porque como usted podría imagine-- de las horas de oficina y los efectos visuales y los vídeos que hemos muestra CS50 así far-- es de hecho la intención de ser lo más colaborativa y como cooperativa y como sociales como sea posible. Como colaborativo como es riguroso. Pero con esto, dijo, la heurística, como se verá en el programa de estudios, es que cuando usted está teniendo algún problema. Usted tiene algunos errores en el código que no puede resolver, es razonable para usted para mostrar su código a otra persona. Un amigo incluso en la clase, un amigo sentado a tu lado en horas de oficina, o un miembro del personal. Pero ellos no pueden mostrar su código para usted. En otras palabras, una responder a su pregunta-- Necesito ayuda-- ¿no oh, aquí está mi código. Echa un vistazo a esto y deducir de ella lo que quieras. Ahora, por supuesto, no hay una manera clara al juego este sistema por el que te voy a mostrar mi código antes de tener una pregunta. Usted me muestra mi su código antes de someterse a una pregunta. Pero ver el programa de nuevo para el detalles más finos de donde esta línea es. Sólo para pintar ahora la imagen y compartir lo más transparente posible donde estamos en los últimos años, este es el número de casos de la Junta Ad CS50 que ha tenido más los últimos siete años. Con 14 casos este último otoño. En cuanto a los estudiantes involucrados, era 20 algunos estudiantes impares en el otoño pasado. Hubo un máximo de 33 estudiantes hace algunos años. Muchos de los cuales son por desgracia ya no está aquí en el campus. Los estudiantes que participan como porcentaje de la clase ha oscilado históricamente entre el 0% al 5,3%, que es sólo para decir esto es cada año un reto. Y hacia ese fin, lo que queremos hacer es transmitir una que dd-- sólo FYI-- comparar al un ser justos con aquellos estudiantes que siguiendo la línea en consecuencia. Hacemos comparar todos los actuales presentaciones en contra de todas las misiones anteriores desde el pasado muchos años. Sabemos también cómo Google alrededor y encontrar repositorios de código , foros de discusión en línea , sitios de trabajo en línea en línea. Si un estudiante se encuentra, podemos sin duda encontrará todo lo que lamentablemente hacemos. Así que lo que usted verá en el plan de estudios aunque es esta cláusula pesar. Yo sabe apreciar, y todos nos tiene personal de haber hecho el curso como esto, o esta en sí mismo uno con el tiempo, sin duda saben lo que se siente cuando la vida se interpone en el camino cuando se tiene alguna noche tarde deadline-- no sólo en esta clase, pero otro-- cuando estás completamente agotado, estresado, tener un número excesivo de otras cosas que hacer. Va a hacer que en algún momento de la vida sin duda un mal, tal vez tarde decisión noche. Así que por el plan de estudios, hay esta cláusula, de manera que si dentro de las 72 horas de hacer alguna mala decisión, usted es dueño hasta que y llegar a mí y uno de los jefes del curso y vamos a tener una conversación. Nosotros nos encargaremos de las cosas internamente con la esperanza de que se convierta en más de un momento de enseñanza o lección de vida, y no algo con ramificaciones particularmente drásticas como se puede ver en estos gráficos aquí. Así que eso es un tono muy serio. Hagamos una pausa para unos pocos segundos para romper la tensión. [REPRODUCCIÓN DE MÚSICA] DAVID J. MALAN: Muy bien, así que ¿cómo es que para un segue? Para los temas principales de la actualidad. La primera de las cuales es la abstracción. Otro de los que va a ser la representación de los datos, que francamente es una manera muy seco de decir cómo podemos ir sobre la solución de problemas y el pensamiento sobre la resolución de problemas? Así que has visto en Scratch, y usted tiene visto quizá ya en pset1 con C que no sólo se puede utilizar funciones, como printf, que otras personas en año pasado escribió para ti. También puede escribir sus propias funciones. Y aunque puede que no tenga hecho esto en C, y francamente en pset1 usted realmente no necesita para escribir su propia función porque el problema-- aunque tal vez de enormes proporciones en primero glance-- verás en última instancia, puede ser resuelto con no todos los que muchas líneas de código. Pero dicho esto, en términos de escribir su propia función, darse cuenta de que C da que esta capacidad. Yo voy a ir en el código fuente actual, que ya está disponible en línea, y yo voy a seguir adelante y abierto un programa que se llama función 0.C, y en función de cero vamos a ver algunas cosas. En las primeras líneas 18 a través de 23 es mi función principal. Y ahora que estamos empezando a leer código que no estamos escribiendo sobre la marcha, sino que he escrito con antelación o que en un conjunto de problemas podría recibir con ha escrito con antelación. Una buena manera de empezar lectura de código de otra persona es buscar la función principal. Averiguar donde esa entrada punto es de ejecutar el programa, y luego seguir lógicamente a partir de ahí. Por lo que este programa aparentemente impresiones su nombre seguido de dos puntos. A continuación, utilizamos GetString de la biblioteca CS50 para obtener una cadena, o una palabra o frase desde el usuario en el teclado. Y luego está este Lo printNombre aquí--. Ahora no es un printNombre función que viene con C. No está en io.h. estándar No está en CS50.h. Es más bien en el mismo archivo. Aviso si me desplazo hacia abajo unas líneas bit-- 25 a 27-- es sólo una manera bonita de comentar su código mediante las estrellas y las barras. Esta es una de varias líneas comentario, y esto es sólo mi descripción en azul de lo que hace esta función. Debido a que en las líneas 28 a 31, He escrito una función super simple cuyo nombre es printNombre. Se necesita cuántos argumentos le dirías? Así que uno argument-- porque hay una argumento que aparece dentro de los paréntesis. El tipo de la que es String. ¿Qué quiere decir printNombre es como esta caja de negro o función que toma como entrada una cadena. Y el nombre de esa cadena convenientemente estará Nombre. No S, no N, pero su nombre. Así que, ¿qué hace printNombre? Es agradable simple. Del mismo modo que una línea de código para el printf, pero al parecer imprime "Hola," fulano de tal. Cuando el tal y tal viene del argumento. Ahora bien, esto no es una gran innovación aquí. Realmente, me he tomado un programa que pudiera haber sido escrita con una línea de código poniendo esto aquí, y lo cambió a algo que involucra a unos seis o siete años más o menos líneas de código todo el camino hasta aquí. Pero es la práctica de una principio conocido como abstracción. Tipo de encapsular dentro de un nuevo función que tiene un nombre, y mejor pero ese nombre literalmente dice lo que hace. Quiero decir printf-- eso no es particularmente descriptiva. Si quiero crear un pieza del rompecabezas, o si que desee crear una función que imprime el nombre de alguien, la belleza de hacer esto es que lo que pueda realmente que la función de dar un nombre que describe lo que hace. Ahora que se necesita en una entrada que He llamado arbitrariamente nombre, pero eso también es maravillosamente descriptivo en lugar de ser un poco más genérico como S. Y vacío, por ahora, sólo significa que esta función no me devolver nada. No es como que GetString literalmente me entrega vuelta una cadena como lo hicimos con los pedazos de papel con sus compañeros de clase la semana pasada, sino más bien que sólo tiene un efecto secundario. Se imprime algo a la pantalla. Así que al final del día, si yo no hacer la función-0, ./function-0, veremos que pide mi nombre. Escribo David, y los tipos a mi nombre. Si lo hago de nuevo con Rob, que va a decir "Hola, Rob." Así que una idea simple, pero quizás extrapolar de esta mentalmente que a medida que sus programas obtienen un poco más complicado, y desea escribir un trozo de código y llamadas que code-- invoke que code-- por algunos descriptiva nombrar como printNombre, C sí nos permitirse esta capacidad. Aquí hay otro ejemplo simple. Por ejemplo, si abro una presentar de llamada hoy return.c, cuenta de lo que he hecho aquí. La mayor parte de esta función principal es printf. La primera vez que inicializar arbitrariamente un variable llamada x al número 2. Luego imprimo "x es ahora % I "pasar en el valor de x. Así que sólo estoy diciendo lo que es. Ahora estoy solo con audacia afirmando con printf. Estoy cubicación ese valor x, y estoy hacerlo llamando a una función llamado paso del cubo en x como argumento, y luego guardar la salida en la propia variable, x. Así que estoy golpeando fuertemente el valor de x. Estoy anulando la valor de x con lo el resultado de llamar esta función es cubo. Y luego me imprimo algunos material esponjoso aquí diciendo lo que hice. Entonces, ¿qué es, entonces, el cubo? Note lo que es fundamentalmente diferente aquí. He dado la función un nombre como antes. He especificado un nombre para una discusión. Esta vez se llama n en lugar del nombre, pero yo podría llamarlo lo que quiera. Pero esto es diferente. Esta cosa de la izquierda. Anteriormente, era lo que la palabra clave? Chicos. Ahora es obviamente int. Entonces, ¿qué tal la quita? Mientras que significa void especie de la nada, y ese era el caso. PrintNombre nada volvió. Se hizo algo, pero no me devolverán algo que podría poner en el lado izquierdo de un signo igual como lo he hecho aquí en la línea 22. Así que si digo que en la línea 30, ¿qué es eso, probablemente, lo que implica acerca de lo que el cubo tiene para mí? ¿Sí? Se devuelve un entero. Así que me da la espalda, para ejemplo, un trozo de papel sobre el que ha escrito la respuesta. 2 cubos, o 3 cubitos, o 4 cubed-- lo pasé en, y ¿cómo puedo implementar esto? Bueno, acaba de n veces n veces n es cómo puede ser que cubicar un valor. Así que de nuevo, super simple idea, pero demostrativo ahora cómo podemos escribir funciones que en realidad nos hizo volver valores que puedan ser de su interés. Veamos un último ejemplo aquí se llama función de uno. En este ejemplo, se inicia para obtener más convincente. Así, en función de uno, esta aviso program-- última instancia llama a una función llamada GetPositiveInt. GetPositiveInt no es un función en la biblioteca CS50, pero decidimos que le gustaría que exista. Así que si nos desplazamos hacia abajo más adelante en el archivo, Noto cómo me fui sobre la implementación conseguir int positivo, y yo dicen que es más convincente porque este es un decente número de líneas de código. No es sólo un tonto programita juguete. En realidad tiene algo de comprobación de errores y hacer algo más útil. Así que si no has visto el tutorial videos que hemos incrustado en pset1, sabe que este es un tipo de bucle en C, similar en espíritu para el tipo de cosas de Scratch puede hacer. ¿Y dice hacerlo. Imprima esto. Luego seguir adelante y obtener n-- conseguir un int y almacenarlo en n, y seguir haciendo esto una y otra vez y de nuevo, siempre y cuando n es menor que uno. Así que n va a ser inferior a un sólo si el humano no está cooperando. Si él o ella está escribiendo en 0 o -1 o -50, este bucle se va a mantener la ejecución de una y otra vez. Y en última instancia, noto, me devuelva el valor. Así que ahora tenemos una función eso hubiera sido agradable si CS50 implementaría en CS50.h y CS50.c para usted, pero aquí podemos ahora implementar esto nosotros mismos. Sin embargo, dos observaciones sobre algunos detalles clave. Uno-- ¿por qué me declaro int n, ¿cree que, en la línea 29 en vez de hacer esto aquí, que es más consistente con lo que hicimos la semana pasada? ¿Sí? Un buen pensamiento. Así que si tuviéramos que poner aquí, es como si nos mantener a declarar una y otra vez. Eso en sí mismo es no es problemática, per se, porque sólo tenemos el valor de una vez y luego vamos a conseguir uno nuevo de todos modos. Pero un buen pensamiento. ¿Sí? Cerrar. Así que ya he declarado en n línea 29 fuera del bucle, es accesible en todo toda esta función. Otros no funciona porque n es todavía dentro de estos rizado apoyos aquí. Tan-- seguro. Exactamente. Así que esto es aún más al punto. Si en lugar declaramos n derecho aquí en la línea 32, es problemático porque conjetura donde más que necesito para acceder a ella? En la línea 34, y la sencilla regla de oro es que sólo se puede utilizar una variable dentro de los más recientes llaves en el que se declaró. Desafortunadamente, la línea 34 es una línea demasiado tarde, porque yo ya he cerrado la llave de cierre en la línea 33 que corresponde a la corchete en la línea 30. Y lo que esta es una manera de decir que esta variable int tiene como alcance, por así decirlo, a sólo dentro de esas llaves. Simplemente no existe fuera de ellos. Así que de hecho, si hago esto mal, me deja guardar el código ya que es-- incorrectamente escrita. Déjenme seguir adelante y hacerlo hacer función-1, y el error notice--. El uso de identificador no declarado n en la línea 35, que está justo aquí. Y si nos desplazamos hasta Además, otro. El uso de no declarados identificador n en la línea 34. Así el compilador, Clang, es de notar que sólo no existe a pesar de que claramente que está ahí visualmente. Así que una solución simple está declarando allí. Ahora voy a desplazarme a la parte superior del archivo. Lo que salta a la vista como ser un poco diferente de las cosas que nos aguarda a la semana pasada? No sólo no tengo nombre, no sólo las hacen Tengo algunos agudos incluye encima de la tapa, Tengo algo que me llamar a un prototipo. Ahora que parece terriblemente similar a lo que que acabamos de ver hace un momento en la línea 27. Así que vamos a deducir a partir de una diferente mensaje de error por lo que he hecho esto. Déjame ir por delante y eliminar estas líneas existen. Y así, no sabemos nada de prototipo. Remake este archivo. Hacer una función. Y ahora, maldita sea, cuatro errores. Vamos a desplazarse hasta la primera. Declaración implícita de la función conseguir int positivo es válido en C99. C99 sólo significa el 1999 versión del lenguaje C, que es lo que estamos usando de hecho. Así que ¿qué significa esto? Bueno C-- y más concretamente C compilers-- son programas bastante tontas. Sólo saben lo que has les dijo, y eso es realidad temática de la semana pasada. El problema es que si me voy sobre la implementación de nombre aquí, y que yo llamo una función llamada GetPositiveInt aquí en la línea 20, que la función hace técnicamente no existiendo hasta que el compilador ve la línea 27. Desafortunadamente, el compilador es hacer las cosas arriba, abajo, izquierda, derecha, porque no ha visto la aplicación de GetPositiveInt, pero ve que tratar para usarlo aquí, que sólo va a bail-- gritara que con un error tal vez mensaje-- críptico, y en realidad no compilar el archivo. Así que una llamada prototipo hasta aquí es ciertamente redundante. Literalmente, me bajé aquí y he copiado y pegado esto, y lo pongo aquí. Vacío sería más adecuado, así que vamos a literalmente, copie y pegue esta vez. Yo, literalmente, copié y pegué. Realmente sólo como como una miga de pan. Una pequeña pista para el compilador. No sé lo que esto hace todavía, pero estoy prometiendo que que va a existir eventualmente. Y es por eso que este line-- en línea 16-- termina con un punto y coma. Es redundante por diseño. Sí? Si no vincula su biblioteca a el-- oh, buena pregunta. De Sharp incluye inclusiones de archivos de cabecera. Necesidad de ser-- debe casi siempre en la parte superior del archivo para un similar-- para exactamente la misma razón, sí. Debido a que en la norma io.h es literalmente una línea como esto, pero con la palabra printf, y con sus argumentos y su tipo de retorno. Y así, haciendo aguda incluyen hasta aquí, lo que estás haciendo, literalmente, está copiando y pegando el contenido de otra persona escribió encima de la tapa. De esta manera cluing su código en la hecho de que existen esas funciones. ¿Sí? Absolutamente. Así que un muy inteligente y correcta solución sería, ¿sabes qué? No sé lo que es un prototipo es, pero sé si entiendo que C es sólo mudo y replantea arriba a abajo. Bueno vamos a darle lo que quiere. Vamos a cortar ese código, pégalo arriba parte superior, y luego aprieta principal abajo. Esto también resolvería el problema. Pero puede muy fácilmente llegar a un escenario en el que la necesidad de llamar a B, y tal vez B llama de nuevo a A. Este es algo que se llama recursividad, y vamos a volver a eso. Y puede o no puede ser un buen cosa, pero definitivamente se puede romper esta solución. Y además, lo haría reclamar estilísticamente, especialmente cuando sus programas convertido en este largo y este largo, es simplemente muy práctico poner principal en la parte superior porque es la cosa más programadores van a preocuparse. Y lo que es un poco más limpio, podría decirse que, para hacerlo de la manera Originalmente hice con un prototipo incluso aunque se ve un poco redundante a primera vista. ¿Sí? Lo sentimos, se puede decir que más fuerte? Si cambia la ubicación de la la ejecución y el prototipo? Así que esa es una buena pregunta. Si vuelve a declarar esta abajo aquí, vamos a ver qué pasa. Así que si yo achaco aquí, que estás diciendo. Oh, lo siento. Louder? Incluso más fuerte. Ah, buena pregunta. ¿Sería invalidar la función? Ya sabes, después de todos estos años, me nunca han puesto un prototipo después. Así que vamos a hacer que la función-1 después de hacer eso. [Murmurando] DAVID J. MALAN: Oh, espera. Todavía tenemos que poner todo encima de la tapa. Así que vamos a hacer esto aquí, si estoy entender bien su pregunta. Estoy poniendo todo, incluyendo el prototipo anteriormente principal, pero me estoy poniendo el prototipo por debajo de la implementación. Así que si hago uno, me estoy poniendo volver un error-- sin usar variable n. Oh, no. Gracias. Vamos a ver, nos deshacemos de este. Eso es un error diferente, así que vamos a ignorar eso. Vamos realmente rehacer rápidamente esto. OK, así que no argumento de datos utilizado por el formato de cadena n-- oh, eso es porque Cambié a estos aquí. Muy bien, sabemos cuál es la respuesta va a-- bien, aquí vamos. Ah, gracias por el positivo. Muy bien, voy a arreglar este código después de-- ignorar este error en particular ya que este fue-- funciona es la respuesta. Así que no sobrescribe lo que acabas de hacer. Sospecho que el compilador está escrito de tal manera que hace caso omiso de su prototipo porque el cuerpo, por así decirlo, de la función ya tiene han aplicado más arriba. Tendría que consultar realidad el manual del compilador para entender si hay algún otro implicación, pero a primera vista simplemente por experimentar, probar, no parece haber ningún impacto. Buena pregunta. Así que vamos a seguir adelante ahora, moviéndose lejos de los efectos secundarios que son funciones que hacen algo así como visualmente en la pantalla con printf, pero no devuelven un valor. Y las funciones que tienen retorno valores como la que acabamos de ver algunas de. Ya vimos esta noción de alcance, y vamos a ver una y otra vez. Pero, por ahora, de nuevo, utilizar la regla de oro que una variable sólo se puede utilizar dentro de la más reciente inauguración y llaves cerradas como nos vio en ese ejemplo particular. Y como usted ha señalado, hay una ability-- que podría resolver algunos de estos problemas poniendo una variable a nivel mundial en la parte superior de un archivo. Sin embargo, en casi todos los casos nos fruncir el ceño a que, y de hecho no incluso ir en que la solución por ahora. Así que por ahora, la comida para llevar es que variables tienen esta noción de alcance. Pero ahora vamos a ver otra vía seca de realidad busca en algunos bastante interesante detalles de implementación. ¿Cómo podríamos representar la información. Y ya encontramos esta en la primera semana de la clase. En cuanto a los binarios, y recordándonos a nosotros mismos decimal. Pero recordar desde la semana pasada que C tiene diferentes tipos de datos y racimos más, pero los más útiles por ahora podría ser éstos. Un char, o carácter, lo que sucede ser un byte, o de ocho bits en total. Y eso quiere decir que el tamaño de un char es un solo byte. Un byte es de ocho bits, por lo que esto significa que podemos representar el número de caracteres. ¿Cuántas letras o símbolos del teclado si tenemos un byte u ocho bits. Piense de nuevo a la semana cero. Si usted tiene ocho bits, cuántos valores totales puede representar con patrones de ceros y unos? Uno-- más que eso. Así que 256 totales si empezar a contar desde cero. Así que si tienes ocho bits-- así que si nos tenido nuestras lámparas binarios hasta aquí de nuevo, podríamos convertir esas bombillas en y fuera en cualquiera de 256 patrones únicos. Ahora bien, esto es un poco problemático. No tanto por Inglés y lenguas romances, pero sin duda cuando se introduce, por ejemplo, las lenguas asiáticas, que tienen mucho más símbolos que como 26 letras del alfabeto. En realidad podríamos necesitar más de un byte. Y por suerte en los últimos años tiene la sociedad adoptado otras normas que utilizan más de un byte por cada carga. Pero, por ahora, en C, el valor por defecto es sólo un byte u ocho bits. Un entero, por su parte, es de cuatro bytes, también conocida como 32 bits. Lo que significa que lo que es el más grande posible número se puede representar con un int al parecer? Con un billón. Así que es de cuatro mil millones más o menos. 2 a la potencia 32 ª, si nos asumir sin números negativos y sólo tiene que utilizar todos positivos los números, que es de cuatro mil millones más o menos posibilidades. Un flotador, por su parte, es un tipo diferente de tipo de datos en C. Es todavía un número, pero es un número real. Algo con un punto decimal. Y resulta que C también utiliza cuatro bytes para representar los valores de coma flotante. Desafortunadamente cuántos flotante valores de los puntos hay en el mundo? ¿Cuántos números reales hay? Hay un infinito número, y para el caso hay un número infinito de números enteros. Así que ya estamos tipo de excavar un agujero de nosotros mismos aquí. Por lo cual al parecer en computers-- en menos los programas escritos en C en ellos-- sólo puede contar tan alto como cuatro mil millones más o menos, y valores de punto flotante sólo puede parecer tener cierta cantidad finita de precisión. Sólo los tantos dígitos después su punto decimal. Porque, por supuesto, si sólo tiene 32 bits, No sé cómo vamos a ir sobre representando numbers-- reales probablemente con diferentes tipos de patrones. Pero hay sin duda un finito número de tales patrones, así que aquí, también, esto es problemático. Ahora podemos evitar el problema ligeramente. Si usted no utiliza un flotador, podría usar un doble en C, que le da ocho bytes, que es la forma más patrones posibles de ceros y unos. Pero sigue siendo finito, que se va ser problemático si escribes software para los gráficos o de fantasía fórmulas matemáticas. Así que en realidad podría desear a contar hasta más grande que eso. A named-- largo long-- estúpidamente es también ocho bytes o 64 bits, y esto es el doble de tiempo como un int, y es para un valor entero largo. Diversión hecho-- si un int es de cuatro bytes, ¿Cuánto dura un tiempo en C normalmente? También cuatro bytes, pero una largo, largo es de ocho bytes, y esto es por razones históricas. Pero la comida para llevar ahora es sólo que los datos tiene a ser representado en un computer-- que es un dispositivo físico con la electricidad, generalmente está conduciendo esos ceros y ones-- con cantidades finitas de precisión. Entonces, ¿cuál es el problema entonces? Bueno, hay un problema de desbordamiento de enteros. No sólo en C, pero en los ordenadores en general. Por ejemplo, si esta es un byte merece una bit-- así que si esto es ocho bit-- todo de los cuales son el número uno. ¿Qué número es este que representa si asumimos es todos los valores positivos en binario? 255, y no es 256, porque el cero es el número más bajo. Así que 255 es el más alto uno, pero el problema se supone que quería incrementar esta variable que se utilizan ocho bits en total si quiero incrementarlo. Pues tan pronto como puedo añadir un uno a todos estos, usted tal vez pueda imaginar visually-- sólo como llevar el uno usando decimals-- algo va a fluir hacia la izquierda. Y de hecho, si añado el número una a este, lo que sucede en el sistema binario es que se desborda de nuevo a cero. Así que si sólo no utilizadas: un int, pero un solo byte para contar números enteros en un programa, por default-- tan pronto como sea se llega a 250, 251, 252, 253, 254, 255-- 0 viene después de 255, que probablemente no lo es un usuario que va a esperar. Ahora mientras que en punto flotante del mundo, usted también tiene un problema similar. No tanto con la mayor number-- aunque eso es todavía un problema. Pero con la cantidad de precisión que puede representar. Así que echemos un vistazo a este ejemplo aquí también de code-- fuente de hoy flotar-0.c. Y note que es un super sencillo programa que aparentemente deberían imprimir lo que de valor? ¿Qué se apuesta que esto va a imprimir a pesar de que hay un poco de nueva sintaxis aquí? Así que espero que 0,1. Así que el equivalente de un décimo porque estoy haciendo 1 dividido por 10. Estoy almacenando la respuesta en una variable llamada f. Esa variable es de tipo float, que es una palabra clave que acaba de proponer existía. No hemos visto esto antes, pero esto es una especie de una manera ordenada en printf para especificar el número de dígitos que quiero ver después de un punto decimal. Así que esta notación sólo significa que aquí es un marcador de posición. Es por una coma flotante valor, y oh, por cierto, muestran con el punto decimal con un número después del punto decimal. Así que ese es el número de dígitos significativos, por así decirlo, que es posible que desee. Así que déjame ir adelante y hacer hacer flotar-0, ./float-0, y al parecer 1 dividido por 10 es 0.0. Ahora ¿por qué es esto? Bueno una vez más, el equipo está tomando me literalmente, y he escrito 1 y he escrito 10, y tomar una conjetura lo es el tipo de datos asumido para los dos valores? Un int, es técnicamente algo un poco diferente. Es normalmente un largo, pero es en última instancia, un valor integral. No es un valor de coma flotante. ¿Qué quiere decir que si esto es un entero y esto es un int, el problema es que el ordenador no tiene la capacidad para almacenar hasta ese punto decimal. Así que cuando usted hace 1 dividido por 10 que usan números enteros tanto para el numerador y el denominador, la respuesta debe ser 0,1. Pero el computer-- porque esos son integers-- no sabe qué hacer con el 0,1. Entonces, ¿qué está haciendo con claridad? Es simplemente tirarlo a la basura, y lo que estoy viendo en última instancia, 0.0 es sólo porque yo insistí en que printf mostrarme un punto decimal. Pero el problema es que si usted dividir un entero por un entero, usted get-- por definición de C-- un entero. Y no va a hacer algo agradable y cómoda como alrededor de ella hasta el más cercano arriba o hacia abajo. Se va a truncar todo después del decimal. Así que sólo intuitivamente, lo que es probablemente una solución? ¿Cuál es la solución más simple aquí? ¿Sí? Exactamente. ¿Por qué no simplemente tratamos estos como valores de coma flotante efectivamente convirtiéndolos en carrozas o dobles. Y ahora si lo hago hacer carrozas-0, o si compilo carrozas-1, que es idéntica a lo que sólo se propuso. Y ahora que hago carrozas-0, ahora me sale mi 0.1. Ahora bien, esto es increíble. Pero ahora me voy a hacer algo un poco diferente. Tengo curiosidad por ver lo que es realmente pasando por debajo de la campana, y yo voy a imprimir esta a 28 cifras decimales. Quiero ver realmente 0.1000-- un infinite-- [Inaudible] 27 ceros después de que 0,1. Bueno vamos a ver si eso es lo que de hecho entiendo. Haga mismo archivo carrozas-0. ./floats-0. Vamos a acercar en la respuesta dramática. Durante todo este tiempo, has estado pensando 1 dividido por 10 es del 10%, o 0,1. Que no es. Al menos por lo que respecta a la de que se trate ordenador. Ahora qué-- bien, eso es completa mentira 1 dividido por 10 es de 0,1. Pero eso no es qué-- la comida para llevar hoy. Entonces, ¿por qué piensa el equipo, a diferencia de todos nosotros en la habitación, que 1 dividido por 10 es en realidad ese valor loco? ¿Cuál es la computadora haciendo parecer? Qué es eso? No es desborde, per se. Overflow es típicamente cuando en que se coloca alrededor de un valor. Es este problema de imprecisión en un valor de coma flotante en la que sólo tiene 32 o incluso 64 bits. Pero si hay un infinito número de numbers-- verdadera números con puntos decimales y los números de thereafter-- seguramente no puede representar a todos ellos. Así que el equipo ha dado nosotros la coincidencia más cercana al valor que puede representar usando ese muchos bits al valor realmente quiero, que es 0,1. Desafortunadamente, si usted empezar a hacer matemáticas, o iniciar la participación de este tipo de flotación valores de punto en importante programs-- software financiero, nada software-- militar donde la percepción es probablemente bastante importante. Y empezar a añadir números de este tipo, y comienzo ejecutar ese software con entradas muy grandes o por muchas horas o lotes de días o un montón de años, estos diminutos pequeños errores sin duda puede aumentar con el tiempo. Ahora como un aparte, si alguna vez te has visto Superman 3 o espacio de oficina y se puede recordar como estos chicos robaron una gran cantidad de dinero de su ordenador mediante el uso de valores de coma flotante y sumando la pequeña residuos, es de esperar que la película ahora tiene más sentido. Esto es lo que eran aludiendo a que en la película. El hecho de que la mayoría las empresas no se verían después de un cierto número de decimales, pero esos son fracciones de centavos. Así que empezar a sumarlos, usted comienza a hacer un montón de dinero en su cuenta bancaria. Así que eso es Espacio Oficina explicó. Ahora por desgracia más allá Espacio de oficina, hay son algunos legítimamente preocupante e impactos significativos de estos tipos de decisiones de diseño subyacentes, y de hecho una de las razones utilizamos C en el curso es para que usted realmente tiene esta planta hasta la comprensión de cómo funcionan las computadoras, cómo el software funciona y qué no dar nada por sentado. Y de hecho Desafortunadamente, incluso con que la comprensión fundamental, nosotros los humanos cometemos errores. Y lo que yo pensé en compartir es este video de ocho minuto aquí toma de un episodio de Maravillas Modernas, que es un espectáculo didáctico sobre cómo funcionan las cosas que pinta dos cuadros cuando un uso indebido y la comprensión de valores de coma flotante conducido a algunos significativa resultados desafortunados. Vamos a echar un vistazo. [REPRODUCCIÓN DE VÍDEO] -Nosotros Ahora volver a "Ingeniería Desastres "en Maravillas Modernas. Computadoras. Todos hemos llegado a aceptar la problemas a menudo frustrantes que conseguido con ellos-- error, virus, y glitches-- software para los precios pequeños a pagar por la comodidad. Pero en la alta tecnología y de alta velocidad aplicaciones militares y programas espaciales, el problema más pequeño posible magnificarse en el desastre. El 4 de junio de 1996, los científicos prepararon para lanzar un cohete Ariane 5 no tripulado. Transportaba científica satélites diseñados establecer con precisión cómo el Interactúa campo magnético de la Tierra con los vientos solares. El cohete fue construido para la Agencia Espacial Europea, y despegó desde sus instalaciones en la costa de la Guayana francesa. -Al Unos 37 segundos en el vuelo, primero algo notado iba mal. Que las boquillas se gira sobre un eje de manera que en realidad no debería. Alrededor de 40 segundos de vuelo, claramente el vehículo estaba en problemas, y fue entonces cuando hicieron la decisión de destruirlo. El oficial de seguridad de gama, con enormes tripas, presiona el botón y explotó el cohete antes de que pudiera convertirse en un peligro para la seguridad pública. : Este era la doncella viaje del Ariane 5, y su destrucción se llevó lugar debido a la falla integrado en el software del cohete. -El Problema en el Ariane fue que no era un número que requiere 64 bits para expresar, y querían convertir a un número de 16 bits. Asumieron que el número Nunca iba a ser muy grande. Que la mayoría de esos dígitos en el número de 64 bits eran ceros. Estaban equivocados. -El Incapacidad de uno programa de software para aceptar el tipo de número generado por otro estaba en la raíz de la falla. El desarrollo de software se había convertido en un muy costosa parte de la nueva tecnología. El cohete Ariane 4 tenía tenido mucho éxito. Así que gran parte del software creado para también fue utilizado en el Ariane 5. -El Problema básico era que el Ariane 5. Fue Más Rápido acelerado más rápido, y el software no había tomado en cuenta para eso. -El Destrucción del cohete fue un gran desastre financiero. Todo debido a un error de software minutos. Pero esta no fue la primera problemas de conversión de datos de tiempo había plagado la tecnología moderna de cohetes. -En 1991 con el inicio de la primera Guerra del Golfo, el misil Patriot experimentado una clase similar de un problema de conversión número. Y como resultado 28 gente-- 28 Soldiers-- estadounidenses murieron, y alrededor de un centenar más resultaron heridos. Cuando el Patriot, que se suponía para proteger contra Scuds entrantes, dejado de disparar un misil. -Cuando Irak invadió Kuwait, y América lanzado Tormenta del Desierto a principios de 1991, Baterías de misiles Patriot fueron desplegados para proteger a Arabia Saudita e Israel de los ataques iraquíes con misiles Scud. El Patriot es un medio-rango de Estados Unidos tierra-aire del sistema fabricado por la empresa Raytheon. -El Tamaño del Patriota interceptor itself-- es más o menos unos 20 pies de largo, y pesa alrededor de 2.000 libras. Y lleva una ojiva de alrededor, Creo que es más o menos 150 libras. Y la propia cabeza de combate es un explosivo de alta potencia, que tiene fragmentos a su alrededor. Así la carcasa de la ojiva es diseñado para actuar como un perdigón. -Los Misiles se llevan cuatro por contenedor, y son transportados por un semirremolque. -El Sistema Patriot antimisiles se remonta por lo menos 20 años. Originalmente fue diseñado como un misil de defensa aérea para derribar aviones enemigos. En la primera Guerra del Golfo cuando esa guerra se encendió, el Ejército quería utilizarlo para derribar misiles Scud, no aviones. La Fuerza Aérea Iraquí fue no tanto de un problema, pero el Ejército estaba preocupado acerca de los Scud. Y por lo que trataron de actualizar el Patriot. -Intercepting Un enemigo misil que viaja a Mach 5 que iba a ser un reto suficiente. Pero cuando el Patriot fue trasladado de urgencia en servicio, el Ejército no estaba al tanto de una modificación iraquí que hecho sus scuds casi imposible a ella. Qué sucedió es que los Scud fueron llegando eran inestables. Eran tambaleante. La razón de esto era los Iraqis-- a fin de obtener 600 kilometros a cabo de un rango missile-- 300 kilómetros tomó el peso de la ojiva frente, y la ojiva hecho más ligero. Así que ahora el Patriot de tratar de llegar en el Scud, y la mayoría de la tiempo-- la abrumadora mayoría de la tiempo-- sería simplemente salir volando por el Scud. -Una Los operadores del sistema Patriot se dio cuenta de la Patriot perdió su objetivo, detonaron ojiva del Patriota para evitar posibles bajas si se dejó caer al suelo. Eso fue lo que vieron la mayoría de la gente como grandes bolas de fuego en el cielo, e incomprendido como intercepciones de ojivas Scud. -Aunque En los cielos nocturnos, Patriots parecía estar destruyendo con éxito Scud, en Dhahran podría haber No se equivoquen acerca de su desempeño. Hay sistema de radar del Patriot perdido la pista de un Scud entrante y nunca puesto en marcha debido a un defecto de software. Fueron los israelíes que descubrió por primera vez que cuanto más tiempo el sistema estaba encendido, cuanto mayor es la discrepancia de tiempo se convirtió. Debido a un reloj incorporado en el ordenador del sistema. -About Dos semanas antes la tragedia en Dhahran, los israelíes informaron a el Departamento de Defensa que el sistema estaba perdiendo el tiempo. Después de aproximadamente ocho horas de funcionamiento, se dieron cuenta que el sistema se convierta notablemente menos precisa. El Departamento de Defensa respondió contando todas las baterías Patriot para no dejar los sistemas por un largo tiempo. Nunca dijeron lo que era mucho tiempo. 8 horas, 10 horas, mil horas. Nadie sabía. -El Batería Patriot destinado en el cuartel en Dhahran y su defectuoso interno reloj había estado en marcha durante más de 100 horas en la noche del 25 de febrero. -Es Rastreados tiempo con una precisión de alrededor de una décima de segundo. Ahora décimo de un segundo es un número interesante porque no se puede expresar exactamente en binario, que significa que no se puede expresar exactamente en cualquier computadora digital moderna. Es difícil de creer, pero utilizar esto como un ejemplo. Tomemos el número de un tercio. Una tercera no puede ser expresado en decimal exactamente. Una tercera es 0.333 pasando para el infinito. No hay manera de hacer eso con precisión absoluta en un decimal. Ese es exactamente el tipo de problema eso sucedió en el Patriot. Cuanto más tiempo el sistema funcionó, la se convirtió en el peor error de tiempo. -Después 100 horas de funcionamiento, el error en el tiempo era sólo alrededor de un tercio de un segundo. Pero en términos de focalización de un misil que viaja a Mach 5, que dio lugar a un seguimiento error de más de 600 metros. Sería un error fatal para los soldados en Dhahran. ¿Qué pasó se fue el lanzamiento de un Scud detectado por los satélites de alerta temprana, y conocieron un Scud venía en su dirección general. No sabían de dónde venía. Ahora era hasta el radar componente del sistema Patriot defender Dhahran localizar y pista del misil enemigo entrante. -El Radar era muy inteligente. En realidad, sería rastrear la posición de la Scud y luego predecir dónde probablemente sería la próxima vez que el radar envía un pulso a cabo. Eso se llamaba la puerta de distancia. -Entonces Una vez que el Patriot decide suficiente tiempo tiene pasado a volver atrás y comprobar la siguiente ubicación para este objeto detectado que se remonta. Así que cuando se volvió al mal lugar, a continuación, no ve ningún objeto. Y decide que no había objeto. Que había una detección falsa y cae la pista. -El Scud entrante desapareció desde la pantalla de radar, y segundos después, se estrelló contra el cuartel. El Scud mató a 28. Fue el último despedido durante la primera Guerra del Golfo. Trágicamente, el software actualizado llegaron al amanecer del día siguiente. La falla de software tenía sido fijado, cierre un capítulo en el atribulado la historia de los misiles Patriot. [FIN REPRODUCCIÓN DE VÍDEO] DAVID J. MALAN: Eso es todo por CS50. Nos vemos el miércoles. [REPRODUCCIÓN DE MÚSICA]