1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [REPRODUCCIÓN DE MÚSICA] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 DAVID J. MALAN: Muy bien. 5 00:00:12,660 --> 00:00:15,590 Esto es CS50, y esto es el comienzo de la semana dos. 6 00:00:15,590 --> 00:00:19,120 Empecemos, pues, hoy con un error. 7 00:00:19,120 --> 00:00:20,974 Un error, por supuesto, es un error en un programa, 8 00:00:20,974 --> 00:00:22,890 y obtendrá muy familiarizados con este concepto 9 00:00:22,890 --> 00:00:26,050 si nunca has programado antes. pset0 y ahora pset1. 10 00:00:26,050 --> 00:00:29,280 Pero vamos a considerar algo un poco simple al principio. 11 00:00:29,280 --> 00:00:32,189 Este programa aquí que yo tiró juntos por adelantado, 12 00:00:32,189 --> 00:00:37,280 y afirmo que esto debe imprimir 10 estrellas de la pantalla utilizando printf, 13 00:00:37,280 --> 00:00:41,020 pero está aparentemente Buggy en alguna manera. 14 00:00:41,020 --> 00:00:45,370 >> Dado que especificación que debe imprimir 10 estrellas, 15 00:00:45,370 --> 00:00:50,230 pero no es así, aparentemente, lo que usted reclamar es el error? 16 00:00:50,230 --> 00:00:52,004 ¿Sí? 17 00:00:52,004 --> 00:00:54,420 Así que es un fuera por un error, y ¿qué quieres decir con eso? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 Okay. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Excelente. 22 00:01:10,410 --> 00:01:13,930 Así que hemos especificado un valor inicial de cero para i, 23 00:01:13,930 --> 00:01:18,399 y hemos especificado un valor de n de 10, pero nosotros hemos usado menor o igual a. 24 00:01:18,399 --> 00:01:21,190 Y la razón de que esto es de dos personajes y no sólo un símbolo, 25 00:01:21,190 --> 00:01:22,630 como en un libro de matemáticas, es que usted no tiene 26 00:01:22,630 --> 00:01:24,880 una forma de expresar la un equivalente de caracteres. 27 00:01:24,880 --> 00:01:28,450 >> Así que eso significa menos de, pero si usted comienza a contar desde cero, 28 00:01:28,450 --> 00:01:31,690 pero se cuenta hasta el final a través de e igual a 10, 29 00:01:31,690 --> 00:01:34,170 usted es, por supuesto, va a contar 11 cosas en total. 30 00:01:34,170 --> 00:01:35,900 Y por lo que vamos a imprimir 11 estrellas. 31 00:01:35,900 --> 00:01:37,990 Entonces, ¿qué podría ser una solución para esto? 32 00:01:37,990 --> 00:01:39,970 ¿Sí? 33 00:01:39,970 --> 00:01:43,980 >> Así que ajustar el menos o igual a sólo ser menor que, 34 00:01:43,980 --> 00:01:46,250 y hay, reclamo, tal vez otra solución, también. 35 00:01:46,250 --> 00:01:47,210 ¿Qué puede ser que otra cosa que hacer? 36 00:01:47,210 --> 00:01:48,590 ¿Sí? 37 00:01:48,590 --> 00:01:53,660 >> Así que empieza a igualar a 1, y dejar el menor que o igual a. 38 00:01:53,660 --> 00:01:56,187 Y, francamente, me gustaría reclamar que, para un humano típico, 39 00:01:56,187 --> 00:01:57,770 Esto es probablemente más sencillo. 40 00:01:57,770 --> 00:02:00,280 Empieza a contar en 1 y contar hasta a 10. 41 00:02:00,280 --> 00:02:01,690 Básicamente hace lo que quiere decir. 42 00:02:01,690 --> 00:02:04,010 >> Pero la realidad es en programación, como hemos visto, 43 00:02:04,010 --> 00:02:07,598 los informáticos y programadores generalmente no empezar a contar desde cero. 44 00:02:07,598 --> 00:02:09,389 Y así está bien una vez te acostumbras a él. 45 00:02:09,389 --> 00:02:12,640 Su estado de salud general algo así como menos. 46 00:02:12,640 --> 00:02:14,910 Así que simplemente una lógica error que podríamos ahora 47 00:02:14,910 --> 00:02:17,990 fijar y finalmente volver a compilar esto y conseguir apenas 10. 48 00:02:17,990 --> 00:02:19,610 >> Bueno ¿qué tal este error aquí? 49 00:02:19,610 --> 00:02:24,200 Aquí, otra vez, reclamar que tengo un objetivo de imprimir 10 stars-- 50 00:02:24,200 --> 00:02:28,140 uno por línea esta vez, pero no es así. 51 00:02:28,140 --> 00:02:30,940 Antes de que nos proponemos lo la solución es, lo que hace este 52 00:02:30,940 --> 00:02:34,640 imprimo visualmente si yo fuera a compilar y ejecutar este programa qué te parece? 53 00:02:34,640 --> 00:02:35,140 ¿Sí? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Estrella. 56 00:02:38,860 --> 00:02:41,690 Así que todas las estrellas en el misma línea es lo que he oído, 57 00:02:41,690 --> 00:02:43,391 y luego el carácter de nueva línea. 58 00:02:43,391 --> 00:02:44,140 Así que vamos a tratar de eso. 59 00:02:44,140 --> 00:02:48,710 Así hacen con errores-1, entrar, y veo el comando clang 60 00:02:48,710 --> 00:02:50,090 que hablamos la última vez. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, y de hecho veo todas las 10 estrellas en la misma línea a pesar de que yo reclamo 62 00:02:55,180 --> 00:02:58,690 En mi especificación sólo un comentario en la cima el código que tenía la intención de hacer una por 63 00:02:58,690 --> 00:02:59,230 línea. 64 00:02:59,230 --> 00:03:00,580 Pero esto se ve bien. 65 00:03:00,580 --> 00:03:04,620 >> Ahora la línea 15 se ve como si estuviera la impresión de una estrella, y luego la línea 16 66 00:03:04,620 --> 00:03:06,620 parece como si yo fuera la impresión un carácter de nueva línea, 67 00:03:06,620 --> 00:03:09,560 y los dos están tan sangría Yo estoy dentro del bucle claramente. 68 00:03:09,560 --> 00:03:13,610 Así que no debería estar haciendo la estrella, nueva línea, estrella, nueva línea, estrella, nueva línea? 69 00:03:13,610 --> 00:03:14,110 Sí? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Sí, a diferencia de un lenguaje como Python, si usted está familiarizado, 72 00:03:21,240 --> 00:03:23,540 indentación no importa al equipo. 73 00:03:23,540 --> 00:03:25,280 Lo único que importa a la humana. 74 00:03:25,280 --> 00:03:29,860 Así las líneas mientras que aquí me he inventado 15 y 16-- que se ve hermosa, 75 00:03:29,860 --> 00:03:31,330 pero la computadora no le importa. 76 00:03:31,330 --> 00:03:34,640 El equipo se preocupa por realmente tener llaves 77 00:03:34,640 --> 00:03:36,310 alrededor de estas líneas de código. 78 00:03:36,310 --> 00:03:39,520 >> Así que es clear-- al igual que en Scratch-- que esas dos líneas de código 79 00:03:39,520 --> 00:03:40,450 debe ser ejecutado. 80 00:03:40,450 --> 00:03:44,390 Como uno de los rompecabezas amarillo de Scratch piezas una y otra vez y otra vez. 81 00:03:44,390 --> 00:03:50,920 >> Así que ahora si puedo volver a ejecutar este program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Tengo un error ahora. 83 00:03:51,770 --> 00:03:54,212 Lo que me olvidé de hacer? 84 00:03:54,212 --> 00:03:55,420 Sí, así que no me compilarlo. 85 00:03:55,420 --> 00:03:56,740 Así que con errores-2. 86 00:03:56,740 --> 00:03:59,840 No existe el archivo porque no lo hice realmente compilar la segunda versión. 87 00:03:59,840 --> 00:04:04,860 Así que ahora interesante no declarado no variable-- 2. 88 00:04:04,860 --> 00:04:05,510 Estamos haciendo 1. 89 00:04:05,510 --> 00:04:11,050 Hacer ./buggy-1-- buggy 1-- y ahora cada uno de ellos está en la misma línea. 90 00:04:11,050 --> 00:04:13,880 >> Ahora hay una excepción a esta supuesta afirmación mía 91 00:04:13,880 --> 00:04:15,520 que necesitáis estas llaves. 92 00:04:15,520 --> 00:04:20,160 Cuando es en realidad AUTORIZACIÓN-- si has notado en la sección o textbooks-- 93 00:04:20,160 --> 00:04:22,130 omitir las llaves? 94 00:04:22,130 --> 00:04:22,630 ¿Sí? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Exactamente. 97 00:04:26,870 --> 00:04:28,940 Cuando sólo hay una línea de código que 98 00:04:28,940 --> 00:04:32,830 quieren ser asociados con el bucle como en nuestro primer ejemplo. 99 00:04:32,830 --> 00:04:36,380 Es perfectamente legítimo omitir las llaves 100 00:04:36,380 --> 00:04:40,310 sólo como una especie de conveniencia del compilador para usted. 101 00:04:40,310 --> 00:04:40,810 ¿Sí? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Buena pregunta. 104 00:04:43,930 --> 00:04:45,500 ¿Se consideraría un error de estilo? 105 00:04:45,500 --> 00:04:49,340 Nos promote-- como en CS50 guía de estilo, la URL para el que 106 00:04:49,340 --> 00:04:51,926 está en pset1-- que siempre utilizar las llaves. 107 00:04:51,926 --> 00:04:53,550 Ciertamente, si usted es nuevo en la programación. 108 00:04:53,550 --> 00:04:56,800 La realidad es que no somos va a prohibir que 109 00:04:56,800 --> 00:04:58,680 de hacer estas comodidades. 110 00:04:58,680 --> 00:05:00,846 Pero si usted es sólo el en el ritmo de las cosas, 111 00:05:00,846 --> 00:05:04,020 absolutamente solo utilice siempre el rizado apoyos hasta que llegue la caída de ella. 112 00:05:04,020 --> 00:05:04,640 Buena pregunta. 113 00:05:04,640 --> 00:05:05,320 >> Bien. 114 00:05:05,320 --> 00:05:07,660 Así que entonces era un error. 115 00:05:07,660 --> 00:05:09,190 Al menos en algo bastante simple. 116 00:05:09,190 --> 00:05:11,260 Y sin embargo, usted podría pensar que esto es bastante rudimentaria, ¿verdad? 117 00:05:11,260 --> 00:05:13,635 Esta es una especie de la primera semana de ver el lenguaje 118 00:05:13,635 --> 00:05:14,890 como, ver sus errores en el mismo. 119 00:05:14,890 --> 00:05:17,250 Pero la realidad estos son realmente representativa 120 00:05:17,250 --> 00:05:20,310 de algunos problemas bastante aterradoras que pueden surgir en el mundo real. 121 00:05:20,310 --> 00:05:23,530 >> Así que algunos de ustedes pueden recordar si usted sigue de noticias de tecnología, 122 00:05:23,530 --> 00:05:25,740 o quizás incluso atrapados viento del este en febrero 123 00:05:25,740 --> 00:05:29,434 de este último año que Apple tenía cometido un pequeño error en ambas iOS, 124 00:05:29,434 --> 00:05:31,350 el sistema operativo en sus teléfonos, y también 125 00:05:31,350 --> 00:05:34,220 Mac OS, el sistema operativo en sus computadoras de escritorio y portátiles. 126 00:05:34,220 --> 00:05:36,480 Y viste titulares como este. 127 00:05:36,480 --> 00:05:41,120 Y a partir de entonces, Apple prometido corregir este error, 128 00:05:41,120 --> 00:05:45,950 y muy rápidamente hizo fijarlo en iOS, pero en última instancia, fija en Mac OS 129 00:05:45,950 --> 00:05:46,810 también. 130 00:05:46,810 --> 00:05:50,370 >> Ahora ninguno de estos titulares sola realidad revelar lo que era el problema de fondo, 131 00:05:50,370 --> 00:05:55,640 pero el error se reduce en última instancia a un error en SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 Y cuento largo, este es el software 133 00:05:57,390 --> 00:06:01,030 que nuestros navegadores y otros software utilizado para hacer qué? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Si dijera que SSL es involucrados, cada vez que 136 00:06:06,860 --> 00:06:13,920 visite una URL que comience con HTTPS, lo que entonces podría estar relacionado con SSL? 137 00:06:13,920 --> 00:06:14,580 Cifrado. 138 00:06:14,580 --> 00:06:16,470 Así que vamos a hablar de esto en los próximos días. 139 00:06:16,470 --> 00:06:18,750 Cifrado, el arte de la aleatorización información. 140 00:06:18,750 --> 00:06:22,200 >> Pero cuento largo, Apple Hace algún tiempo había cometido un error 141 00:06:22,200 --> 00:06:25,970 en la implementación de SSL, el software que implementa en última instancia 142 00:06:25,970 --> 00:06:30,120 URL como HTTPS o máximo conexiones allí también. 143 00:06:30,120 --> 00:06:32,850 El resultado de lo cual es que su conexiones podría potencialmente 144 00:06:32,850 --> 00:06:33,920 ser interceptado. 145 00:06:33,920 --> 00:06:37,130 Y sus conexiones eran no necesariamente cifrado 146 00:06:37,130 --> 00:06:40,350 si has tenido algún tipo malo en el medio usted y el sitio web de destino que 147 00:06:40,350 --> 00:06:42,170 sabía cómo tomar ventaja de esto. 148 00:06:42,170 --> 00:06:45,090 >> Ahora Apple finalmente publicó una solución para este último, 149 00:06:45,090 --> 00:06:46,920 y la descripción de su arreglo era esto. 150 00:06:46,920 --> 00:06:49,878 Transporte seguro no para validar la autenticidad de la conexión. 151 00:06:49,878 --> 00:06:52,920 El tema fue abordado por restauración que faltan etapas de validación. 152 00:06:52,920 --> 00:06:57,250 >> Así que esta es una explicación muy ondulado mano para simplemente decir que metimos la pata. 153 00:06:57,250 --> 00:07:00,920 Hay, literalmente, un línea de código que fue con errores 154 00:07:00,920 --> 00:07:05,130 en la implementación de SSL, y si usted va en línea y la búsqueda de este 155 00:07:05,130 --> 00:07:07,210 usted puede encontrar realmente el código fuente original. 156 00:07:07,210 --> 00:07:11,960 Por ejemplo, esta es una captura de pantalla sólo una parte de un archivo bastante grande, 157 00:07:11,960 --> 00:07:15,965 pero esta es una función aparentemente llamado SSL verificar intercambio de claves del servidor de suscripción. 158 00:07:15,965 --> 00:07:17,840 Y se necesita un montón de argumentos e insumos. 159 00:07:17,840 --> 00:07:20,298 Y no nos vamos a centrar demasiado en los pequeños detalles que hay, 160 00:07:20,298 --> 00:07:24,390 pero si usted se centra en el código dentro de ese superior function-- vamos 161 00:07:24,390 --> 00:07:25,590 zoom sobre eso. 162 00:07:25,590 --> 00:07:28,140 Es posible que ya sospechar lo que el error podría 163 00:07:28,140 --> 00:07:31,230 aún si no tienes ni idea en última instancia, lo que estamos viendo. 164 00:07:31,230 --> 00:07:35,924 Hay una especie de anomalía aquí, que es lo que? 165 00:07:35,924 --> 00:07:38,940 >> Sí, no me gusta la mirada de dos Goto falla. 166 00:07:38,940 --> 00:07:42,060 Francamente, no sé muy bien qué Goto FALLO significa, pero tener dos de ellos 167 00:07:42,060 --> 00:07:42,810 espalda con espalda. 168 00:07:42,810 --> 00:07:45,290 Eso como que me frota intelectualmente por el camino equivocado, 169 00:07:45,290 --> 00:07:48,910 y, de hecho, si nos acercamos en sólo esas líneas, esto es C. 170 00:07:48,910 --> 00:07:52,220 >> Así que una gran cantidad de código de Apple está a su vez está escrito en C, 171 00:07:52,220 --> 00:07:55,780 y esto al parecer es realmente equivalent-- 172 00:07:55,780 --> 00:07:59,060 no que bastante indentación versión, pero si reconoce el hecho de 173 00:07:59,060 --> 00:08:02,560 que no hay llaves, lo que Apple realmente escribió era el código que ve 174 00:08:02,560 --> 00:08:03,540 como este. 175 00:08:03,540 --> 00:08:07,080 Así que he has alejado y yo fija la indentación en el sentido 176 00:08:07,080 --> 00:08:10,690 que si no hay llaves, que segundo Goto fallan es en amarillo 177 00:08:10,690 --> 00:08:12,500 se va a ejecutar sin importar qué. 178 00:08:12,500 --> 00:08:15,540 No está asociado con la condición if por encima de ella. 179 00:08:15,540 --> 00:08:19,590 >> Así que incluso más, si no bastante entender lo que esto podría posiblemente 180 00:08:19,590 --> 00:08:23,230 estar haciendo, saber que cada uno de estos conditions-- cada una de estas líneas 181 00:08:23,230 --> 00:08:26,180 es un paso muy importante en el proceso de comprobar 182 00:08:26,180 --> 00:08:28,350 si sus datos son en realidad cifrada. 183 00:08:28,350 --> 00:08:31,710 Así saltarse uno de ellos pasos, no es la mejor idea. 184 00:08:31,710 --> 00:08:34,840 >> Pero porque tenemos esta Ir a segunda falla en amarillo, 185 00:08:34,840 --> 00:08:36,840 y porque una vez que tipo de estéticamente 186 00:08:36,840 --> 00:08:40,480 moverlo a la izquierda donde se lógicamente es en este momento, lo que 187 00:08:40,480 --> 00:08:43,230 Qué significa esto para la línea de código de abajo que Goto segundo 188 00:08:43,230 --> 00:08:46,480 fallas pensaría usted? 189 00:08:46,480 --> 00:08:48,860 Siempre va a ser omitido. 190 00:08:48,860 --> 00:08:52,100 Así gotos están generalmente mal visto por razones que no vamos a entrar en realmente, 191 00:08:52,100 --> 00:08:54,940 y de hecho en CS50 no tendemos para enseñar esta Goto declaración, 192 00:08:54,940 --> 00:08:58,130 pero se puede pensar en Goto fallar en el sentido de ir salto 193 00:08:58,130 --> 00:08:59,600 a alguna otra parte del código. 194 00:08:59,600 --> 00:09:03,120 >> En otras palabras saltar por encima esta última línea por completo, 195 00:09:03,120 --> 00:09:07,420 y así el resultado de esta estúpida simple error que se acaba 196 00:09:07,420 --> 00:09:10,330 resultado de alguien probablemente copiar y pegar uno también 197 00:09:10,330 --> 00:09:14,150 muchas veces era que todo el la seguridad de iOS y Mac OS 198 00:09:14,150 --> 00:09:18,240 era vulnerable a la interceptación por malos desde hace bastante tiempo. 199 00:09:18,240 --> 00:09:19,940 Hasta que Apple finalmente fija esto. 200 00:09:19,940 --> 00:09:23,100 >> Ahora bien, si algunos de ustedes son en realidad corriendo versiones antiguas de iOS o Mac OS, 201 00:09:23,100 --> 00:09:27,250 usted puede ir a gotofail.com que es un sitio web que alguien creó 202 00:09:27,250 --> 00:09:29,190 para determinar esencialmente mediante programación 203 00:09:29,190 --> 00:09:30,980 si el equipo sigue siendo vulnerable. 204 00:09:30,980 --> 00:09:33,600 Y, francamente, si lo es, es probablemente una buena idea 205 00:09:33,600 --> 00:09:36,870 para actualizar el teléfono o tu Mac en este momento. 206 00:09:36,870 --> 00:09:40,120 Pero allí, justo testimonio de cuán una apreciación de éstas nivel inferior 207 00:09:40,120 --> 00:09:42,400 detalles y bastante ideas simples puede realmente 208 00:09:42,400 --> 00:09:44,590 traducirse en decisiones y los problemas que 209 00:09:44,590 --> 00:09:47,320 affected-- en este caso-- millones de personas. 210 00:09:47,320 --> 00:09:49,107 >> Ahora una palabra sobre la administración. 211 00:09:49,107 --> 00:09:50,690 Sección comenzará el próximo domingo. 212 00:09:50,690 --> 00:09:53,360 Usted recibirá un correo electrónico por el fin de semana de la sección, y en ese momento 213 00:09:53,360 --> 00:09:55,290 el proceso de resección se iniciará si no tienes 214 00:09:55,290 --> 00:09:56,998 se dio cuenta de que ahora tienen algunos de los nuevos conflictos. 215 00:09:56,998 --> 00:10:00,180 Así que esto sucede todos los años, y nos se acomoda en los días por venir. 216 00:10:00,180 --> 00:10:02,430 >> Oficina horas-- hacen mantener un ojo en esta programación aquí. 217 00:10:02,430 --> 00:10:05,100 Cambia un poco esta semana, en particular el tiempo de inicio 218 00:10:05,100 --> 00:10:08,180 y la ubicación, así que consulte con que antes de dirigirse a las horas de oficina 219 00:10:08,180 --> 00:10:09,520 cualquiera de las siguientes cuatro noches. 220 00:10:09,520 --> 00:10:12,680 Y ahora unas palabras sobre la evaluación, especialmente en lo que te sumerjas en un problema 221 00:10:12,680 --> 00:10:14,350 establece uno y más allá. 222 00:10:14,350 --> 00:10:17,070 >> Así por la especificación, estos son por lo general 223 00:10:17,070 --> 00:10:20,360 los ejes a lo largo de la cual evaluamos su trabajo. 224 00:10:20,360 --> 00:10:23,170 El alcance se refiere a lo que medida sus implementos de código 225 00:10:23,170 --> 00:10:25,690 las características necesarias por nuestra especificación. 226 00:10:25,690 --> 00:10:28,290 En otras palabras, la cantidad de un conjunto pieza hizo morder fuera. 227 00:10:28,290 --> 00:10:30,440 ¿Hiciste un tercio de ella, un medio de ello, el 100% de la misma. 228 00:10:30,440 --> 00:10:33,000 Incluso si no es correcta, la cantidad que consiguió? 229 00:10:33,000 --> 00:10:35,290 Así que captura el nivel de esfuerzo y de la cantidad 230 00:10:35,290 --> 00:10:38,260 a la que poco alejado de la los problemas del conjunto de problemas. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- éste, a ¿En qué medida, es su código 232 00:10:40,690 --> 00:10:43,150 coherente con nuestra especificaciones y libre de errores. 233 00:10:43,150 --> 00:10:44,770 Así funciona correctamente? 234 00:10:44,770 --> 00:10:48,700 Si le damos un poco de entrada, lo hace nos dan el resultado que esperamos? 235 00:10:48,700 --> 00:10:52,570 Design-- ahora esta es la primera de particularmente los cualitativos, 236 00:10:52,570 --> 00:10:56,180 o los que requieren el juicio humano. 237 00:10:56,180 --> 00:10:59,690 Y, de hecho, es por eso que contamos con un personal de tantos compañeros de enseñanza y curso 238 00:10:59,690 --> 00:11:00,350 ayudantes. 239 00:11:00,350 --> 00:11:03,480 ¿Hasta qué punto es su código bien escrito? 240 00:11:03,480 --> 00:11:05,810 >> Y de nuevo se trata de una muy evaluación cualitativa 241 00:11:05,810 --> 00:11:09,100 que trabajará con usted en bidireccionalmente en las semanas por venir. 242 00:11:09,100 --> 00:11:12,060 Así que cuando usted no recibe solamente en los resultados numéricos, sino también 243 00:11:12,060 --> 00:11:16,682 unas partituras escritas, o retroalimentación mecanografiado, o comentarios por escrito en las palabras en inglés. 244 00:11:16,682 --> 00:11:19,640 Eso es lo que vamos a utilizar para conducir que hacia realmente escribir un mejor código. 245 00:11:19,640 --> 00:11:23,320 Y en la conferencia y en la sección, trataremos señalar salir-- tan a menudo como nos puedes-- 246 00:11:23,320 --> 00:11:26,420 lo que hace que un programa no sólo correcta y funcionalmente bueno, 247 00:11:26,420 --> 00:11:28,200 sino también bien diseñado. 248 00:11:28,200 --> 00:11:31,850 El más eficiente que podría ser, o incluso la más hermosa que puede ser. 249 00:11:31,850 --> 00:11:33,100 >> Lo que nos lleva al estilo. 250 00:11:33,100 --> 00:11:36,876 Estilo en última instancia es un juicio estético. 251 00:11:36,876 --> 00:11:38,750 ¿Elegiste bien nombres para las variables? 252 00:11:38,750 --> 00:11:40,330 ¿Te sangría su código correctamente? 253 00:11:40,330 --> 00:11:44,010 ¿Se ve bien, y por lo tanto, es fácil para otro ser humano 254 00:11:44,010 --> 00:11:46,550 leer su respectiva de su corrección. 255 00:11:46,550 --> 00:11:50,300 >> Ahora por lo general por el plan de estudios, anotamos estas cosas en una escala de cinco puntos. 256 00:11:50,300 --> 00:11:53,640 Y permítanme recalcar el punto que tres es de hecho bien. 257 00:11:53,640 --> 00:11:55,550 Muy rápidamente hacer amigos empezar a hacer aritmética. 258 00:11:55,550 --> 00:11:58,133 Cuando llegan a tres de cada cinco en la corrección de algún conjunto de procesadores 259 00:11:58,133 --> 00:12:02,040 y piensan maldita, me va a 60% que es esencialmente un D o un E. 260 00:12:02,040 --> 00:12:03,980 >> Esa no es la forma en que pensar en estos números. 261 00:12:03,980 --> 00:12:06,880 A tres es en verdad bueno, y lo que en general, se puede esperar en el comienzo 262 00:12:06,880 --> 00:12:09,820 del término es que si usted está recibiendo un montón de three's-- tal vez un par 263 00:12:09,820 --> 00:12:12,540 de ferias, un par de fours-- o un par de dos en dos, un par de fours-- 264 00:12:12,540 --> 00:12:13,748 eso es un buen lugar para empezar. 265 00:12:13,748 --> 00:12:16,320 Y mientras vemos un trayectoria ascendente en el tiempo, 266 00:12:16,320 --> 00:12:18,540 usted está en un buen lugar. 267 00:12:18,540 --> 00:12:20,752 >> La fórmula que utilizamos para cosas de peso es esencialmente 268 00:12:20,752 --> 00:12:22,710 esto por el plan de estudios, que simplemente significa que tenemos 269 00:12:22,710 --> 00:12:24,750 dar más peso a la corrección. 270 00:12:24,750 --> 00:12:27,930 Debido a que es muy a menudo la corrección que lleva la mayor parte del tiempo. 271 00:12:27,930 --> 00:12:28,760 Confía en mí ahora. 272 00:12:28,760 --> 00:12:31,190 Usted encontrar-- al menos en una pset-- que 273 00:12:31,190 --> 00:12:36,790 pasar el 90% de su tiempo trabajando en 10% del problema. 274 00:12:36,790 --> 00:12:39,320 >> Y todo tipo de obras a excepción de uno o dos errores, 275 00:12:39,320 --> 00:12:41,570 y esos son los errores que mantenerte despierto hasta tarde por la noche. 276 00:12:41,570 --> 00:12:43,380 Esos son los que suerte de escapar. 277 00:12:43,380 --> 00:12:45,560 Pero después de dormir en ella, o asistir a las horas de oficina 278 00:12:45,560 --> 00:12:48,844 o hacer preguntas en línea, se cuando se llega a ese objetivo 100%, 279 00:12:48,844 --> 00:12:50,760 y es por eso que el peso corrección más. 280 00:12:50,760 --> 00:12:54,102 Diseñar un poco menos, y estilo un poco menos que eso. 281 00:12:54,102 --> 00:12:56,060 Pero hay que tener en estilo mente-- es tal vez la más fácil 282 00:12:56,060 --> 00:12:58,890 de éstos a morder según la guía de estilo. 283 00:12:58,890 --> 00:13:01,580 >> Y ahora, una más grave observar en la honestidad académica. 284 00:13:01,580 --> 00:13:05,000 CS50 tiene la triste distinción de siendo el mayor productor de la Junta Ad 285 00:13:05,000 --> 00:13:07,330 casos casi todos los años históricamente. 286 00:13:07,330 --> 00:13:11,012 Esto no se debe a que los estudiantes hacen trampa en CS50 más que cualquier otra clase, 287 00:13:11,012 --> 00:13:13,720 pero debido a la naturaleza de la obra, el hecho de que es electrónico, 288 00:13:13,720 --> 00:13:16,636 el hecho de que lo buscamos, y el hecho de que somos los informáticos, 289 00:13:16,636 --> 00:13:20,570 Puedo decir que estamos por desgracia muy bueno en lo detecte. 290 00:13:20,570 --> 00:13:22,710 >> Así que ¿qué significa esto en términos reales? 291 00:13:22,710 --> 00:13:24,820 Así que, por el plan de estudios, la filosofía del curso 292 00:13:24,820 --> 00:13:28,090 realmente no se reducen a ser razonable. 293 00:13:28,090 --> 00:13:31,684 Hay esta línea entre haciendo el trabajo de uno por su cuenta 294 00:13:31,684 --> 00:13:34,100 y conseguir un poco de ayuda razonable de un amigo, 295 00:13:34,100 --> 00:13:38,020 y de plano hacer ese trabajo para su amigo, o enviándole su código 296 00:13:38,020 --> 00:13:41,080 de modo que él o ella puede simplemente tomar o pedir prestado a la derecha. 297 00:13:41,080 --> 00:13:43,580 Y que cruza la línea que dibujan en la clase. 298 00:13:43,580 --> 00:13:45,410 >> Vea, el plan de estudios en última instancia, para las líneas 299 00:13:45,410 --> 00:13:48,209 que dibujamos como razonable y el comportamiento irracional, 300 00:13:48,209 --> 00:13:50,000 pero lo que realmente hace hervir abajo a la esencia 301 00:13:50,000 --> 00:13:53,980 de su trabajo que necesitan ser tu propio al final. 302 00:13:53,980 --> 00:13:56,230 Ahora, con esto dicho, hay una heurística. 303 00:13:56,230 --> 00:13:58,980 Porque como usted podría imagine-- de las horas de oficina y los efectos visuales 304 00:13:58,980 --> 00:14:01,060 y los vídeos que hemos muestra CS50 así far-- 305 00:14:01,060 --> 00:14:04,530 es de hecho la intención de ser lo más colaborativa y como cooperativa y como sociales 306 00:14:04,530 --> 00:14:06,450 como sea posible. 307 00:14:06,450 --> 00:14:08,570 Como colaborativo como es riguroso. 308 00:14:08,570 --> 00:14:11,314 >> Pero con esto, dijo, la heurística, como se verá en el programa de estudios, 309 00:14:11,314 --> 00:14:12,980 es que cuando usted está teniendo algún problema. 310 00:14:12,980 --> 00:14:16,470 Usted tiene algunos errores en el código que no puede resolver, es razonable para usted 311 00:14:16,470 --> 00:14:18,039 para mostrar su código a otra persona. 312 00:14:18,039 --> 00:14:21,080 Un amigo incluso en la clase, un amigo sentado a tu lado en horas de oficina, 313 00:14:21,080 --> 00:14:22,680 o un miembro del personal. 314 00:14:22,680 --> 00:14:25,810 Pero ellos no pueden mostrar su código para usted. 315 00:14:25,810 --> 00:14:27,710 >> En otras palabras, una responder a su pregunta-- 316 00:14:27,710 --> 00:14:29,940 Necesito ayuda-- ¿no oh, aquí está mi código. 317 00:14:29,940 --> 00:14:32,440 Echa un vistazo a esto y deducir de ella lo que quieras. 318 00:14:32,440 --> 00:14:34,580 Ahora, por supuesto, no hay una manera clara al juego 319 00:14:34,580 --> 00:14:37,760 este sistema por el que te voy a mostrar mi código antes de tener una pregunta. 320 00:14:37,760 --> 00:14:40,150 Usted me muestra mi su código antes de someterse a una pregunta. 321 00:14:40,150 --> 00:14:45,870 Pero ver el programa de nuevo para el detalles más finos de donde esta línea es. 322 00:14:45,870 --> 00:14:50,606 >> Sólo para pintar ahora la imagen y compartir lo más transparente posible 323 00:14:50,606 --> 00:14:53,480 donde estamos en los últimos años, este es el número de casos de la Junta Ad 324 00:14:53,480 --> 00:14:56,260 CS50 que ha tenido más los últimos siete años. 325 00:14:56,260 --> 00:14:58,717 Con 14 casos este último otoño. 326 00:14:58,717 --> 00:15:01,300 En cuanto a los estudiantes involucrados, era 20 algunos estudiantes impares 327 00:15:01,300 --> 00:15:02,490 en el otoño pasado. 328 00:15:02,490 --> 00:15:05,670 Hubo un máximo de 33 estudiantes hace algunos años. 329 00:15:05,670 --> 00:15:08,830 Muchos de los cuales son por desgracia ya no está aquí en el campus. 330 00:15:08,830 --> 00:15:13,100 >> Los estudiantes que participan como porcentaje de la clase ha oscilado históricamente entre el 0% 331 00:15:13,100 --> 00:15:17,300 al 5,3%, que es sólo para decir esto es cada año un reto. 332 00:15:17,300 --> 00:15:20,390 Y hacia ese fin, lo que queremos hacer es transmitir una 333 00:15:20,390 --> 00:15:24,310 que dd-- sólo FYI-- comparar al un ser justos con aquellos estudiantes que 334 00:15:24,310 --> 00:15:26,520 siguiendo la línea en consecuencia. 335 00:15:26,520 --> 00:15:29,620 Hacemos comparar todos los actuales presentaciones en contra de todas las misiones anteriores 336 00:15:29,620 --> 00:15:30,840 desde el pasado muchos años. 337 00:15:30,840 --> 00:15:33,620 >> Sabemos también cómo Google alrededor y encontrar repositorios de código 338 00:15:33,620 --> 00:15:36,360 , foros de discusión en línea , sitios de trabajo en línea en línea. 339 00:15:36,360 --> 00:15:41,580 Si un estudiante se encuentra, podemos sin duda encontrará todo lo que lamentablemente hacemos. 340 00:15:41,580 --> 00:15:45,330 Así que lo que usted verá en el plan de estudios aunque es esta cláusula pesar. 341 00:15:45,330 --> 00:15:47,500 Yo sabe apreciar, y todos nos tiene 342 00:15:47,500 --> 00:15:50,870 personal de haber hecho el curso como esto, o esta en sí mismo uno con el tiempo, 343 00:15:50,870 --> 00:15:53,997 sin duda saben lo que se siente cuando la vida se interpone en el camino cuando se tiene 344 00:15:53,997 --> 00:15:56,080 alguna noche tarde deadline-- no sólo en esta clase, 345 00:15:56,080 --> 00:15:58,660 pero otro-- cuando estás completamente agotado, estresado, 346 00:15:58,660 --> 00:16:00,659 tener un número excesivo de otras cosas que hacer. 347 00:16:00,659 --> 00:16:03,660 Va a hacer que en algún momento de la vida sin duda un mal, tal vez tarde 348 00:16:03,660 --> 00:16:04,620 decisión noche. 349 00:16:04,620 --> 00:16:06,520 >> Así que por el plan de estudios, hay esta cláusula, 350 00:16:06,520 --> 00:16:10,629 de manera que si dentro de las 72 horas de hacer alguna mala decisión, usted es dueño hasta que 351 00:16:10,629 --> 00:16:12,670 y llegar a mí y uno de los jefes del curso 352 00:16:12,670 --> 00:16:14,300 y vamos a tener una conversación. 353 00:16:14,300 --> 00:16:16,220 Nosotros nos encargaremos de las cosas internamente con la esperanza 354 00:16:16,220 --> 00:16:18,770 de que se convierta en más de un momento de enseñanza o lección de vida, 355 00:16:18,770 --> 00:16:22,120 y no algo con ramificaciones particularmente drásticas 356 00:16:22,120 --> 00:16:24,570 como se puede ver en estos gráficos aquí. 357 00:16:24,570 --> 00:16:26,540 >> Así que eso es un tono muy serio. 358 00:16:26,540 --> 00:16:29,960 Hagamos una pausa para unos pocos segundos para romper la tensión. 359 00:16:29,960 --> 00:16:34,442 >> [REPRODUCCIÓN DE MÚSICA] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> DAVID J. MALAN: Muy bien, así que ¿cómo es que para un segue? 362 00:17:20,250 --> 00:17:22,059 Para los temas principales de la actualidad. 363 00:17:22,059 --> 00:17:23,859 La primera de las cuales es la abstracción. 364 00:17:23,859 --> 00:17:26,900 Otro de los que va a ser la representación de los datos, que francamente 365 00:17:26,900 --> 00:17:31,640 es una manera muy seco de decir cómo podemos ir sobre la solución de problemas y el pensamiento 366 00:17:31,640 --> 00:17:33,250 sobre la resolución de problemas? 367 00:17:33,250 --> 00:17:37,285 Así que has visto en Scratch, y usted tiene visto quizá ya en pset1 con C 368 00:17:37,285 --> 00:17:39,930 que no sólo se puede utilizar funciones, como printf, 369 00:17:39,930 --> 00:17:42,770 que otras personas en año pasado escribió para ti. 370 00:17:42,770 --> 00:17:45,340 También puede escribir sus propias funciones. 371 00:17:45,340 --> 00:17:48,440 >> Y aunque puede que no tenga hecho esto en C, y francamente en pset1 372 00:17:48,440 --> 00:17:51,866 usted realmente no necesita para escribir su propia función porque el problema-- 373 00:17:51,866 --> 00:17:53,990 aunque tal vez de enormes proporciones en primero glance-- verás 374 00:17:53,990 --> 00:17:57,910 en última instancia, puede ser resuelto con no todos los que muchas líneas de código. 375 00:17:57,910 --> 00:18:01,140 Pero dicho esto, en términos de escribir su propia función, 376 00:18:01,140 --> 00:18:03,570 darse cuenta de que C da que esta capacidad. 377 00:18:03,570 --> 00:18:06,940 >> Yo voy a ir en el código fuente actual, que ya está disponible en línea, 378 00:18:06,940 --> 00:18:10,900 y yo voy a seguir adelante y abierto un programa que se llama función 0.C, 379 00:18:10,900 --> 00:18:14,620 y en función de cero vamos a ver algunas cosas. 380 00:18:14,620 --> 00:18:19,160 En las primeras líneas 18 a través de 23 es mi función principal. 381 00:18:19,160 --> 00:18:22,414 Y ahora que estamos empezando a leer código que no estamos escribiendo sobre la marcha, 382 00:18:22,414 --> 00:18:25,080 sino que he escrito con antelación o que en un conjunto de problemas 383 00:18:25,080 --> 00:18:27,910 podría recibir con ha escrito con antelación. 384 00:18:27,910 --> 00:18:30,040 Una buena manera de empezar lectura de código de otra persona 385 00:18:30,040 --> 00:18:31,400 es buscar la función principal. 386 00:18:31,400 --> 00:18:34,420 Averiguar donde esa entrada punto es de ejecutar el programa, 387 00:18:34,420 --> 00:18:36,580 y luego seguir lógicamente a partir de ahí. 388 00:18:36,580 --> 00:18:40,190 >> Por lo que este programa aparentemente impresiones su nombre seguido de dos puntos. 389 00:18:40,190 --> 00:18:42,490 A continuación, utilizamos GetString de la biblioteca CS50 390 00:18:42,490 --> 00:18:46,050 para obtener una cadena, o una palabra o frase desde el usuario en el teclado. 391 00:18:46,050 --> 00:18:48,390 Y luego está este Lo printNombre aquí--. 392 00:18:48,390 --> 00:18:51,420 >> Ahora no es un printNombre función que viene con C. 393 00:18:51,420 --> 00:18:52,970 No está en io.h. estándar 394 00:18:52,970 --> 00:18:55,570 No está en CS50.h. 395 00:18:55,570 --> 00:18:57,880 Es más bien en el mismo archivo. 396 00:18:57,880 --> 00:19:01,000 Aviso si me desplazo hacia abajo unas líneas bit-- 25 a 27-- 397 00:19:01,000 --> 00:19:05,330 es sólo una manera bonita de comentar su código mediante las estrellas y las barras. 398 00:19:05,330 --> 00:19:07,320 Esta es una de varias líneas comentario, y esto es sólo 399 00:19:07,320 --> 00:19:10,570 mi descripción en azul de lo que hace esta función. 400 00:19:10,570 --> 00:19:14,530 >> Debido a que en las líneas 28 a 31, He escrito una función super simple 401 00:19:14,530 --> 00:19:16,280 cuyo nombre es printNombre. 402 00:19:16,280 --> 00:19:19,560 Se necesita cuántos argumentos le dirías? 403 00:19:19,560 --> 00:19:25,120 Así que uno argument-- porque hay una argumento que aparece dentro de los paréntesis. 404 00:19:25,120 --> 00:19:27,000 El tipo de la que es String. 405 00:19:27,000 --> 00:19:30,240 ¿Qué quiere decir printNombre es como esta caja de negro 406 00:19:30,240 --> 00:19:32,910 o función que toma como entrada una cadena. 407 00:19:32,910 --> 00:19:35,730 >> Y el nombre de esa cadena convenientemente estará Nombre. 408 00:19:35,730 --> 00:19:37,840 No S, no N, pero su nombre. 409 00:19:37,840 --> 00:19:41,090 Así que, ¿qué hace printNombre? 410 00:19:41,090 --> 00:19:42,210 Es agradable simple. 411 00:19:42,210 --> 00:19:45,390 Del mismo modo que una línea de código para el printf, pero al parecer 412 00:19:45,390 --> 00:19:47,950 imprime "Hola," fulano de tal. 413 00:19:47,950 --> 00:19:50,070 Cuando el tal y tal viene del argumento. 414 00:19:50,070 --> 00:19:52,300 >> Ahora bien, esto no es una gran innovación aquí. 415 00:19:52,300 --> 00:19:56,710 Realmente, me he tomado un programa que pudiera haber sido escrita con una línea de código 416 00:19:56,710 --> 00:20:00,190 poniendo esto aquí, y lo cambió a algo 417 00:20:00,190 --> 00:20:04,920 que involucra a unos seis o siete años más o menos líneas de código todo el camino hasta aquí. 418 00:20:04,920 --> 00:20:08,190 >> Pero es la práctica de una principio conocido como abstracción. 419 00:20:08,190 --> 00:20:12,550 Tipo de encapsular dentro de un nuevo función que tiene un nombre, y mejor 420 00:20:12,550 --> 00:20:14,590 pero ese nombre literalmente dice lo que hace. 421 00:20:14,590 --> 00:20:16,880 Quiero decir printf-- eso no es particularmente descriptiva. 422 00:20:16,880 --> 00:20:18,932 Si quiero crear un pieza del rompecabezas, o si 423 00:20:18,932 --> 00:20:21,140 que desee crear una función que imprime el nombre de alguien, 424 00:20:21,140 --> 00:20:23,230 la belleza de hacer esto es que lo que pueda realmente 425 00:20:23,230 --> 00:20:27,170 que la función de dar un nombre que describe lo que hace. 426 00:20:27,170 --> 00:20:29,844 >> Ahora que se necesita en una entrada que He llamado arbitrariamente nombre, 427 00:20:29,844 --> 00:20:32,760 pero eso también es maravillosamente descriptivo en lugar de ser un poco más 428 00:20:32,760 --> 00:20:36,140 genérico como S. Y vacío, por ahora, sólo significa 429 00:20:36,140 --> 00:20:38,330 que esta función no me devolver nada. 430 00:20:38,330 --> 00:20:41,127 No es como que GetString literalmente me entrega vuelta una cadena 431 00:20:41,127 --> 00:20:43,960 como lo hicimos con los pedazos de papel con sus compañeros de clase la semana pasada, 432 00:20:43,960 --> 00:20:45,990 sino más bien que sólo tiene un efecto secundario. 433 00:20:45,990 --> 00:20:48,080 Se imprime algo a la pantalla. 434 00:20:48,080 --> 00:20:53,880 >> Así que al final del día, si yo no hacer la función-0, ./function-0, 435 00:20:53,880 --> 00:20:55,450 veremos que pide mi nombre. 436 00:20:55,450 --> 00:20:58,150 Escribo David, y los tipos a mi nombre. 437 00:20:58,150 --> 00:21:01,080 Si lo hago de nuevo con Rob, que va a decir "Hola, Rob." 438 00:21:01,080 --> 00:21:04,280 Así que una idea simple, pero quizás extrapolar de esta mentalmente 439 00:21:04,280 --> 00:21:06,750 que a medida que sus programas obtienen un poco más complicado, 440 00:21:06,750 --> 00:21:10,290 y desea escribir un trozo de código y llamadas que code-- invoke 441 00:21:10,290 --> 00:21:13,270 que code-- por algunos descriptiva nombrar como printNombre, 442 00:21:13,270 --> 00:21:15,600 C sí nos permitirse esta capacidad. 443 00:21:15,600 --> 00:21:17,660 >> Aquí hay otro ejemplo simple. 444 00:21:17,660 --> 00:21:22,940 Por ejemplo, si abro una presentar de llamada hoy return.c, 445 00:21:22,940 --> 00:21:24,270 cuenta de lo que he hecho aquí. 446 00:21:24,270 --> 00:21:26,330 La mayor parte de esta función principal es printf. 447 00:21:26,330 --> 00:21:30,360 La primera vez que inicializar arbitrariamente un variable llamada x al número 2. 448 00:21:30,360 --> 00:21:34,110 Luego imprimo "x es ahora % I "pasar en el valor de x. 449 00:21:34,110 --> 00:21:35,500 Así que sólo estoy diciendo lo que es. 450 00:21:35,500 --> 00:21:37,208 >> Ahora estoy solo con audacia afirmando con printf. 451 00:21:37,208 --> 00:21:42,050 Estoy cubicación ese valor x, y estoy hacerlo llamando a una función 452 00:21:42,050 --> 00:21:45,590 llamado paso del cubo en x como argumento, 453 00:21:45,590 --> 00:21:49,300 y luego guardar la salida en la propia variable, x. 454 00:21:49,300 --> 00:21:51,340 Así que estoy golpeando fuertemente el valor de x. 455 00:21:51,340 --> 00:21:53,380 Estoy anulando la valor de x con lo 456 00:21:53,380 --> 00:21:56,510 el resultado de llamar esta función es cubo. 457 00:21:56,510 --> 00:21:59,530 Y luego me imprimo algunos material esponjoso aquí diciendo lo que hice. 458 00:21:59,530 --> 00:22:01,600 >> Entonces, ¿qué es, entonces, el cubo? 459 00:22:01,600 --> 00:22:03,510 Note lo que es fundamentalmente diferente aquí. 460 00:22:03,510 --> 00:22:05,540 He dado la función un nombre como antes. 461 00:22:05,540 --> 00:22:08,270 He especificado un nombre para una discusión. 462 00:22:08,270 --> 00:22:11,650 Esta vez se llama n en lugar del nombre, pero yo podría llamarlo lo que quiera. 463 00:22:11,650 --> 00:22:12,650 Pero esto es diferente. 464 00:22:12,650 --> 00:22:14,080 Esta cosa de la izquierda. 465 00:22:14,080 --> 00:22:16,290 Anteriormente, era lo que la palabra clave? 466 00:22:16,290 --> 00:22:16,870 Chicos. 467 00:22:16,870 --> 00:22:18,580 Ahora es obviamente int. 468 00:22:18,580 --> 00:22:20,630 >> Entonces, ¿qué tal la quita? 469 00:22:20,630 --> 00:22:24,090 Mientras que significa void especie de la nada, y ese era el caso. 470 00:22:24,090 --> 00:22:25,970 PrintNombre nada volvió. 471 00:22:25,970 --> 00:22:27,942 Se hizo algo, pero no me devolverán 472 00:22:27,942 --> 00:22:30,650 algo que podría poner en el lado izquierdo de un signo igual 473 00:22:30,650 --> 00:22:32,460 como lo he hecho aquí en la línea 22. 474 00:22:32,460 --> 00:22:36,780 >> Así que si digo que en la línea 30, ¿qué es eso, probablemente, lo que implica 475 00:22:36,780 --> 00:22:38,610 acerca de lo que el cubo tiene para mí? 476 00:22:38,610 --> 00:22:41,110 ¿Sí? 477 00:22:41,110 --> 00:22:42,310 Se devuelve un entero. 478 00:22:42,310 --> 00:22:44,590 Así que me da la espalda, para ejemplo, un trozo de papel 479 00:22:44,590 --> 00:22:46,580 sobre el que ha escrito la respuesta. 480 00:22:46,580 --> 00:22:50,130 2 cubos, o 3 cubitos, o 4 cubed-- lo pasé en, 481 00:22:50,130 --> 00:22:51,540 y ¿cómo puedo implementar esto? 482 00:22:51,540 --> 00:22:54,810 Bueno, acaba de n veces n veces n es cómo puede ser que cubicar un valor. 483 00:22:54,810 --> 00:22:57,110 Así que de nuevo, super simple idea, pero demostrativo 484 00:22:57,110 --> 00:23:00,100 ahora cómo podemos escribir funciones que en realidad nos hizo volver 485 00:23:00,100 --> 00:23:02,380 valores que puedan ser de su interés. 486 00:23:02,380 --> 00:23:05,740 >> Veamos un último ejemplo aquí se llama función de uno. 487 00:23:05,740 --> 00:23:08,530 En este ejemplo, se inicia para obtener más convincente. 488 00:23:08,530 --> 00:23:12,400 Así, en función de uno, esta aviso program-- última instancia 489 00:23:12,400 --> 00:23:14,920 llama a una función llamada GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt no es un función en la biblioteca CS50, 491 00:23:17,800 --> 00:23:20,400 pero decidimos que le gustaría que exista. 492 00:23:20,400 --> 00:23:24,550 >> Así que si nos desplazamos hacia abajo más adelante en el archivo, Noto cómo me fui sobre la implementación 493 00:23:24,550 --> 00:23:26,560 conseguir int positivo, y yo dicen que es más convincente 494 00:23:26,560 --> 00:23:28,992 porque este es un decente número de líneas de código. 495 00:23:28,992 --> 00:23:30,700 No es sólo un tonto programita juguete. 496 00:23:30,700 --> 00:23:33,870 En realidad tiene algo de comprobación de errores y hacer algo más útil. 497 00:23:33,870 --> 00:23:38,470 >> Así que si no has visto el tutorial videos que hemos incrustado en pset1, 498 00:23:38,470 --> 00:23:42,350 sabe que este es un tipo de bucle en C, similar en espíritu 499 00:23:42,350 --> 00:23:44,270 para el tipo de cosas de Scratch puede hacer. 500 00:23:44,270 --> 00:23:46,320 ¿Y dice hacerlo. 501 00:23:46,320 --> 00:23:47,500 Imprima esto. 502 00:23:47,500 --> 00:23:51,860 Luego seguir adelante y obtener n-- conseguir un int y almacenarlo en n, 503 00:23:51,860 --> 00:23:55,760 y seguir haciendo esto una y otra vez y de nuevo, siempre y cuando n es menor que uno. 504 00:23:55,760 --> 00:23:58,720 >> Así que n va a ser inferior a un sólo si el humano no está cooperando. 505 00:23:58,720 --> 00:24:01,980 Si él o ella está escribiendo en 0 o -1 o -50, 506 00:24:01,980 --> 00:24:04,790 este bucle se va a mantener la ejecución de una y otra vez. 507 00:24:04,790 --> 00:24:07,549 Y en última instancia, noto, me devuelva el valor. 508 00:24:07,549 --> 00:24:09,590 Así que ahora tenemos una función eso hubiera sido agradable 509 00:24:09,590 --> 00:24:14,040 si CS50 implementaría en CS50.h y CS50.c para usted, 510 00:24:14,040 --> 00:24:16,520 pero aquí podemos ahora implementar esto nosotros mismos. 511 00:24:16,520 --> 00:24:19,230 >> Sin embargo, dos observaciones sobre algunos detalles clave. 512 00:24:19,230 --> 00:24:24,390 Uno-- ¿por qué me declaro int n, ¿cree que, en la línea 29 513 00:24:24,390 --> 00:24:27,139 en vez de hacer esto aquí, que es 514 00:24:27,139 --> 00:24:28,930 más consistente con lo que hicimos la semana pasada? 515 00:24:28,930 --> 00:24:29,430 ¿Sí? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Un buen pensamiento. 518 00:24:35,110 --> 00:24:37,080 Así que si tuviéramos que poner aquí, es como si nos 519 00:24:37,080 --> 00:24:39,110 mantener a declarar una y otra vez. 520 00:24:39,110 --> 00:24:42,000 Eso en sí mismo es no es problemática, per se, 521 00:24:42,000 --> 00:24:43,940 porque sólo tenemos el valor de una vez y luego 522 00:24:43,940 --> 00:24:45,330 vamos a conseguir uno nuevo de todos modos. 523 00:24:45,330 --> 00:24:45,940 Pero un buen pensamiento. 524 00:24:45,940 --> 00:24:46,440 ¿Sí? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Cerrar. 527 00:24:53,330 --> 00:24:59,030 Así que ya he declarado en n línea 29 fuera del bucle, 528 00:24:59,030 --> 00:25:01,390 es accesible en todo toda esta función. 529 00:25:01,390 --> 00:25:05,400 Otros no funciona porque n es todavía dentro de estos rizado 530 00:25:05,400 --> 00:25:06,470 apoyos aquí. 531 00:25:06,470 --> 00:25:07,940 Tan-- seguro. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Exactamente. 534 00:25:12,940 --> 00:25:14,356 Así que esto es aún más al punto. 535 00:25:14,356 --> 00:25:18,600 Si en lugar declaramos n derecho aquí en la línea 32, 536 00:25:18,600 --> 00:25:22,340 es problemático porque conjetura donde más que necesito para acceder a ella? 537 00:25:22,340 --> 00:25:25,620 En la línea 34, y la sencilla regla de oro es 538 00:25:25,620 --> 00:25:30,060 que sólo se puede utilizar una variable dentro de los más recientes llaves 539 00:25:30,060 --> 00:25:31,420 en el que se declaró. 540 00:25:31,420 --> 00:25:35,230 >> Desafortunadamente, la línea 34 es una línea demasiado tarde, 541 00:25:35,230 --> 00:25:38,560 porque yo ya he cerrado la llave de cierre en la línea 33 542 00:25:38,560 --> 00:25:41,220 que corresponde a la corchete en la línea 30. 543 00:25:41,220 --> 00:25:44,180 Y lo que esta es una manera de decir que esta variable int tiene como alcance, 544 00:25:44,180 --> 00:25:46,970 por así decirlo, a sólo dentro de esas llaves. 545 00:25:46,970 --> 00:25:48,910 Simplemente no existe fuera de ellos. 546 00:25:48,910 --> 00:25:51,580 >> Así que de hecho, si hago esto mal, me deja guardar el código 547 00:25:51,580 --> 00:25:53,530 ya que es-- incorrectamente escrita. 548 00:25:53,530 --> 00:25:57,990 Déjenme seguir adelante y hacerlo hacer función-1, y el error notice--. 549 00:25:57,990 --> 00:26:03,502 El uso de identificador no declarado n en la línea 35, que está justo aquí. 550 00:26:03,502 --> 00:26:05,210 Y si nos desplazamos hasta Además, otro. 551 00:26:05,210 --> 00:26:08,750 El uso de no declarados identificador n en la línea 34. 552 00:26:08,750 --> 00:26:11,200 >> Así el compilador, Clang, es de notar que sólo 553 00:26:11,200 --> 00:26:13,720 no existe a pesar de que claramente que está ahí visualmente. 554 00:26:13,720 --> 00:26:16,090 Así que una solución simple está declarando allí. 555 00:26:16,090 --> 00:26:18,790 >> Ahora voy a desplazarme a la parte superior del archivo. 556 00:26:18,790 --> 00:26:21,080 Lo que salta a la vista como ser un poco diferente 557 00:26:21,080 --> 00:26:23,070 de las cosas que nos aguarda a la semana pasada? 558 00:26:23,070 --> 00:26:26,990 No sólo no tengo nombre, no sólo las hacen Tengo algunos agudos incluye encima de la tapa, 559 00:26:26,990 --> 00:26:29,340 Tengo algo que me llamar a un prototipo. 560 00:26:29,340 --> 00:26:36,100 Ahora que parece terriblemente similar a lo que que acabamos de ver hace un momento en la línea 27. 561 00:26:36,100 --> 00:26:39,230 >> Así que vamos a deducir a partir de una diferente mensaje de error por lo que he hecho esto. 562 00:26:39,230 --> 00:26:42,050 Déjame ir por delante y eliminar estas líneas existen. 563 00:26:42,050 --> 00:26:44,240 Y así, no sabemos nada de prototipo. 564 00:26:44,240 --> 00:26:45,430 Remake este archivo. 565 00:26:45,430 --> 00:26:46,890 Hacer una función. 566 00:26:46,890 --> 00:26:48,090 Y ahora, maldita sea, cuatro errores. 567 00:26:48,090 --> 00:26:50,220 Vamos a desplazarse hasta la primera. 568 00:26:50,220 --> 00:26:55,070 >> Declaración implícita de la función conseguir int positivo es válido en C99. 569 00:26:55,070 --> 00:26:57,780 C99 sólo significa el 1999 versión del lenguaje 570 00:26:57,780 --> 00:26:59,710 C, que es lo que estamos usando de hecho. 571 00:26:59,710 --> 00:27:01,050 Así que ¿qué significa esto? 572 00:27:01,050 --> 00:27:05,250 Bueno C-- y más concretamente C compilers-- son programas bastante tontas. 573 00:27:05,250 --> 00:27:07,420 Sólo saben lo que has les dijo, y eso es 574 00:27:07,420 --> 00:27:08,960 realidad temática de la semana pasada. 575 00:27:08,960 --> 00:27:12,910 >> El problema es que si me voy sobre la implementación de nombre aquí, 576 00:27:12,910 --> 00:27:17,640 y que yo llamo una función llamada GetPositiveInt aquí en la línea 20, 577 00:27:17,640 --> 00:27:22,520 que la función hace técnicamente no existiendo hasta que el compilador ve la línea 27. 578 00:27:22,520 --> 00:27:25,450 Desafortunadamente, el compilador es hacer las cosas arriba, abajo, izquierda, derecha, 579 00:27:25,450 --> 00:27:29,580 porque no ha visto la aplicación de GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 pero ve que tratar para usarlo aquí, 581 00:27:32,400 --> 00:27:35,810 que sólo va a bail-- gritara que con un error tal vez mensaje-- 582 00:27:35,810 --> 00:27:38,440 críptico, y en realidad no compilar el archivo. 583 00:27:38,440 --> 00:27:41,940 >> Así que una llamada prototipo hasta aquí es ciertamente redundante. 584 00:27:41,940 --> 00:27:47,870 Literalmente, me bajé aquí y he copiado y pegado esto, y lo pongo aquí. 585 00:27:47,870 --> 00:27:51,020 Vacío sería más adecuado, así que vamos a literalmente, copie y pegue esta vez. 586 00:27:51,020 --> 00:27:52,854 Yo, literalmente, copié y pegué. 587 00:27:52,854 --> 00:27:54,270 Realmente sólo como como una miga de pan. 588 00:27:54,270 --> 00:27:56,260 >> Una pequeña pista para el compilador. 589 00:27:56,260 --> 00:27:58,860 No sé lo que esto hace todavía, pero estoy prometiendo que 590 00:27:58,860 --> 00:28:00,260 que va a existir eventualmente. 591 00:28:00,260 --> 00:28:04,010 Y es por eso que este line-- en línea 16-- termina con un punto y coma. 592 00:28:04,010 --> 00:28:05,486 Es redundante por diseño. 593 00:28:05,486 --> 00:28:05,986 Sí? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Si no vincula su biblioteca a el-- oh, buena pregunta. 596 00:28:14,360 --> 00:28:17,350 De Sharp incluye inclusiones de archivos de cabecera. 597 00:28:17,350 --> 00:28:20,040 Necesidad de ser-- debe casi siempre en la parte superior 598 00:28:20,040 --> 00:28:23,270 del archivo para un similar-- para exactamente la misma razón, sí. 599 00:28:23,270 --> 00:28:26,430 Debido a que en la norma io.h es literalmente una línea 600 00:28:26,430 --> 00:28:30,560 como esto, pero con la palabra printf, y con sus argumentos y su tipo de retorno. 601 00:28:30,560 --> 00:28:33,310 Y así, haciendo aguda incluyen hasta aquí, lo que estás haciendo, literalmente, 602 00:28:33,310 --> 00:28:36,380 está copiando y pegando el contenido de otra persona escribió encima de la tapa. 603 00:28:36,380 --> 00:28:39,660 De esta manera cluing su código en la hecho de que existen esas funciones. 604 00:28:39,660 --> 00:28:40,160 ¿Sí? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absolutamente. 607 00:28:48,260 --> 00:28:51,690 Así que un muy inteligente y correcta solución sería, ¿sabes qué? 608 00:28:51,690 --> 00:28:53,760 No sé lo que es un prototipo es, pero sé 609 00:28:53,760 --> 00:28:56,390 si entiendo que C es sólo mudo y replantea arriba a abajo. 610 00:28:56,390 --> 00:28:57,820 Bueno vamos a darle lo que quiere. 611 00:28:57,820 --> 00:29:01,650 Vamos a cortar ese código, pégalo arriba parte superior, y luego aprieta principal abajo. 612 00:29:01,650 --> 00:29:03,470 Esto también resolvería el problema. 613 00:29:03,470 --> 00:29:07,409 >> Pero puede muy fácilmente llegar a un escenario en el que la necesidad de llamar a B, 614 00:29:07,409 --> 00:29:10,075 y tal vez B llama de nuevo a A. Este es algo que se llama recursividad, 615 00:29:10,075 --> 00:29:11,370 y vamos a volver a eso. 616 00:29:11,370 --> 00:29:13,911 Y puede o no puede ser un buen cosa, pero definitivamente se puede 617 00:29:13,911 --> 00:29:15,110 romper esta solución. 618 00:29:15,110 --> 00:29:17,690 >> Y además, lo haría reclamar estilísticamente, 619 00:29:17,690 --> 00:29:20,760 especialmente cuando sus programas convertido en este largo y este largo, 620 00:29:20,760 --> 00:29:23,064 es simplemente muy práctico poner principal en la parte superior 621 00:29:23,064 --> 00:29:25,730 porque es la cosa más programadores van a preocuparse. 622 00:29:25,730 --> 00:29:28,150 Y lo que es un poco más limpio, podría decirse que, para hacerlo de la manera 623 00:29:28,150 --> 00:29:30,380 Originalmente hice con un prototipo incluso 624 00:29:30,380 --> 00:29:33,396 aunque se ve un poco redundante a primera vista. 625 00:29:33,396 --> 00:29:33,895 ¿Sí? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Lo sentimos, se puede decir que más fuerte? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Si cambia la ubicación de la la ejecución y el prototipo? 630 00:29:49,580 --> 00:29:51,270 Así que esa es una buena pregunta. 631 00:29:51,270 --> 00:29:53,780 Si vuelve a declarar esta abajo aquí, vamos a ver qué pasa. 632 00:29:53,780 --> 00:29:55,530 Así que si yo achaco aquí, que estás diciendo. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, lo siento. 635 00:29:58,360 --> 00:29:58,859 Louder? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Incluso más fuerte. 638 00:30:04,011 --> 00:30:04,760 Ah, buena pregunta. 639 00:30:04,760 --> 00:30:05,860 ¿Sería invalidar la función? 640 00:30:05,860 --> 00:30:08,901 Ya sabes, después de todos estos años, me nunca han puesto un prototipo después. 641 00:30:08,901 --> 00:30:13,810 Así que vamos a hacer que la función-1 después de hacer eso. 642 00:30:13,810 --> 00:30:15,279 >> [Murmurando] 643 00:30:15,279 --> 00:30:16,320 DAVID J. MALAN: Oh, espera. 644 00:30:16,320 --> 00:30:17,944 Todavía tenemos que poner todo encima de la tapa. 645 00:30:17,944 --> 00:30:21,400 Así que vamos a hacer esto aquí, si estoy entender bien su pregunta. 646 00:30:21,400 --> 00:30:24,700 Estoy poniendo todo, incluyendo el prototipo anteriormente principal, 647 00:30:24,700 --> 00:30:28,180 pero me estoy poniendo el prototipo por debajo de la implementación. 648 00:30:28,180 --> 00:30:33,190 >> Así que si hago uno, me estoy poniendo volver un error-- sin usar variable n. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, no. 651 00:30:37,860 --> 00:30:38,360 Gracias. 652 00:30:38,360 --> 00:30:39,430 Vamos a ver, nos deshacemos de este. 653 00:30:39,430 --> 00:30:41,304 Eso es un error diferente, así que vamos a ignorar eso. 654 00:30:41,304 --> 00:30:43,910 Vamos realmente rehacer rápidamente esto. 655 00:30:43,910 --> 00:30:48,100 >> OK, así que no argumento de datos utilizado por el formato de cadena 656 00:30:48,100 --> 00:30:52,310 n-- oh, eso es porque Cambié a estos aquí. 657 00:30:52,310 --> 00:30:55,885 Muy bien, sabemos cuál es la respuesta va a-- bien, aquí vamos. 658 00:30:55,885 --> 00:31:00,560 Ah, gracias por el positivo. 659 00:31:00,560 --> 00:31:03,430 Muy bien, voy a arreglar este código después de-- ignorar este error en particular 660 00:31:03,430 --> 00:31:08,300 ya que este fue-- funciona es la respuesta. 661 00:31:08,300 --> 00:31:11,560 >> Así que no sobrescribe lo que acabas de hacer. 662 00:31:11,560 --> 00:31:14,800 Sospecho que el compilador está escrito de tal manera 663 00:31:14,800 --> 00:31:18,420 que hace caso omiso de su prototipo porque el cuerpo, por así decirlo, 664 00:31:18,420 --> 00:31:20,922 de la función ya tiene han aplicado más arriba. 665 00:31:20,922 --> 00:31:23,380 Tendría que consultar realidad el manual del compilador 666 00:31:23,380 --> 00:31:26,171 para entender si hay algún otro implicación, pero a primera vista 667 00:31:26,171 --> 00:31:29,290 simplemente por experimentar, probar, no parece haber ningún impacto. 668 00:31:29,290 --> 00:31:30,730 Buena pregunta. 669 00:31:30,730 --> 00:31:33,660 >> Así que vamos a seguir adelante ahora, moviéndose lejos de los efectos secundarios que 670 00:31:33,660 --> 00:31:36,660 son funciones que hacen algo así como visualmente en la pantalla con printf, 671 00:31:36,660 --> 00:31:38,090 pero no devuelven un valor. 672 00:31:38,090 --> 00:31:41,550 Y las funciones que tienen retorno valores como la que acabamos de ver algunas de. 673 00:31:41,550 --> 00:31:45,350 Ya vimos esta noción de alcance, y vamos a ver una y otra vez. 674 00:31:45,350 --> 00:31:47,210 Pero, por ahora, de nuevo, utilizar la regla de oro 675 00:31:47,210 --> 00:31:51,410 que una variable sólo se puede utilizar dentro de la más reciente inauguración 676 00:31:51,410 --> 00:31:54,350 y llaves cerradas como nos vio en ese ejemplo particular. 677 00:31:54,350 --> 00:31:56,910 >> Y como usted ha señalado, hay una ability-- 678 00:31:56,910 --> 00:32:00,040 que podría resolver algunos de estos problemas poniendo una variable a nivel mundial 679 00:32:00,040 --> 00:32:01,290 en la parte superior de un archivo. 680 00:32:01,290 --> 00:32:03,630 Sin embargo, en casi todos los casos nos fruncir el ceño a que, 681 00:32:03,630 --> 00:32:06,170 y de hecho no incluso ir en que la solución por ahora. 682 00:32:06,170 --> 00:32:09,890 Así que por ahora, la comida para llevar es que variables tienen esta noción de alcance. 683 00:32:09,890 --> 00:32:13,430 >> Pero ahora vamos a ver otra vía seca de realidad busca 684 00:32:13,430 --> 00:32:15,810 en algunos bastante interesante detalles de implementación. 685 00:32:15,810 --> 00:32:17,810 ¿Cómo podríamos representar la información. 686 00:32:17,810 --> 00:32:20,370 Y ya encontramos esta en la primera semana de la clase. 687 00:32:20,370 --> 00:32:23,320 En cuanto a los binarios, y recordándonos a nosotros mismos decimal. 688 00:32:23,320 --> 00:32:28,310 >> Pero recordar desde la semana pasada que C tiene diferentes tipos de datos y racimos más, 689 00:32:28,310 --> 00:32:30,600 pero los más útiles por ahora podría ser éstos. 690 00:32:30,600 --> 00:32:36,030 Un char, o carácter, lo que sucede ser un byte, o de ocho bits en total. 691 00:32:36,030 --> 00:32:40,060 Y eso quiere decir que el tamaño de un char es un solo byte. 692 00:32:40,060 --> 00:32:45,370 Un byte es de ocho bits, por lo que esto significa que podemos representar el número de caracteres. 693 00:32:45,370 --> 00:32:47,320 ¿Cuántas letras o símbolos del teclado 694 00:32:47,320 --> 00:32:49,210 si tenemos un byte u ocho bits. 695 00:32:49,210 --> 00:32:51,546 Piense de nuevo a la semana cero. 696 00:32:51,546 --> 00:32:53,420 Si usted tiene ocho bits, cuántos valores totales 697 00:32:53,420 --> 00:32:55,503 puede representar con patrones de ceros y unos? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 Uno-- más que eso. 700 00:33:00,260 --> 00:33:03,490 Así que 256 totales si empezar a contar desde cero. 701 00:33:03,490 --> 00:33:07,120 Así que si tienes ocho bits-- así que si nos tenido nuestras lámparas binarios hasta aquí de nuevo, 702 00:33:07,120 --> 00:33:12,180 podríamos convertir esas bombillas en y fuera en cualquiera de 256 patrones únicos. 703 00:33:12,180 --> 00:33:13,640 >> Ahora bien, esto es un poco problemático. 704 00:33:13,640 --> 00:33:16,857 No tanto por Inglés y lenguas romances, pero sin duda 705 00:33:16,857 --> 00:33:19,190 cuando se introduce, por ejemplo, las lenguas asiáticas, que 706 00:33:19,190 --> 00:33:22,580 tienen mucho más símbolos que como 26 letras del alfabeto. 707 00:33:22,580 --> 00:33:24,390 En realidad podríamos necesitar más de un byte. 708 00:33:24,390 --> 00:33:28,240 Y por suerte en los últimos años tiene la sociedad 709 00:33:28,240 --> 00:33:31,040 adoptado otras normas que utilizan más de un byte por cada carga. 710 00:33:31,040 --> 00:33:34,210 >> Pero, por ahora, en C, el valor por defecto es sólo un byte u ocho bits. 711 00:33:34,210 --> 00:33:38,195 Un entero, por su parte, es de cuatro bytes, también conocida como 32 bits. 712 00:33:38,195 --> 00:33:41,320 Lo que significa que lo que es el más grande posible número se puede representar con un int 713 00:33:41,320 --> 00:33:41,820 al parecer? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Con un billón. 716 00:33:45,050 --> 00:33:46,760 Así que es de cuatro mil millones más o menos. 717 00:33:46,760 --> 00:33:49,840 2 a la potencia 32 ª, si nos asumir sin números negativos 718 00:33:49,840 --> 00:33:52,530 y sólo tiene que utilizar todos positivos los números, que es de cuatro mil millones 719 00:33:52,530 --> 00:33:53,730 más o menos posibilidades. 720 00:33:53,730 --> 00:33:57,890 Un flotador, por su parte, es un tipo diferente de tipo de datos en C. Es todavía un número, 721 00:33:57,890 --> 00:33:58,990 pero es un número real. 722 00:33:58,990 --> 00:34:00,660 Algo con un punto decimal. 723 00:34:00,660 --> 00:34:03,000 Y resulta que C también utiliza cuatro bytes 724 00:34:03,000 --> 00:34:05,340 para representar los valores de coma flotante. 725 00:34:05,340 --> 00:34:09,420 >> Desafortunadamente cuántos flotante valores de los puntos hay en el mundo? 726 00:34:09,420 --> 00:34:11,582 ¿Cuántos números reales hay? 727 00:34:11,582 --> 00:34:13,540 Hay un infinito número, y para el caso 728 00:34:13,540 --> 00:34:15,164 hay un número infinito de números enteros. 729 00:34:15,164 --> 00:34:18,070 Así que ya estamos tipo de excavar un agujero de nosotros mismos aquí. 730 00:34:18,070 --> 00:34:21,780 Por lo cual al parecer en computers-- en menos los programas escritos en C en ellos-- 731 00:34:21,780 --> 00:34:24,110 sólo puede contar tan alto como cuatro mil millones más o menos, 732 00:34:24,110 --> 00:34:26,260 y valores de punto flotante sólo puede parecer 733 00:34:26,260 --> 00:34:28,330 tener cierta cantidad finita de precisión. 734 00:34:28,330 --> 00:34:30,810 Sólo los tantos dígitos después su punto decimal. 735 00:34:30,810 --> 00:34:32,822 >> Porque, por supuesto, si sólo tiene 32 bits, 736 00:34:32,822 --> 00:34:36,030 No sé cómo vamos a ir sobre representando numbers-- reales probablemente 737 00:34:36,030 --> 00:34:37,409 con diferentes tipos de patrones. 738 00:34:37,409 --> 00:34:40,030 Pero hay sin duda un finito número de tales patrones, 739 00:34:40,030 --> 00:34:41,830 así que aquí, también, esto es problemático. 740 00:34:41,830 --> 00:34:43,710 >> Ahora podemos evitar el problema ligeramente. 741 00:34:43,710 --> 00:34:45,710 Si usted no utiliza un flotador, podría usar un doble 742 00:34:45,710 --> 00:34:50,230 en C, que le da ocho bytes, que es la forma más patrones posibles de ceros 743 00:34:50,230 --> 00:34:50,730 y unos. 744 00:34:50,730 --> 00:34:55,199 Pero sigue siendo finito, que se va ser problemático si escribes software 745 00:34:55,199 --> 00:34:57,670 para los gráficos o de fantasía fórmulas matemáticas. 746 00:34:57,670 --> 00:35:00,410 Así que en realidad podría desear a contar hasta más grande que eso. 747 00:35:00,410 --> 00:35:05,640 A named-- largo long-- estúpidamente es también ocho bytes o 64 bits, 748 00:35:05,640 --> 00:35:10,260 y esto es el doble de tiempo como un int, y es para un valor entero largo. 749 00:35:10,260 --> 00:35:15,655 >> Diversión hecho-- si un int es de cuatro bytes, ¿Cuánto dura un tiempo en C normalmente? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 También cuatro bytes, pero una largo, largo es de ocho bytes, 752 00:35:21,560 --> 00:35:23,050 y esto es por razones históricas. 753 00:35:23,050 --> 00:35:26,450 >> Pero la comida para llevar ahora es sólo que los datos tiene 754 00:35:26,450 --> 00:35:29,625 a ser representado en un computer-- que es un dispositivo físico con la electricidad, 755 00:35:29,625 --> 00:35:32,190 generalmente está conduciendo esos ceros y ones-- 756 00:35:32,190 --> 00:35:34,320 con cantidades finitas de precisión. 757 00:35:34,320 --> 00:35:35,620 Entonces, ¿cuál es el problema entonces? 758 00:35:35,620 --> 00:35:37,480 >> Bueno, hay un problema de desbordamiento de enteros. 759 00:35:37,480 --> 00:35:39,780 No sólo en C, pero en los ordenadores en general. 760 00:35:39,780 --> 00:35:42,590 Por ejemplo, si esta es un byte merece una bit-- 761 00:35:42,590 --> 00:35:45,120 así que si esto es ocho bit-- todo de los cuales son el número uno. 762 00:35:45,120 --> 00:35:47,300 ¿Qué número es este que representa si asumimos 763 00:35:47,300 --> 00:35:50,730 es todos los valores positivos en binario? 764 00:35:50,730 --> 00:35:54,410 >> 255, y no es 256, porque el cero es el número más bajo. 765 00:35:54,410 --> 00:35:56,760 Así que 255 es el más alto uno, pero el problema 766 00:35:56,760 --> 00:36:00,330 se supone que quería incrementar esta variable que 767 00:36:00,330 --> 00:36:04,030 se utilizan ocho bits en total si quiero incrementarlo. 768 00:36:04,030 --> 00:36:07,160 >> Pues tan pronto como puedo añadir un uno a todos estos, 769 00:36:07,160 --> 00:36:10,500 usted tal vez pueda imaginar visually-- sólo como llevar el uno usando decimals-- 770 00:36:10,500 --> 00:36:12,300 algo va a fluir hacia la izquierda. 771 00:36:12,300 --> 00:36:15,590 Y de hecho, si añado el número una a este, lo que sucede en el sistema binario 772 00:36:15,590 --> 00:36:17,670 es que se desborda de nuevo a cero. 773 00:36:17,670 --> 00:36:21,730 >> Así que si sólo no utilizadas: un int, pero un solo byte para contar números enteros 774 00:36:21,730 --> 00:36:27,170 en un programa, por default-- tan pronto como sea se llega a 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 viene después de 255, que probablemente no lo es 776 00:36:32,710 --> 00:36:34,790 un usuario que va a esperar. 777 00:36:34,790 --> 00:36:39,620 >> Ahora mientras que en punto flotante del mundo, usted también tiene un problema similar. 778 00:36:39,620 --> 00:36:42,670 No tanto con la mayor number-- aunque eso es todavía un problema. 779 00:36:42,670 --> 00:36:45,360 Pero con la cantidad de precisión que puede representar. 780 00:36:45,360 --> 00:36:49,490 Así que echemos un vistazo a este ejemplo aquí también de code-- fuente de hoy 781 00:36:49,490 --> 00:36:52,070 flotar-0.c. 782 00:36:52,070 --> 00:36:54,280 >> Y note que es un super sencillo programa que 783 00:36:54,280 --> 00:36:56,580 aparentemente deberían imprimir lo que de valor? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 ¿Qué se apuesta que esto va a imprimir a pesar de que hay un poco de nueva sintaxis 786 00:37:04,110 --> 00:37:05,540 aquí? 787 00:37:05,540 --> 00:37:06,700 Así que espero que 0,1. 788 00:37:06,700 --> 00:37:10,000 Así que el equivalente de un décimo porque estoy haciendo 1 dividido por 10. 789 00:37:10,000 --> 00:37:12,430 Estoy almacenando la respuesta en una variable llamada f. 790 00:37:12,430 --> 00:37:15,850 Esa variable es de tipo float, que es una palabra clave que acaba de proponer existía. 791 00:37:15,850 --> 00:37:18,910 >> No hemos visto esto antes, pero esto es una especie de una manera ordenada en printf 792 00:37:18,910 --> 00:37:22,110 para especificar el número de dígitos que quiero ver después de un punto decimal. 793 00:37:22,110 --> 00:37:25,020 Así que esta notación sólo significa que aquí es un marcador de posición. 794 00:37:25,020 --> 00:37:27,900 Es por una coma flotante valor, y oh, por cierto, 795 00:37:27,900 --> 00:37:31,389 muestran con el punto decimal con un número después del punto decimal. 796 00:37:31,389 --> 00:37:33,180 Así que ese es el número de dígitos significativos, 797 00:37:33,180 --> 00:37:34,650 por así decirlo, que es posible que desee. 798 00:37:34,650 --> 00:37:40,450 >> Así que déjame ir adelante y hacer hacer flotar-0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 y al parecer 1 dividido por 10 es 0.0. 800 00:37:46,660 --> 00:37:47,760 Ahora ¿por qué es esto? 801 00:37:47,760 --> 00:37:51,380 >> Bueno una vez más, el equipo está tomando me literalmente, y he escrito 1 802 00:37:51,380 --> 00:37:56,680 y he escrito 10, y tomar una conjetura lo es el tipo de datos asumido para los dos 803 00:37:56,680 --> 00:37:58,440 valores? 804 00:37:58,440 --> 00:38:00,970 Un int, es técnicamente algo un poco diferente. 805 00:38:00,970 --> 00:38:04,150 Es normalmente un largo, pero es en última instancia, un valor integral. 806 00:38:04,150 --> 00:38:06,030 No es un valor de coma flotante. 807 00:38:06,030 --> 00:38:09,456 >> ¿Qué quiere decir que si esto es un entero y esto es un int, 808 00:38:09,456 --> 00:38:11,830 el problema es que el ordenador no tiene la capacidad 809 00:38:11,830 --> 00:38:13,680 para almacenar hasta ese punto decimal. 810 00:38:13,680 --> 00:38:16,430 Así que cuando usted hace 1 dividido por 10 que usan números enteros 811 00:38:16,430 --> 00:38:20,950 tanto para el numerador y el denominador, la respuesta debe ser 0,1. 812 00:38:20,950 --> 00:38:24,930 Pero el computer-- porque esos son integers-- 813 00:38:24,930 --> 00:38:27,430 no sabe qué hacer con el 0,1. 814 00:38:27,430 --> 00:38:30,010 >> Entonces, ¿qué está haciendo con claridad? 815 00:38:30,010 --> 00:38:33,120 Es simplemente tirarlo a la basura, y lo que estoy viendo en última instancia, 816 00:38:33,120 --> 00:38:38,830 0.0 es sólo porque yo insistí en que printf mostrarme un punto decimal. 817 00:38:38,830 --> 00:38:41,740 Pero el problema es que si usted dividir un entero por un entero, 818 00:38:41,740 --> 00:38:44,347 usted get-- por definición de C-- un entero. 819 00:38:44,347 --> 00:38:46,680 Y no va a hacer algo agradable y cómoda 820 00:38:46,680 --> 00:38:49,040 como alrededor de ella hasta el más cercano arriba o hacia abajo. 821 00:38:49,040 --> 00:38:51,860 Se va a truncar todo después del decimal. 822 00:38:51,860 --> 00:38:54,030 >> Así que sólo intuitivamente, lo que es probablemente una solución? 823 00:38:54,030 --> 00:38:55,351 ¿Cuál es la solución más simple aquí? 824 00:38:55,351 --> 00:38:55,850 ¿Sí? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Exactamente. 827 00:39:01,100 --> 00:39:04,200 ¿Por qué no simplemente tratamos estos como valores de coma flotante efectivamente 828 00:39:04,200 --> 00:39:05,860 convirtiéndolos en carrozas o dobles. 829 00:39:05,860 --> 00:39:10,500 Y ahora si lo hago hacer carrozas-0, o si compilo carrozas-1, 830 00:39:10,500 --> 00:39:12,570 que es idéntica a lo que sólo se propuso. 831 00:39:12,570 --> 00:39:16,400 Y ahora que hago carrozas-0, ahora me sale mi 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Ahora bien, esto es increíble. 833 00:39:17,234 --> 00:39:19,441 Pero ahora me voy a hacer algo un poco diferente. 834 00:39:19,441 --> 00:39:22,280 Tengo curiosidad por ver lo que es realmente pasando por debajo de la campana, 835 00:39:22,280 --> 00:39:26,050 y yo voy a imprimir esta a 28 cifras decimales. 836 00:39:26,050 --> 00:39:29,730 Quiero ver realmente 0.1000-- un infinite-- 837 00:39:29,730 --> 00:39:32,710 [Inaudible] 27 ceros después de que 0,1. 838 00:39:32,710 --> 00:39:34,740 >> Bueno vamos a ver si eso es lo que de hecho entiendo. 839 00:39:34,740 --> 00:39:39,430 Haga mismo archivo carrozas-0. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Vamos a acercar en la respuesta dramática. 842 00:39:44,380 --> 00:39:49,980 Durante todo este tiempo, has estado pensando 1 dividido por 10 es del 10%, o 0,1. 843 00:39:49,980 --> 00:39:50,810 Que no es. 844 00:39:50,810 --> 00:39:53,210 Al menos por lo que respecta a la de que se trate ordenador. 845 00:39:53,210 --> 00:39:57,060 >> Ahora qué-- bien, eso es completa mentira 1 dividido por 10 es de 0,1. 846 00:39:57,060 --> 00:39:59,710 Pero eso no es qué-- la comida para llevar hoy. 847 00:39:59,710 --> 00:40:04,010 Entonces, ¿por qué piensa el equipo, a diferencia de todos nosotros en la habitación, 848 00:40:04,010 --> 00:40:06,870 que 1 dividido por 10 es en realidad ese valor loco? 849 00:40:06,870 --> 00:40:10,620 ¿Cuál es la computadora haciendo parecer? 850 00:40:10,620 --> 00:40:12,490 Qué es eso? 851 00:40:12,490 --> 00:40:13,785 >> No es desborde, per se. 852 00:40:13,785 --> 00:40:15,910 Overflow es típicamente cuando en que se coloca alrededor de un valor. 853 00:40:15,910 --> 00:40:18,970 Es este problema de imprecisión en un valor de coma flotante 854 00:40:18,970 --> 00:40:22,220 en la que sólo tiene 32 o incluso 64 bits. 855 00:40:22,220 --> 00:40:25,230 Pero si hay un infinito número de numbers-- verdadera 856 00:40:25,230 --> 00:40:27,940 números con puntos decimales y los números de thereafter-- seguramente 857 00:40:27,940 --> 00:40:29,380 no puede representar a todos ellos. 858 00:40:29,380 --> 00:40:32,870 Así que el equipo ha dado nosotros la coincidencia más cercana 859 00:40:32,870 --> 00:40:37,090 al valor que puede representar usando ese muchos bits al valor realmente quiero, 860 00:40:37,090 --> 00:40:38,690 que es 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Desafortunadamente, si usted empezar a hacer matemáticas, o 862 00:40:40,685 --> 00:40:44,360 iniciar la participación de este tipo de flotación valores de punto en importante programs-- 863 00:40:44,360 --> 00:40:46,770 software financiero, nada software-- militar 864 00:40:46,770 --> 00:40:49,090 donde la percepción es probablemente bastante importante. 865 00:40:49,090 --> 00:40:51,520 Y empezar a añadir números de este tipo, y comienzo 866 00:40:51,520 --> 00:40:54,050 ejecutar ese software con entradas muy grandes 867 00:40:54,050 --> 00:40:56,890 o por muchas horas o lotes de días o un montón de años, 868 00:40:56,890 --> 00:41:01,060 estos diminutos pequeños errores sin duda puede aumentar con el tiempo. 869 00:41:01,060 --> 00:41:04,252 >> Ahora como un aparte, si alguna vez te has visto Superman 3 o espacio de oficina 870 00:41:04,252 --> 00:41:05,960 y se puede recordar como estos chicos robaron 871 00:41:05,960 --> 00:41:08,668 una gran cantidad de dinero de su ordenador mediante el uso de valores de coma flotante 872 00:41:08,668 --> 00:41:11,290 y sumando la pequeña residuos, es de esperar que la película 873 00:41:11,290 --> 00:41:12,390 ahora tiene más sentido. 874 00:41:12,390 --> 00:41:14,930 Esto es lo que eran aludiendo a que en la película. 875 00:41:14,930 --> 00:41:16,710 El hecho de que la mayoría las empresas no se verían 876 00:41:16,710 --> 00:41:18,600 después de un cierto número de decimales, 877 00:41:18,600 --> 00:41:20,009 pero esos son fracciones de centavos. 878 00:41:20,009 --> 00:41:22,550 Así que empezar a sumarlos, usted comienza a hacer un montón de dinero 879 00:41:22,550 --> 00:41:23,424 en su cuenta bancaria. 880 00:41:23,424 --> 00:41:25,160 Así que eso es Espacio Oficina explicó. 881 00:41:25,160 --> 00:41:28,220 >> Ahora por desgracia más allá Espacio de oficina, hay 882 00:41:28,220 --> 00:41:31,794 son algunos legítimamente preocupante e impactos significativos 883 00:41:31,794 --> 00:41:33,710 de estos tipos de decisiones de diseño subyacentes, 884 00:41:33,710 --> 00:41:35,990 y de hecho una de las razones utilizamos C en el curso 885 00:41:35,990 --> 00:41:39,640 es para que usted realmente tiene esta planta hasta la comprensión de cómo funcionan las computadoras, 886 00:41:39,640 --> 00:41:42,440 cómo el software funciona y qué no dar nada por sentado. 887 00:41:42,440 --> 00:41:45,820 >> Y de hecho Desafortunadamente, incluso con que la comprensión fundamental, 888 00:41:45,820 --> 00:41:47,370 nosotros los humanos cometemos errores. 889 00:41:47,370 --> 00:41:51,310 Y lo que yo pensé en compartir es este video de ocho minuto aquí toma 890 00:41:51,310 --> 00:41:56,980 de un episodio de Maravillas Modernas, que es un espectáculo didáctico sobre cómo funcionan las cosas 891 00:41:56,980 --> 00:42:00,370 que pinta dos cuadros cuando un uso indebido 892 00:42:00,370 --> 00:42:02,540 y la comprensión de valores de coma flotante 893 00:42:02,540 --> 00:42:05,610 conducido a algunos significativa resultados desafortunados. 894 00:42:05,610 --> 00:42:06,363 Vamos a echar un vistazo. 895 00:42:06,363 --> 00:42:07,029 [REPRODUCCIÓN DE VÍDEO] 896 00:42:07,029 --> 00:42:11,290 -Nosotros Ahora volver a "Ingeniería Desastres "en Maravillas Modernas. 897 00:42:11,290 --> 00:42:12,940 Computadoras. 898 00:42:12,940 --> 00:42:15,580 Todos hemos llegado a aceptar la problemas a menudo frustrantes que 899 00:42:15,580 --> 00:42:20,960 conseguido con ellos-- error, virus, y glitches-- software para los precios pequeños 900 00:42:20,960 --> 00:42:23,100 a pagar por la comodidad. 901 00:42:23,100 --> 00:42:27,770 Pero en la alta tecnología y de alta velocidad aplicaciones militares y programas espaciales, 902 00:42:27,770 --> 00:42:32,780 el problema más pequeño posible magnificarse en el desastre. 903 00:42:32,780 --> 00:42:38,880 >> El 4 de junio de 1996, los científicos prepararon para lanzar un cohete Ariane 5 no tripulado. 904 00:42:38,880 --> 00:42:41,190 Transportaba científica satélites diseñados 905 00:42:41,190 --> 00:42:44,570 establecer con precisión cómo el Interactúa campo magnético de la Tierra 906 00:42:44,570 --> 00:42:47,380 con los vientos solares. 907 00:42:47,380 --> 00:42:50,580 El cohete fue construido para la Agencia Espacial Europea, 908 00:42:50,580 --> 00:42:54,400 y despegó desde sus instalaciones en la costa de la Guayana francesa. 909 00:42:54,400 --> 00:42:57,520 >> -Al Unos 37 segundos en el vuelo, primero 910 00:42:57,520 --> 00:42:59,070 algo notado iba mal. 911 00:42:59,070 --> 00:43:02,240 Que las boquillas se gira sobre un eje de manera que en realidad no debería. 912 00:43:02,240 --> 00:43:06,550 Alrededor de 40 segundos de vuelo, claramente el vehículo estaba en problemas, 913 00:43:06,550 --> 00:43:08,820 y fue entonces cuando hicieron la decisión de destruirlo. 914 00:43:08,820 --> 00:43:12,370 El oficial de seguridad de gama, con enormes tripas, presiona el botón 915 00:43:12,370 --> 00:43:18,030 y explotó el cohete antes de que pudiera convertirse en un peligro para la seguridad pública. 916 00:43:18,030 --> 00:43:21,010 >> : Este era la doncella viaje del Ariane 5, 917 00:43:21,010 --> 00:43:23,920 y su destrucción se llevó lugar debido a la falla 918 00:43:23,920 --> 00:43:25,932 integrado en el software del cohete. 919 00:43:25,932 --> 00:43:27,640 -El Problema en el Ariane fue que no 920 00:43:27,640 --> 00:43:30,500 era un número que requiere 64 bits para expresar, 921 00:43:30,500 --> 00:43:33,560 y querían convertir a un número de 16 bits. 922 00:43:33,560 --> 00:43:36,820 Asumieron que el número Nunca iba a ser muy grande. 923 00:43:36,820 --> 00:43:40,940 Que la mayoría de esos dígitos en el número de 64 bits eran ceros. 924 00:43:40,940 --> 00:43:42,450 Estaban equivocados. 925 00:43:42,450 --> 00:43:45,000 >> -El Incapacidad de uno programa de software para aceptar 926 00:43:45,000 --> 00:43:49,460 el tipo de número generado por otro estaba en la raíz de la falla. 927 00:43:49,460 --> 00:43:54,260 El desarrollo de software se había convertido en un muy costosa parte de la nueva tecnología. 928 00:43:54,260 --> 00:43:57,060 El cohete Ariane 4 tenía tenido mucho éxito. 929 00:43:57,060 --> 00:44:01,600 Así que gran parte del software creado para también fue utilizado en el Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -El Problema básico era que el Ariane 5. 931 00:44:04,790 --> 00:44:11,200 Fue Más Rápido acelerado más rápido, y el software no había tomado en cuenta para eso. 932 00:44:11,200 --> 00:44:14,910 >> -El Destrucción del cohete fue un gran desastre financiero. 933 00:44:14,910 --> 00:44:18,630 Todo debido a un error de software minutos. 934 00:44:18,630 --> 00:44:21,160 Pero esta no fue la primera problemas de conversión de datos de tiempo 935 00:44:21,160 --> 00:44:24,770 había plagado la tecnología moderna de cohetes. 936 00:44:24,770 --> 00:44:28,020 >> -En 1991 con el inicio de la primera Guerra del Golfo, 937 00:44:28,020 --> 00:44:30,540 el misil Patriot experimentado una clase similar 938 00:44:30,540 --> 00:44:32,465 de un problema de conversión número. 939 00:44:32,465 --> 00:44:36,760 Y como resultado 28 gente-- 28 Soldiers-- estadounidenses murieron, 940 00:44:36,760 --> 00:44:39,010 y alrededor de un centenar más resultaron heridos. 941 00:44:39,010 --> 00:44:42,830 Cuando el Patriot, que se suponía para proteger contra Scuds entrantes, 942 00:44:42,830 --> 00:44:45,780 dejado de disparar un misil. 943 00:44:45,780 --> 00:44:51,610 >> -Cuando Irak invadió Kuwait, y América lanzado Tormenta del Desierto a principios de 1991, 944 00:44:51,610 --> 00:44:55,720 Baterías de misiles Patriot fueron desplegados para proteger a Arabia Saudita e Israel 945 00:44:55,720 --> 00:44:59,180 de los ataques iraquíes con misiles Scud. 946 00:44:59,180 --> 00:45:03,080 El Patriot es un medio-rango de Estados Unidos tierra-aire del sistema 947 00:45:03,080 --> 00:45:06,530 fabricado por la empresa Raytheon. 948 00:45:06,530 --> 00:45:09,500 >> -El Tamaño del Patriota interceptor itself-- 949 00:45:09,500 --> 00:45:14,705 es más o menos unos 20 pies de largo, y pesa alrededor de 2.000 libras. 950 00:45:14,705 --> 00:45:19,090 Y lleva una ojiva de alrededor, Creo que es más o menos 150 libras. 951 00:45:19,090 --> 00:45:23,880 Y la propia cabeza de combate es un explosivo de alta potencia, que 952 00:45:23,880 --> 00:45:26,700 tiene fragmentos a su alrededor. 953 00:45:26,700 --> 00:45:31,630 Así la carcasa de la ojiva es diseñado para actuar como un perdigón. 954 00:45:31,630 --> 00:45:34,040 >> -Los Misiles se llevan cuatro por contenedor, 955 00:45:34,040 --> 00:45:37,170 y son transportados por un semirremolque. 956 00:45:37,170 --> 00:45:44,880 >> -El Sistema Patriot antimisiles se remonta por lo menos 20 años. 957 00:45:44,880 --> 00:45:48,380 Originalmente fue diseñado como un misil de defensa aérea 958 00:45:48,380 --> 00:45:50,810 para derribar aviones enemigos. 959 00:45:50,810 --> 00:45:54,410 En la primera Guerra del Golfo cuando esa guerra se encendió, 960 00:45:54,410 --> 00:45:59,650 el Ejército quería utilizarlo para derribar misiles Scud, no aviones. 961 00:45:59,650 --> 00:46:03,580 La Fuerza Aérea Iraquí fue no tanto de un problema, 962 00:46:03,580 --> 00:46:06,590 pero el Ejército estaba preocupado acerca de los Scud. 963 00:46:06,590 --> 00:46:10,120 Y por lo que trataron de actualizar el Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Un enemigo misil que viaja a Mach 5 965 00:46:12,740 --> 00:46:15,670 que iba a ser un reto suficiente. 966 00:46:15,670 --> 00:46:18,440 Pero cuando el Patriot fue trasladado de urgencia en servicio, 967 00:46:18,440 --> 00:46:22,580 el Ejército no estaba al tanto de una modificación iraquí que 968 00:46:22,580 --> 00:46:25,880 hecho sus scuds casi imposible a ella. 969 00:46:25,880 --> 00:46:30,690 >> Qué sucedió es que los Scud fueron llegando eran inestables. 970 00:46:30,690 --> 00:46:32,000 Eran tambaleante. 971 00:46:32,000 --> 00:46:37,210 La razón de esto era los Iraqis-- a fin de obtener 600 kilometros a cabo 972 00:46:37,210 --> 00:46:41,680 de un rango missile-- 300 kilómetros tomó el peso de la ojiva frente, 973 00:46:41,680 --> 00:46:43,340 y la ojiva hecho más ligero. 974 00:46:43,340 --> 00:46:48,490 Así que ahora el Patriot de tratar de llegar en el Scud, y la mayoría de la tiempo-- 975 00:46:48,490 --> 00:46:52,880 la abrumadora mayoría de la tiempo-- sería simplemente salir volando por el Scud. 976 00:46:52,880 --> 00:46:57,120 >> -Una Los operadores del sistema Patriot se dio cuenta de la Patriot perdió su objetivo, 977 00:46:57,120 --> 00:47:01,630 detonaron ojiva del Patriota para evitar posibles bajas si 978 00:47:01,630 --> 00:47:04,440 se dejó caer al suelo. 979 00:47:04,440 --> 00:47:08,700 >> Eso fue lo que vieron la mayoría de la gente como grandes bolas de fuego en el cielo, 980 00:47:08,700 --> 00:47:14,180 e incomprendido como intercepciones de ojivas Scud. 981 00:47:14,180 --> 00:47:18,020 >> -Aunque En los cielos nocturnos, Patriots parecía estar destruyendo con éxito 982 00:47:18,020 --> 00:47:23,280 Scud, en Dhahran podría haber No se equivoquen acerca de su desempeño. 983 00:47:23,280 --> 00:47:27,930 Hay sistema de radar del Patriot perdido la pista de un Scud entrante 984 00:47:27,930 --> 00:47:30,260 y nunca puesto en marcha debido a un defecto de software. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Fueron los israelíes que descubrió por primera vez que cuanto más tiempo el sistema estaba encendido, 987 00:47:38,880 --> 00:47:41,130 cuanto mayor es la discrepancia de tiempo se convirtió. 988 00:47:41,130 --> 00:47:44,770 Debido a un reloj incorporado en el ordenador del sistema. 989 00:47:44,770 --> 00:47:48,190 >> -About Dos semanas antes la tragedia en Dhahran, 990 00:47:48,190 --> 00:47:50,720 los israelíes informaron a el Departamento de Defensa 991 00:47:50,720 --> 00:47:52,410 que el sistema estaba perdiendo el tiempo. 992 00:47:52,410 --> 00:47:54,410 Después de aproximadamente ocho horas de funcionamiento, se dieron cuenta 993 00:47:54,410 --> 00:47:57,690 que el sistema se convierta notablemente menos precisa. 994 00:47:57,690 --> 00:48:01,850 El Departamento de Defensa respondió contando todas las baterías Patriot 995 00:48:01,850 --> 00:48:04,800 para no dejar los sistemas por un largo tiempo. 996 00:48:04,800 --> 00:48:06,980 Nunca dijeron lo que era mucho tiempo. 997 00:48:06,980 --> 00:48:09,140 8 horas, 10 horas, mil horas. 998 00:48:09,140 --> 00:48:11,300 Nadie sabía. 999 00:48:11,300 --> 00:48:13,320 >> -El Batería Patriot destinado en el cuartel 1000 00:48:13,320 --> 00:48:18,310 en Dhahran y su defectuoso interno reloj había estado en marcha durante más de 100 horas 1001 00:48:18,310 --> 00:48:21,520 en la noche del 25 de febrero. 1002 00:48:21,520 --> 00:48:25,792 >> -Es Rastreados tiempo con una precisión de alrededor de una décima de segundo. 1003 00:48:25,792 --> 00:48:27,950 Ahora décimo de un segundo es un número interesante 1004 00:48:27,950 --> 00:48:31,850 porque no se puede expresar exactamente en binario, que 1005 00:48:31,850 --> 00:48:36,500 significa que no se puede expresar exactamente en cualquier computadora digital moderna. 1006 00:48:36,500 --> 00:48:41,070 Es difícil de creer, pero utilizar esto como un ejemplo. 1007 00:48:41,070 --> 00:48:43,420 >> Tomemos el número de un tercio. 1008 00:48:43,420 --> 00:48:47,330 Una tercera no puede ser expresado en decimal exactamente. 1009 00:48:47,330 --> 00:48:52,060 Una tercera es 0.333 pasando para el infinito. 1010 00:48:52,060 --> 00:48:56,420 No hay manera de hacer eso con precisión absoluta en un decimal. 1011 00:48:56,420 --> 00:48:59,530 Ese es exactamente el tipo de problema eso sucedió en el Patriot. 1012 00:48:59,530 --> 00:49:04,040 Cuanto más tiempo el sistema funcionó, la se convirtió en el peor error de tiempo. 1013 00:49:04,040 --> 00:49:08,840 >> -Después 100 horas de funcionamiento, el error en el tiempo era sólo alrededor de un tercio 1014 00:49:08,840 --> 00:49:10,440 de un segundo. 1015 00:49:10,440 --> 00:49:14,150 Pero en términos de focalización de un misil que viaja a Mach 5, 1016 00:49:14,150 --> 00:49:18,560 que dio lugar a un seguimiento error de más de 600 metros. 1017 00:49:18,560 --> 00:49:21,870 Sería un error fatal para los soldados en Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> ¿Qué pasó se fue el lanzamiento de un Scud detectado por los satélites de alerta temprana, 1019 00:49:28,455 --> 00:49:32,710 y conocieron un Scud venía en su dirección general. 1020 00:49:32,710 --> 00:49:35,150 No sabían de dónde venía. 1021 00:49:35,150 --> 00:49:38,210 Ahora era hasta el radar componente del sistema Patriot 1022 00:49:38,210 --> 00:49:43,150 defender Dhahran localizar y pista del misil enemigo entrante. 1023 00:49:43,150 --> 00:49:44,561 >> -El Radar era muy inteligente. 1024 00:49:44,561 --> 00:49:46,560 En realidad, sería rastrear la posición de la Scud 1025 00:49:46,560 --> 00:49:48,930 y luego predecir dónde probablemente sería 1026 00:49:48,930 --> 00:49:51,380 la próxima vez que el radar envía un pulso a cabo. 1027 00:49:51,380 --> 00:49:53,040 Eso se llamaba la puerta de distancia. 1028 00:49:53,040 --> 00:49:57,620 >> -Entonces Una vez que el Patriot decide suficiente tiempo tiene 1029 00:49:57,620 --> 00:50:02,400 pasado a volver atrás y comprobar la siguiente ubicación para este objeto detectado 1030 00:50:02,400 --> 00:50:03,550 que se remonta. 1031 00:50:03,550 --> 00:50:07,820 Así que cuando se volvió al mal lugar, a continuación, no ve ningún objeto. 1032 00:50:07,820 --> 00:50:10,360 Y decide que no había objeto. 1033 00:50:10,360 --> 00:50:13,630 Que había una detección falsa y cae la pista. 1034 00:50:13,630 --> 00:50:16,970 >> -El Scud entrante desapareció desde la pantalla de radar, 1035 00:50:16,970 --> 00:50:20,200 y segundos después, se estrelló contra el cuartel. 1036 00:50:20,200 --> 00:50:22,570 El Scud mató a 28. 1037 00:50:22,570 --> 00:50:26,110 Fue el último despedido durante la primera Guerra del Golfo. 1038 00:50:26,110 --> 00:50:31,920 Trágicamente, el software actualizado llegaron al amanecer del día siguiente. 1039 00:50:31,920 --> 00:50:34,870 La falla de software tenía sido fijado, cierre 1040 00:50:34,870 --> 00:50:39,150 un capítulo en el atribulado la historia de los misiles Patriot. 1041 00:50:39,150 --> 00:50:40,030 >> [FIN REPRODUCCIÓN DE VÍDEO] 1042 00:50:40,030 --> 00:50:41,488 >> DAVID J. MALAN: Eso es todo por CS50. 1043 00:50:41,488 --> 00:50:42,820 Nos vemos el miércoles. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [REPRODUCCIÓN DE MÚSICA] 1046 00:50:50,370 --> 00:54:23,446