[REPRODUCCIÓN DE MÚSICA] DAVID J MALAN: Muy bien, bienvenidos de nuevo a CS50. Este es el comienzo de la segunda semana. Palabras de uno de nuestros amigos en el campus - si usted está interesado, posiblemente, ya sea ahora o en algún plazo futuro incluso, una vez más cómodo, la enseñanza los estudiantes de escuela media un poco algo sobre ciencias de la computación, hacer la cabeza a esa URL. Ellos tienen una especial necesidad en este momento de maestros, sobre todo si usted tiene tenido algún contacto con la informática. Así que recordar que la última vez, introdujimos unos tipos de datos en C, y es posible que haya empezado a obtener su manos sucias con éstos hasta ahora en el problema de establecer una. Y tuvimos un char. Así que en términos un tanto técnicos, lo que es un char como usted sabe que hoy en día? Así que es un personaje, sino de dejar que Más precisamente ahora. ¿Qué entendemos por carácter o char individual? Un carácter no numérico - por lo que no necesariamente. Resulta que los números pares, incluso puntuacion y las letras son representado con estos datos tipo conocido como un char. Así que no es necesariamente alfabético. ¿Sí? Así que es un carácter ASCII. Así que si piensas en la semana cero, cuando tuvimos nuestro byte de voluntarios venir y, o bien mantener las manos en alto o no todos, que representaban bits. Pero en conjunto como un grupo de ocho, representaban un byte. Y hemos introducido el concepto de ASCII en esa conferencia, que simplemente es una correspondencia entre números y letras. Y ASCII utiliza, como aquellos humanos implícitas, ocho bits para representar un carácter. Así consecuencia, si ocho bits pueden cada toma en uno de dos valores - cero o uno - eso significa que hay dos posibilidades para esta persona - cero o uno - dos para esta persona, dos para este persona, dos para éste. Así, un total de dos veces dos veces dos veces dos veces dos - así que dos el octavo en total. Así que hay un número total de caracteres 256 es posible que pueda representar con ocho bits. Ahora, aquellos de ustedes que hablan de Asia lenguas podrían saber que hay más personajes en el mundo que sólo As y Bs y Cs y Ds. Y, en efecto, ASCII no basta para una gran cantidad de idiomas del mundo. Pero más sobre esto en otro momento. Por ahora, sabemos que en C si desea para representar una letra, un pedazo de puntuacion, o simplemente algo de carácter en la naturaleza, se utiliza un char. Y es un byte u ocho bits. ¿Qué tal un int? Bueno, un int es un entero. ¿Cuántos bits, si usted recuerda, era un número entero típicamente? Cualquiera que recuerde? Así que es típicamente 32. En realidad, depende de la computadora que está utilizando. Sin embargo, en el aparato, y en una gran cantidad de computadoras, es 32 bits o cuatro bytes - ocho veces cuatro. Y ints sólo son utilizadas para almacenar números, ya sea negativos, positivo, o cero. Y si tienes 32 bits y sólo preocuparse por los números positivos, puede nadie Ballpark cuántos posible enteros una computadora pueden representar de cero en un máximo? Por lo que sería de dos a la 32, que es aproximadamente cuatro mil millones. Así pues, estas potencias de dos van a ser temas recurrentes en ciencias de la computación. Como veremos, son bastante convenientes trabajar con incluso si no es bastante fácil de hacer los cálculos en la cabeza de uno. Así que vamos a decir más o menos cuatro mil millones. Ahora, desde hace mucho tiempo - usted puede clase de adivinar. Es más largo que un int. ¿Cuántos bits? Así que 64 bits o de ocho bytes. Esto sólo significa que usted puede representar incluso números más grandes, más grande positivo o los números negativos más grandes. Y ¿qué hay de flotación? Eso es un punto flotante valor de 32 bits. Esto es sólo un número real, algo con un punto decimal. Pero si en vez necesita más lugares después de la coma decimal o desea representar un número más grande con algunos fracción después de ella, se puede utilizar un doble, que es de 64 bits. Pero hay una interesante comida para llevar aquí. Así que si ints están limitados por 32 bits y incluso largos largos están limitados por 64 bits, ese tipo de plantea la pregunta, ¿qué pasa si usted realmente desea contar superior a 4 millones de dólares para un int? Bueno, sólo tiene que utilizar un largo tiempo. Pero lo que si usted quiere contar más de dos a la 64, más o menos? Ahora, eso es un número enorme. Pero con el tiempo, es posible que en realidad se preocupan por este tipo de valores, especialmente si usted está utilizando una base de datos y comenzando a recoger montones y montones y un montón de datos y asignar único números a cada pieza de que los datos. Así que como que tienen un problema. Y del mismo modo, con coma flotante valores - flotadores o dobles - si sólo tiene un número finito de bits, la cantidad de números totales podrían usted posiblemente represente? Bueno, es menos claro cuando se involucrar a un punto decimal. Pero es sin duda finito. Si usted tiene un número finito de bits, un número finito de los seres humanos, un finito número de bombillas, seguro que puede sólo representar un número finito de valores de punto flotante. Pero, ¿cuántos números reales son su en el mundo? Hay una infinita. Así que eso es un poco de un problema, ya que no tienen una cantidad infinita de de memoria o la memoria RAM en el interior de nuestros ordenadores. Así que algunas cosas difíciles pueden suceder. Así que vamos a seguir adelante y tratar de expresar esto aquí. Déjame ir por delante, ya abrir gedit. Voy a seguir adelante y guardar un archivo llamado "floats0.c" sólo para estar coherente con un ejemplo que es disponible en línea, si usted desea. Y yo voy a seguir adelante y definirlo de la siguiente manera - Voy a seguir adelante y decir, int void main, como hacemos a menudo. Y luego, en este programa, voy a declararme un flotante, por lo que una de 32 bits variable llamada f, arbitrariamente. Y luego me voy a guardar en ella No sé, una décima, por lo que 0.1. Así que voy a expresar que como uno dividido por 10, que es perfectamente legítimo en C. Y luego, en la segunda línea, simplemente desee imprimir ese valor. Así recordamos que podemos utilizar printf familiar. No quiero usar% i para un int. Queremos utilizar% f para un flotador. Y luego me voy a hacer barra invertida n, Cierre de comillas, comas, f, punto y coma. Así que aquí está mi programa. Ya hay un error. ¿Alguien para quien este hecho clic ya quiero señalar, al menos, un error que he hecho? ¿Sí? Sí. Me olvidé "# include" en la cima, síntoma de que si trato de Compile este va a ser que el compilador va a gritar a mí, diciendo símbolo indefinido o algo en ese sentido. No entiende algo como printf. Así que voy a hacer "# include ", Guarde el archivo. Y ahora está en mejor forma. Pero también voy a señalar cabo un nuevo detalle en la actualidad. Además de especificar el lugar titulares como% f% i% s, se puede a veces influir en el comportamiento de ese marcador de posición. Por ejemplo, en el caso de un flotante valor del punto, si sólo quiero para mostrar un decimal después de la período, puedo realmente hacer 0.1f. En otras palabras, me separo del fy el signo de porcentaje con un 0,1, sólo diciendo printf, es posible que tenga un todo montón de números después de la coma decimal punto para mí. Pero yo sólo quiero ver a uno de ellos. Así que voy a seguir adelante ahora y ahorre este programa, entrar en mi terminal ventana, y voy a seguir adelante y el tipo de maquillaje float 0, entrar. Veo esa línea un tanto críptico que comenzará a tener más sentido a medida que embromar aparte esta semana y la próxima. Ahora voy a seguir adelante y ejecutar flotador cero. Y, maldita sea. Así que hay otro error aquí por alguna razón. Estoy bastante seguro de que una décima parte, o uno dividido por 10, no es 0.0. Tal vez estoy sin mirar a suficientes dígitos. Entonces, ¿por qué no decir dos 0.2 para ver dos decimales en lugar de uno solo. Déjame volver a mi ventana de terminal aquí y golpeó un par de veces para ver a mi historia. No se debe hacer cero flotador otra vez, y luego hacia arriba otra vez. Y ahora entrar. Y ahora estoy bastante seguro de que esto está mal. Y lo que podía hacer tres y cuatro, y estoy probablemente va a seguir viendo a ceros. Entonces, ¿dónde está el error? Una dividido por 10 debe ser 0,1. Alguien quiere tomar una puñalada en lo la cuestión fundamental es? ¿Sí? Los dos son números enteros. ¿Y qué? Así que con uno dividido por 10, que es lo que hago en la aritmética. Y consigo 0.1. Sí. Y así es en verdad esa cuestión. Cuando usted toma un entero en un ordenador y lo divides por otro número entero, el ordenador por defecto va a suponga que desea un entero. El problema, sin embargo, por supuesto, es 0,1 que no es un número entero. Es un número real. Y así lo hace la computadora por por defecto es simplemente tira a la basura todo después del punto decimal. No redondear hacia arriba o abajo en sí. Simplemente tira a la basura todo lo después del punto decimal. Y ahora que eso tiene sentido. Porque ahora estamos claramente izquierda con cero. Pero espere un minuto. No estoy viendo a un cero int. En realidad estoy viendo 0.00. Entonces, ¿cómo conciliar esto ahora? Si uno dividido por 10 es igual a cero, pero estoy ver 0.00, ¿dónde está recibiendo convertida de nuevo a un número real? Sí. Exactamente. Así que aquí, en la línea cinco, cuando en realidad almacenar que 0,1, que es luego truncado a cero, en el interior de un flotador, eso es efectivamente equivalente a almacenamiento, no como un int, pero, de hecho, como un flotador. Por otra parte, estoy a continuación, utilizando printf para imprimir explícitamente ese número a dos decimales a pesar de que hay podría no ser en realidad hay. Así que este tipo de mierda, ¿no? Al parecer, no se puede hacer matemáticas, al menos en este nivel de de precisión, en un ordenador. Pero sin duda hay una solución. ¿Cuál es la solución más simple que podríamos tal vez hacer, aunque sólo sea de forma intuitiva para solucionar esto? ¿Sí? A su vez los números enteros en - sí. Aunque no estoy muy seguro de lo que es realmente está pasando aquí, si fundamentalmente tiene que ver con estos dos siendo ints, bueno, ¿por qué no me hacer que 10,0, haciendo de este 1.0, vuelva a guardar el archivo. Permítanme volver a la parte inferior y recompilar. Permítanme ahora volver a ejecutar. Y allí - Ahora, tengo mi décimo representado como 0.10. Está bien. Así que eso no es malo. Y permítanme señalar otra manera podríamos haber resuelto esto. Déjame en realidad lograr la regresión en el tiempo a cuando teníamos esto como uno décimo hace un momento. Y déjame seguir adelante y volver a guardar el archivo como un nombre de archivo distinto, sólo para tener un poco de control. Así que esa fue la versión uno. Y ahora déjame ir adelante y hacer una versión más. Vamos a llamar a esta versión dos indexados cero. Y yo voy a hacer en lugar esto - ¿sabes qué? Adición de punto cero funciona en este caso. Pero supongamos que fuera una variable. Supuesto 10 eran una variable. En otras palabras, supongamos que yo no podía simplemente codificar 0,0 al final de esta expresión aritmética. Bueno, puedo realmente hacer algo paréntesis se llama casting. Puedo lanzar ese número entero de 10 a un flotador, y puedo lanzar ese número entero de uno a un flotar, también. A continuación, la matemática que va a hacer es efectivamente 1.0 dividido por 10.0, el resultado de que va en f como antes. Así que si a compilar esto como hacer carrozas 2, y ahora flotadores 2, me sale el mismo responder, también. Así que este es un ejemplo bastante artificiosa, para resolver este problema mediante la introducción de colada. Pero, en general, de fundición va a ser algo muy poderoso, especialmente para problema fijó dos en el tiempo de una semana, cuando desea convertir un tipo de datos otro que al final de la día se representan de la misma manera. Al final del día, todos y cada uno Lo que hemos hablado hasta ahora es sólo intercepciones debajo de la capucha. O si eso es demasiado de bajo nivel para tú, que eres más que números debajo de la capucha. Incluso los personajes, una vez más, el recuerdo a partir de la semana cero, son números debajo de la capucha. Lo que quiere decir que puede convertir entre diferentes tipos de números si son sólo bits. Podemos convertir entre números y las cartas si son simplemente bits, y viceversa. Y echando de esta manera es un mecanismo en la programación que le permite a la fuerza cambiar un tipo de datos a otro. Desafortunadamente, esto no es tan sencillo como podría haber gustado. Voy a volver a entrar en los flotadores 1, que era la más simple, más uno sencillo con 0.0 añade a cada uno. Y así como un repaso rápido, déjame ir por delante y volver a compilar esto, hacen carrozas 2 - lo siento, esto es hacer carrozas 1. Y ahora vamos a correr carrozas 1. Y en la parte inferior, el aviso que, efectivamente, me pongo 0.1. Así, problema resuelto. Pero no todavía. Ahora voy a ser un poco curioso, y voy a volver a mi sentencia printf y por ejemplo, ¿sabes qué? Me gustaría confirmar que esta es realmente una décima parte. Y yo voy a querer ver esta a, digamos, cinco decimales. No es un problema. Cómo cambio el dos a cinco, Yo a compilar con maquillaje. Me ejecútelo nuevamente como flotadores 1. Mirando bastante bueno. Mis comprobaciones de sanidad podría terminar allí, pero Me estoy poniendo un poco más aventurero. Voy a cambiar 0,5-0,10. Quiero ver 10 dígitos después el lugar decimal. Y yo voy a seguir adelante y volver a compilar esto y vuelva a ejecutar flota 1. Yo como que me arrepiento de haber probado este más porque mis matemáticas no es tan corregir más, parece. Pero espere un minuto, tal vez eso es sólo una casualidad. Tal vez el equipo está actuando un poco extraño. Déjenme seguir adelante y hacer 20 puntos decimales y asegurarme de que sé cómo hacer matemáticas. Yo sé cómo programar. Hacer carrozas 1, recompilar, y maldita sea. Eso es realmente, realmente llegar lejos de la marca. Entonces, ¿qué está pasando aquí? Intuitivamente, con base en nuestras suposiciones antes sobre el tamaño de los tipos de datos, lo que debe estar pasando aquí debajo de la capucha? ¿Sí? Exactamente. Si desea que esta mucha precisión, y eso es una diablos de un montón de precisión - 20 números después del punto decimal. Usted no puede representar una número arbitrario menos que tenga una número arbitrario de bits. Pero no lo hacemos. Para un flotador, sólo tenemos 32 bits. Así que si 32 bits de sólo pueden ser permutados en un manera - al igual que nuestros seres humanos en, etapa manos arriba o hacia abajo - en un número finito de maneras, sólo hay un número finito de los números reales se pueden representar con esos bits. Y así, el equipo con el tiempo se va a tener que empezar a cortar las esquinas. El ordenador puede ocultar esos detalles de nosotros por un poco de tiempo. Pero si empezamos a meter a los números y mirando cada vez más lejos en el números de salida en todo el número, entonces empezamos a ver que es en realidad se aproxima a la idea de una décima parte. Y así resulta que, trágicamente, hay un número infinito de números no podemos representar, precisamente, en un ordenador, por lo menos con un finito número de bits, un finito cantidad de RAM. Ahora, por desgracia, esto a veces tiene consecuencias en el mundo real. Si las personas no llegan a apreciar este o una especie de dar por sentado el hecho de que su equipo acaba de hacer lo que le dicen que hacer y no hacer entender estos subyacente detalles de representación - que, francamente, en algunas lenguas son ocultas para el usuario, a diferencia de en C - algunas cosas malas pueden suceder. Y lo que pensé que lo haríamos es dar un paso atrás. Y se trata de una video de ocho minutos. Se emitió hace unos años, y da penetraciones en realidad lo que puede salir mal cuando se siguen subestimando estos tipo de detalles en el todo-demasiado mundo real. Si pudiéramos apagar las luces durante unos pocos minutos. ALTAVOZ 1: Ahora volvemos a la ingeniería los desastres en Modern Marvels. Computadoras - que todos hemos llegado a aceptar la problemas a menudo frustrantes que van con ellos. Insectos, virus y fallos de software son pequeños precios para pagar el conveniencia. Pero en la alta tecnología y de alta velocidad programa militar y el espacio aplicaciones, el problema más pequeño puede ser ampliada hacia el desastre. El 4 de junio de 1996, los científicos dispuestos a lanzar un cohete Ariane 5 no tripulado. Transportaba satélites científicos diseñados para establecer con precisión cómo interactúa campo magnético de la Tierra con los vientos solares. El cohete fue construido para el Europeo Agencia Espacial y despegó de su instalación en la costa de la Guayana Francesa. JACK Ganssle: En unos 37 segundos de iniciado el vuelo, que notó por primera vez algo iba mal. Las boquillas se gira sobre un eje en de manera que en realidad no debería. Alrededor de 40 segundos de vuelo, claramente que el vehículo estaba en problemas. Y fue entonces cuando se hizo una decisión de destruirlo. El oficial de seguridad de gama, con enormes tripas, presiona el botón, explotó el cohete antes de que pudiera convertirse en un peligro para la seguridad pública. ALTAVOZ 1: Este fue el primer viaje del Ariane 5, y su destrucción se llevó a cabo debido a un defecto incorporado en el software del cohete. JACK Ganssle: El problema en el Ariane era que no había 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 fue va a ser muy grande, que la mayoría de esos dígitos en el de 64 bits número eran ceros. Estaban equivocados. ALTAVOZ 1: La incapacidad de un software programa para aceptar el tipo de número generado por otra era en la raíz de la falla. El desarrollo de software se había convertido en una muy costosa parte de la nueva tecnología. El cohete Ariane 4 había sido muy éxito, por lo que gran parte del software creado para ella también era utilizado en el Ariane 5. PHILIP COYLE: El problema básico era que el Ariane 5 fue más rápido, acelerado más rápido. Y el software no tenía representaron para eso. ALTAVOZ 1: La destrucción del cohete fue un gran desastre financiero, todo se debe a un error de software minutos. Pero esta no era la primera vez datos problemas de conversión habían plagado moderna la tecnología de cohetes. JACK Ganssle: En 1991, con el inicio de la primera Guerra del Golfo, la Patriot misiles experimentó una clase similar de un problema de conversión de número. Como resultado, 28 soldados estadounidenses fueron murieron y unas 100 resultaron heridas cuando el Patriot, que se suponía para proteger contra Scuds entrantes, dejado de disparar un misil. ALTAVOZ 1: Cuando Iraq invadió Kuwait y América lanzó Tormenta del Desierto en principios de 1991, las baterías de misiles Patriot fueron desplegados para proteger a Arabia Saudita e Israel desde Irak Scud ataques con misiles. El Patriot es un medio de alcance EE.UU. sistema tierra-aire fabricados por la empresa Raytheon. Teodoro: Postol: El tamaño de la Patriot interceptor en sí es más o menos 20 pies de largo. Y pesa alrededor de 2000 libras. Y lleva una ojiva de alrededor de - Creo que es alrededor de 150 libras. Y la propia cabeza de combate es un que tiene alto explosivo fragmentos alrededor. La carcasa de la cabeza de combate está diseñada para actuar como perdigones. ALTAVOZ 1: Los misiles se llevan cuatro por contenedor y son transportados por un semirremolque. PHILIP COYLE: El anti-misiles Patriot sistema vuelve al menos 20 años. Fue diseñado originalmente como un misil de defensa aérea para derribar aviones enemigos. En la primera Guerra del Golfo, cuando esa guerra llegó, el Ejército quería usarlo para derribar misiles Scud, no aviones. La fuerza aérea iraquí no era tanto de un problema. Pero el Ejército estaba preocupado por misiles Scud. Y por lo que trató de actualizar la Patriot. ALTAVOZ 1: Interceptar un misil enemigo viajando a mach cinco se va a ser un reto suficiente. Pero cuando el Patriot se precipitó en servicio, el Ejército no estaba al tanto de un Modificación iraquí que hizo su Scuds casi imposible de golpear. Teodoro: Postol: Lo que pasó es los Scud que eran venir en eran inestables. Fueron desplazamiento. La razón de esto era que los iraquíes, en Para conseguir 600 kilometros fuera de un 300 kilómetros de alcance de los misiles, tomó peso de la ojiva delantera. Hicieron la ojiva más ligero. Así que ahora la Patriot está tratando venir en el Scud. Y la mayoría de las veces, la abrumadora mayoría de las veces, lo haría sólo volar por el Scud. ALTAVOZ 1: Una vez que el sistema Patriot los operadores se dieron cuenta de la Patriot se perdió su objetivo, que detonaron los Patriots ojiva para evitar posibles bajas si se permitía a caer al suelo. Teodoro: Postol: Eso fue lo que más personas vieron como grandes bolas de fuego en el cielo e incomprendido como intercepta de ojivas Scud. ALTAVOZ 1: Aunque en los cielos nocturnos Patriots parecían ser exitosamente la destrucción de los misiles Scud, en Dhahran allí podría haber error sobre su rendimiento. No, el sistema de radar del Patriot perdido 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 el más largo es el sistema de estaba en, mayor es la discrepancia de tiempo se convirtió por un reloj incrustado en el ordenador del sistema. JACK Ganssle: Unas dos semanas antes de la tragedia en Dhahran, los israelíes reportado al Departamento de Defensa que el sistema estaba perdiendo el tiempo. Después de ocho horas de funcionamiento, se dieron cuenta de que el sistema está que se vea con 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 hace mucho tiempo. Ocho horas? 10 horas? 1000 horas? Nadie sabía. ALTAVOZ 1: La batería Patriot estacionado en el cuartel de Dhahran y su reloj interno defectuoso había sido en más de 100 horas en la noche de 25 de febrero. JACK Ganssle: Se rastreó el tiempo a una precisión de una décima de segundo. Ahora, una décima de segundo es un número interesante, ya que no puede ser expresado en binario exactamente, lo que significa 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 se puede expresar en decimal exactamente. Una tercera es 0,333 curso en el infinito. No hay manera de hacer eso con la precisión absoluta en decimal. Ese es exactamente el mismo tipo de problema eso sucedió en el Patriot. Cuanto más tiempo el sistema funcionó, la se convirtió en el peor error de tiempo. ALTAVOZ 1: Después de 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 viajando a mach cinco, que dio lugar a un error de seguimiento de más de 600 metros. Sería un error fatal para los soldados en Dhahran. Teodoro: Postol: Lo que pasó es un Lanzamiento Scud fue detectado a principios de satélites de alerta. Y sabían que el Scud venía en su dirección general. Ellos no sabían de dónde venía. ALTAVOZ 1: Corresponde ahora al radar componente del sistema Patriot defensa de Dhahran para localizar y mantener pista del misil enemigo entrante. JACK Ganssle: El radar era muy inteligente. En realidad, sería realizar un seguimiento de la posición de el Scud y luego predecir donde probablemente sería la próxima vez el radar envía un pulso a cabo. Eso se llamaba la puerta de distancia. Teodoro: Postol: Entonces una vez que el Patriot ha pasado decide tiempo suficiente para ir atrás y comprobar la siguiente ubicación para este objeto detectado, vuelve. Así que cuando se volvió al mal lugar, a continuación, ve ningún objeto. Y se decide que no había objeto, que era una falsa detección, y gotas de la pista. ALTAVOZ 1: El Scud entrante desapareció desde la pantalla de radar, y segundos más tarde se estrelló a la fortaleza. El Scud mató a 28 y fue el último despedido durante la primera Guerra del Golfo. Trágicamente, el software actualizado llegó en Dhahran el día siguiente. La falla de software se ha fijado, cerrando un capítulo en la conflictiva la historia de los misiles Patriot. Patriot es en realidad un acrónimo para Phased array de seguimiento Intercepción de Target. DAVID J MALAN: Muy bien, por lo que un ejemplo aleccionador, para estar seguro. Y, afortunadamente, éstos nivel inferior insectos no son algo que vamos a normalmente tienen que apreciar, sin duda no con algunos de nuestros más temprana de los programas. Más bien, la mayoría de los errores que voy a encuentro será lógico en la naturaleza, sintáctica en la naturaleza mediante el cual el código simplemente no funciona bien. Y tú lo sabes muy rápido. Pero sobre todo cuando llegamos a la final del semestre, que va a vuelto más y más de una posibilidad de realmente pensar mucho sobre el diseño de sus programas y la subyacente representación allí, también, de los datos. Por ejemplo, vamos a introducir MySQL, que es un motor de base de datos populares que se puede utilizar con los sitios web a almacenar datos en el back-end. Y usted tendrá que empezar a decidir en Al final del semestre, no sólo lo que tipos de datos a lo largo de estas líneas para utilizar pero exactamente cuántos bits de usar, si desea almacenar fechas como fechas y horas como veces, y también cosas como qué tan grande es lo que quieres de la identificadores únicos a ser para, por ejemplo, los usuarios en su base de datos. De hecho, si algunos de ustedes han tenido Cuentas de Facebook desde hace bastante tiempo, y usted sabe cómo acceder a tu ID de usuario - que a veces se manifiesta en su URL del perfil a menos que haya elegido un apodo de la URL, o si usted tiene Graph API usadas de Facebook, la API disponible para el público por el cual se puede pedir Facebook para datos en bruto - se puede ver lo que su identificación numérica es. Y hace unos años, Facebook esencialmente tuvo que cambiar el uso de el equivalente de enteros a la utilización a largo largo, porque con el tiempo ya que los usuarios vienen e ir a crear un montón de cuentas y cuentas falsas, incluso ellos con mucha facilidad fueron capaces de agotar algo así como un 4 mil millones de valor posible como un int. Así que más en este tipo de cuestiones en el camino, también. Muy bien, así que estaba echando. Esa fue la imprecisión. Un par de anunciar. Así secciones comienzan formalmente el próximo Domingo, lunes, martes. Usted escuchará a través de correo electrónico a finales de este semana en cuanto a su asignación de sección. Y usted también aquí en ese momento cómo para cambiar su sección si su horario ha cambiado o su nivel de comodidad ahora ha cambiado. Mientras tanto P-establecer uno y Hacker uno son debido de este jueves con la opción de prorrogar este plazo por el especificaciones a viernes de una manera típica. Se dan cuenta que se incluye con el problema especificaciones establecidas son las instrucciones de cómo utilizar el aparato CS50, marca, así como algunas herramientas específicas CS50 como el estilo 50, que le puede proporcionar con realimentación dinámicamente en el calidad de su estilo de código y también comprobar 50, lo que puede ofrecerle retroalimentación dinámica en cuanto a su corrección de código. Perdonamos que todavía estamos planchar unos pocos problemas con el registro 50. Algunos de sus compañeros de clase que se inició alrededor de las cuatro de la mañana del viernes por la noche cuando la especificación subió han notado desde entonces algunos errores que estamos trabajando a través de, y disculpas por cualquier persona que ha experimentado frustraciones innecesarias. La culpa es mía. Pero vamos a dar seguimiento a la CS50 discutir cuando eso se resuelva. Así que la palabra en sí mismos puntajes. Así que va a ser una semana o dos antes de que empezar a obtener información sobre los boletines de problemas porque usted todavía no tiene un compañero de la enseñanza. Y aun así, vamos a empezar a evaluar el problema C establece antes de que volver atrás y evaluar cero, por lo que se obtiene más relevante una retroalimentación más rápida. Pero, en general, por el plan de estudios, CS50 boletines de problemas se evalúan a lo largo del después de cuatro ejes - ámbito de aplicación, corrección, diseño y estilo. Ámbito de aplicación va a ser un número normalmente entre cero y cinco que capta la cantidad de la pieza que poco apagado. Normalmente, se desea que esta sea de cinco años. Usted por lo menos intentado todo. Y note que es un factor multiplicativo de manera que haciendo sólo una parte de la conjunto de problemas no es la mejor estrategia. Mientras tanto, más obvio es el importancia de corrección - simplemente es su programa correcto con respecto a la especificación? Esto se pondera deliberadamente más pesadamente que los otros dos ejes por una factor de tres, ya que reconocemos que por lo general va a pasar un mucho más tiempo a perseguir a algunos errores, conseguir su código para trabajar, entonces usted son sangría y eligiendo nombres de variables adecuadas y la similares, que está en el otro extremo del espectro de estilo. Eso no quiere decir que el estilo no es importante, y vamos a predicar la vuelta tiempo, tanto en las clases teóricas y en las secciones. Estilo se refiere a la estética de su código. ¿Ha elegido variables bien nombradas- que son cortos pero algo descriptivo? ¿Está su código con sangría como hemos visto en conferencia y de una manera consistente con el estilo de los 50? Por último es diseño adecuado allí en medio. El diseño es el más difícil de poner un el dedo en porque es mucho más subjetiva. Pero es quizás la más importante de los tres ejes en términos de pedagogía valor con el tiempo y que este será oportunidad del becario a la enseñanza proporcionarle retroalimentación cualitativa. De hecho, en CS50 aunque sí tenemos estas fórmulas y resultados, al final del día estos son muy deliberadamente muy pequeños cubos - valores puntuales entre cero y tres y cero y cinco. Nosotros no tratamos de trazar líneas muy gruesas entre los boletines de problemas o entre estudiantes, sino más bien se centran tanto como podemos en cualitativo, escritura común a mano retroalimentación, ya sea escrita a máquina o verbal por parte de su compañero de enseñanza en particular, usted llegará a conocer muy bien. Pero, en general, esos son los pesos que los diversos ejes tendrán. Mientras tanto, también, vale la pena tener en importa que usted no debe suponer que un tres de cada cinco es un 60% y por lo tanto, más o menos en su defecto. Tres está destinado deliberadamente a ser tipo de medio de la carretera buena. Si usted está recibiendo tres en tres en el a partir del semestre, eso es de hecho la intención de ser un buen lugar para comenzar. Si usted está recibiendo dos, ferias, hay sin duda algo de trabajo para pagar un poco más atención, para aprovechar de secciones y horas de oficina. Si usted está recibiendo cuatro patas y de cinco en cinco grandes. Pero en realidad, esperamos ver trayectorias entre los alumnos - muy individualizado por alumno, pero a partir el semestre aquí en una especie de los dos a la tres gama pero terminando aquí, en el rango de cuatro a cinco. Eso es lo que realmente estamos buscando. Y nosotros mantenemos en mente que el delta que expones entre la semana cero y la semana 12 cuando estoy haciendo notas. No nos importa en absoluto cómo que justo al comienzo si su trayectoria es de hecho hacia arriba y fuerte. La honestidad académica - así que me puse el más grave la voz por un momento. Así que este curso cuenta con la distinción de enviando más estudiantes que cualquier otro en la historia en el tablero de anuncios, creo. Hemos perdido la cuenta de la especie en este punto de con qué frecuencia ocurre esto. Y eso no es porque los estudiantes en el 50 son más deshonesto que su compañeros de clase en otras partes. Pero damos cuenta, también, que somos muy buenos en la detección de este tipo de cosas. Y esa es la ventaja de que un clase de informática tiene en que podemos y hacemos comparar todos los estudiantes boletines de problemas por pares contra cada otros, no sólo este año pero todos los años anteriores. Tenemos la capacidad, al igual que los estudiantes en la clase, para Google y para encontrar el código en sitios como GitHub y foros de discusión. No hay absolutamente soluciones a CS50 de p-conjuntos flotando allí. Pero si usted puede encontrarlos, podemos encontrarlos. Y todo esto está muy automatizado y fácil y triste para nosotros encontrar. Pero quiero destacar, también, que el la política de honestidad académica del curso es mucho destinado a ser mucho lo contrario de ese espíritu. De hecho, este año hemos reformulado las cosas en el plan de estudios para ser este, punto punto punto, con más detalle en el plan de estudios. Pero el tema principal en el curso realmente es ser razonable. Reconocemos que existe una significativa cantidad de pedagógica valor en colaborar, en cierta medida, con compañeros de clase, mediante el cual se dos o tres o más es de pie en un tablero blanco pizarras, por así hablar, sus ideas - escribir pseudocódigo en imágenes, Diagramación lo que debería ser si Mario tuviera que escribirlo primero en pseudocódigo. ¿Qué le debo el algoritmo codicioso - ¿cómo debe comportarse por problema establece una? Y así darse cuenta de que el comportamiento que fomentemos es muy tanto a lo largo de esas líneas. Y en el programa, verá una manojo entero de viñetas bajo un categoría razonable y una no razonable categoría que nos ayuda a ayudar a envolver su mente alrededor de donde hacemos dibujar esa línea. Y, en general, una regla decente de pulgar es que si usted está luchando para resolver algunos errores y tu amigo o compañero de clase se sienta a tu lado, es razonable que usted le muestre su código y decir, hey, ¿puedes ayudar Me gustaría saber lo que va mal aquí? Nosotros no suelen comprender el lado opuesto. No es una respuesta correcta para su amigo o compañero de clase aquí para decir, oh, basta con mirar en la mina y en la figura hacia fuera de eso. Eso es una especie de irrazonable. Pero tener a alguien más, otro cerebro, otro par de ojos mire su pantalla o vistazo a su código y decir, ¿estás seguro de que quieres tener un bucle aquí? O ¿estás seguro de que quieres que coma aquí? O oh, ese mensaje de error significa esto. Esos son muy razonables y comportamientos alentados. Los casos a los que estaba aludiendo a anteriormente se reducen a cuando los estudiantes están a altas horas de la noche haciendo un juicio pobre decisiones y enviar por correo electrónico su código para otra persona o simplemente diciendo: aquí, es en Dropbox o Buscar en Google a altas horas de la noche. Y así me gustaría animar y pedir de ustedes, si usted tiene los inevitables momentos de tensión, que están chocando en contra de la fecha límite, no tienes fines de día, ya que es ya el viernes en que punto, enviar por correo electrónico las cabezas de los cursos o yo directamente. Diga, escucha, estoy en mi punto de ruptura aquí. Vamos a tener una conversación y entenderlo. Recurrir a la web o algún otro no comportamiento razonable no es el solución, y demasiados de su compañeros de clase ya no están aquí en campus, debido a que la falta de juicio. Pero es muy fácil de eludir esa línea. Y aquí está una pequeña imagen para animar que desde Reddit modo que ahora todo va a estar bien. Así que un resumen rápido, entonces, de donde lo dejamos. Así que la semana pasada, recordamos que introducimos condiciones, no en scratch pero en C este tiempo. Y había una sintaxis nueva, pero Realmente no hay nuevas ideas en sí. Tuvimos expresiones booleanas que pudimos o junto con dos verticales bares o y junto con dos los símbolos de unión, diciendo que tanto la izquierda y el derecho debe ser verdad para este se ejecute. Luego tuvimos interruptores, que nos parecía en pocas palabras, pero yo propongo son realmente sólo sintaxis diferente para lograr el mismo tipo de objetivo si conoce de avanzar en lo que sus casos van a ser. Nos fijamos en los bucles. Un bucle para es tal vez el más común, o al menos la que las personas suelen alcanzar instintivamente. A pesar de que se ve un poco críptico, verás muchos, muchos ejemplos de este en poco tiempo, ya que tienes ya finales de la semana pasada. Mientras que los bucles pueden similarmente lograr lo mismo. Pero si usted quiere hacer cualquier incrementación o actualización de los valores de variables, que tienen que hacerlo manualmente más que el para bucle antes permite. Y luego está el bucle do-while, lo que nos permite hacer algo al menos una vez, mientras que algo lo demás es cierto. Y esto es particularmente bueno para programas o para los juegos en los que desea para solicitar al usuario por algo al menos una vez. Y luego, si él o ella no es capaz de cooperar, es posible que desee hacerlo una y otra vez. Con las variables, por su parte, teníamos líneas de código como este, lo que podría dos líneas. Usted podría declarar un entero llamado contador, punto y coma. O simplemente puede declarar y definirlo, por así decirlo. Darle un valor al mismo tiempo. Y luego, por último, hablamos acerca de las funciones. Y este es un buen ejemplo de el sentido de que ilustra dos tipos de funciones. Uno de ellos es getString (), que, de nuevo, para crear una cadena del usuario. Pero GetString () es bastante interesante, la medida en que lo hemos utilizado, porque siempre hemos usado con algo en el lado izquierdo de un signo igual. Es decir que GetString () devuelve un valor. Se devuelve, por supuesto, una cadena. Y luego en el lado izquierdo, estamos simplemente salvar esa cadena en el interior de un variable llamada nombre. Esto es diferente, en un sentido, desde printf printf porque, al menos en nuestro uso aquí, no devuelve nada. Como acotación al margen, no volver algo. Simplemente no nos importa lo que es. Pero tiene lo que hay llamado un efecto secundario. ¿Y cuál es ese efecto secundario en todos los caso que hemos visto hasta ahora? Lo que printf hacer? Se imprime algo a la pantalla, pantallas de texto o números, o algo en la pantalla. Y eso es sólo considerado como un efecto secundario porque en realidad no es la entrega de nuevo a mí. No es una respuesta dentro de las un cuadro negro que puedo entonces meter la mano en y agarrar. Es sólo que lo hace por su propia cuenta, y mucho como Colton estaba conectado a esta cuadro negro la semana pasada, y de alguna manera por arte de magia se dibujo en el tablero sin mí realmente involucrado. Eso sería un efecto secundario. Pero si en realidad tenía que llegar de vuelta en aquí y decir, ah, aquí está la cadena por parte del usuario, que haría ser un valor de retorno. Y hasta ahora sólo hemos utilizado las funciones que otras personas han escrito. Pero en realidad podemos hacer estas tipo de cosas nosotros mismos. Así que voy a ir a la Aparato CS50 de nuevo. Déjenme cerrar la pestaña que tenía abierto hace un momento. Y déjame seguir adelante y crear un nuevo archivo. Y yo voy a seguir adelante y llamar a esto una positive.c. Así que lo que quiero hacer algo con números positivos aquí. Así que voy a seguir adelante y hacer int - lo siento - # Include. No hagamos ese mismo confundir como antes. Int main (void), rizado abierta corsé, cerrado corchete. Y ahora quiero hacer lo siguiente. Quiero escribir un programa que insiste en que el usuario da me entero positivo. Así que no hay ninguna función GetPositiveInt en la biblioteca CS50. Sólo hay GetInt (). Pero eso está bien porque tengo la construcciones con las que puedo imponer un poco más limitación a ese valor. Yo podría hacer algo como esto. Así int n - y si usted está escribiendo a lo largo, sólo se dan cuenta Voy a volver y cambiar algunas cosas en un momento - así int n es igual a GetInt (). Y eso va a poner un int interior del n. Y permítanme ser una más descriptiva. Permítanme decir algo así como exijo que usted me da un número entero positivo. Está bien. Así que un poco de instrucciones. Y ahora ¿qué puedo hacer? Bueno, yo ya sabía de mi sencilla condiciones o ramas, al igual que yo tenido en Scratch, que pudiera decir algo Al igual que si n es menor que o igual a cero, entonces yo quiero hacer algo como, eso no es positivo. Y entonces lo que podía hacer - Bien, pero realmente quiero conseguir ese int. Así que podría ir hasta aquí y me pude tipo de copiar esto y sangra el siguiente. Y después, en Aceptar. Así que si n es menor que o igual a cero a hacer esto. Ahora, ¿qué pasa si el usuario no coopera? Bueno, entonces me voy a prestado esto aquí. Y luego voy aquí y aquí y aquí. Así que esto no es claramente la solución, ¿no? Porque no hay final a la vista. Si quiero exigir que el usuario dé me entero positivo, puedo conseguir realmente el int. Entonces puedo comprobar que int. Pero luego quiero verlo de nuevo y comprobar de nuevo y vuelva a comprobar. Así que, obviamente, ¿cuál es el mejor construir a utilizar aquí? Muy bien, así que algún tipo de bucle. Así que voy a deshacerme de casi todo esto. Y quiero conseguir este int al menos una vez. Así que voy a decir hacer - y voy a volver a la mientras que en un momento - ahora, ¿qué? Yo voy a hacer int n consigue GetInt (). Aceptar. Así que eso es bastante bueno. Y ahora ¿con qué frecuencia Yo quiero hacer esto? Permítanme poner el printf interior del bucle para que pueda exigir una y otra vez, si es necesario. ¿Y qué es lo que quiero esta mientras la condición que hacer? Quiero seguir haciendo esto mientras que lo que es el caso? Sí. N es menor o igual a cero. Así que ya, hemos significativamente limpiado el código arriba. Hemos prestado una construcción muy simple - el bucle do-while. Yo he robado sólo las líneas importantes de código que empecé a copiar y pegar, que no era prudente. Y ahora me voy a pegar en realidad es aquí y sólo lo hacen una vez. Y ahora, ¿qué es lo que quiero hacer en el el final de este programa? Sólo voy a decir algo simple como, gracias por el - y Haré% i para int - barra invertida n, coma, y ​​luego enchufe n, punto y coma. Está bien. Así que vamos a ver qué pasa ahora cuando ejecuto este programa. Voy a seguir adelante y no hacer positivo. Maldita sea. Unos pocos errores. Así que permítanme retroceder hasta la primera. No trabajar a través de ellos hacia atrás. Trabajar a través de ellos, de arriba hacia abajo no sea que caen en cascada y sólo una cosa sea incorrecto. Declaración implícita de la funcionar GetInt (). Sí. Así que no fue suficiente. Yo como que cometí el mismo error, pero un poco diferente esta vez. Necesito incluir no sólo stdio.h pero También cs50.h, que incluye la denominadas declaraciones de get int, que enseñar el aparato, o enseña C lo GetInt () es. Así que permítanme volver a guardar. Voy a pasar por alto los errores de otros porque voy a esperar que ellos son de alguna manera relacionados con el error Ya arreglé. Así que déjame ir por delante y volver a compilar con hacer positivo, Intro. Maldita sea. Tres errores, todavía. Permítanme desplazo hasta el primero. Sin usar la variable n. No hemos visto esto antes. Y esto, también, es un poco críptico. Esta es la salida del compilador. Y lo que puso de relieve la línea allí - positive.c :9:13 - es decir, se está diciendo en la línea nueve de positive.c, en el carácter 13, La columna 13, usted hizo este error. Y en particular, se está diciendo me variables sin usar n. Así que vamos a ver - línea de nueve. Estoy usando n en el sentido de que Te lo estoy dando un valor. Pero lo que el compilador no le gusta es que no me parece usarlo. Pero espere un minuto, lo estoy usando. En la línea 11, que estoy usando aquí. Pero si me desplazo hacia abajo aún más en positive.c :11 - por lo que en la línea 11, el carácter 12, la compilador de decirme, el uso de identificador no declarado n. Así que los medios no declarados que tengo no especificado como un variable con un tipo de datos. Pero espere un minuto. Hice exactamente eso en la línea nueve. Así que alguien está realmente confundido aquí. Es yo o el compilador porque en línea de nueve, de nuevo, estoy declarando una int n, y estoy asignándole el valor de retorno de GetInt (). Entonces estoy usando esa variable n en línea 11 y comprobar si su valor es menor que o igual a cero. Pero esto al parecer es malo y rota por qué? Dilo otra vez? Ah, tengo que declarar n antes entrar en el bucle. Pero ¿por qué? Quiero decir, sólo propuso hace poco que está bien para declarar variables todo en una línea y luego les asigne algún valor. Una variable global - volvamos a esa idea en un momento. ¿Por qué quieres que me ponga fuera del bucle? Lo es. Exactamente. Así, si bien, poco intuitivo, permítanme resumir. Cuando se declara n interior del bloque do allí - específicamente en el interior de esas llaves - esa variable n tiene lo que hay llamado scope - sin relación con nuestro sistema de puntuación en el por supuesto - pero tiene un alcance que es limitado a aquellas llaves. En otras palabras, por lo general si se declara una variable dentro de un conjunto de llaves, esa variable sólo existe dentro de esas llaves. Así que por esa sola lógica, a pesar de que He declarado n en línea nueve, que desaparece esencialmente de alcance, desaparece de la memoria, por así decirlo, por el tiempo llegué a la línea 11. Debido a que la línea 11, por desgracia, es fuera de esas llaves. Así que, lamentablemente, no puedo solucionar este problema que se remonta a lo que hice antes. Es posible que en un primer momento hacer esto. Pero lo que eres ahora, no haciendo cíclicamente? Es obvio que no está recibiendo el int cíclicamente. Así que podemos dejar la GetInt (), y se ausenten de la GetInt () dentro de la lazo, porque eso es lo que queremos molestar al usuario y otra vez. Pero eso no es suficiente para ir hasta la línea, por ejemplo, seis. Int. n, punto y coma. No le des un valor todavía, porque usted no necesita por el momento. Pero ahora aquí, aviso - esto sería un error muy fácil. No quiero que a la sombra de mi anterior declaración de n. Quiero usar el que n que realmente existe. Y por lo que ahora en la línea 10, Asigno n un valor. Sin embargo, en línea de seis, declaro n. Y así puedo yo o puede que no utilizarlo en la línea 12 ahora? Puedo porque entre los cuales rizado llaves se declaró n ahora? El uno aquí en la línea cinco. Para una aquí en la línea 14. Así que si ahora hago zoom, guardar el archivo, vaya de nuevo en funcionamiento y hacer positivo, compilado este momento. Así que eso es ya el progreso. Raya vertical. . / Positiva, Intro. Exijo que me das un número entero positivo. Negativo 1. Negativo 2. Negativo 3. Zero. Una. Y gracias por el uno es lo que está ahora impreso. Déjame intentar otra cosa, por curiosidad. Me ha informado a la entrada un entero. Pero ¿qué pasa si en vez escribo en cordero? Así que ahora ve un prompt diferente - vuelva a intentarlo. Pero en ninguna parte de mi código Qué escribí reintento. Así que, presumiblemente, es este reintento pedirá viene, qué le dirías? Sí, desde GetInt () en sí. Así que una de las cosas que el personal de la CS50 hace por usted, por lo menos en estos primeros semana, se nos han escrito una cierta cantidad de comprobación de errores para asegurarse de que si llame GetInt (), que por lo menos volver a un int del usuario. Usted no recibirá una cadena. Usted no recibirá un char. Usted no va a conseguir algo más en conjunto. Usted obtendrá un int. Ahora, puede que no sea positivo. Puede que no sea negativo. Nosotros no hacemos ninguna garantía en todo eso. Pero vamos a molestar al usuario que vuelva a intentarlo, reintento, vuelva a intentar hasta que él o ella realmente coopera. Del mismo modo, si lo hago 1.23, eso no es un int. Pero si yo escribo en, digamos, 50, que me da un valor que yo quería. Está bien. Así que no está mal. ¿Tiene preguntas sobre lo que acabamos de hacer? El ser clave para llevar, para ser claros, no tanto el bucle, lo que hemos visto antes a pesar de que no tenemos realmente utilizado, pero el tema de alcance, donde las variables sólo pueden ser sólo se puede utilizar dentro de cierto margen especificado. Muy bien, permítanme abordar la sugerencia que hizo previamente, la de un variable global. Como acotación al margen, resulta que otra solución a este problema, pero típicamente una solución incorrecta o una solución mal diseñado, es declarar la variable como lo que es llamada una variable global. Ahora estoy un poco de violar mi definición de alcance porque hay ni llaves en la parte superior y la parte inferior de un archivo. Pero la implicación de que es que ahora en la línea de cuatro, n es una variable global. Y como su nombre lo indica, es sólo accesible por todas partes. Rasguño en realidad tiene estas. Si ha utilizado una variable, se puede recordar tienes que elegir si es para este elemento sprite o para todos los sprites. Bueno, todos los sprites es sólo el más claro manera de decir global. ¿Sí? Ah, buena pregunta. Así que recordar que en la primera versión de mi código, cuando incorrectamente n declarado y definido en la línea de nueve - Declaré como una variable y yo le di un valor con el operador de asignación - esto me dio dos errores. Uno, el hecho de que no se utilizó N, y dos, que en la línea 11 es sólo que no fue declarada. Así que lo primero que yo no lo hice abordar en el momento. No es estrictamente un error declarar una variable pero no la use. Pero una de las cosas que hemos hecho en el aparato CS50, deliberadamente, pedagógicamente, es que hemos barrio sube el expectativas de que el compilador para hacer Asegúrese de que usted está haciendo las cosas, no sólo correctamente, pero en realidad correctamente. Porque si usted está declarando una variable como el uso de n y nunca, o usarla correctamente, entonces lo está haciendo allí? Realmente no sirve para nada. Y es muy fácil con el tiempo, si no configure su propio ordenador en de esta manera, tener sólo código que tiene pequeños remanentes aquí, los restos allí. Y luego, meses después, uno mira hacia atrás y usted es como, ¿por qué es esta línea de codificar allí? Y si no hay una buena razón, no usted o sus colegas no beneficiarse en el camino a tener que tropezar con él entonces. Como acotación al margen, ¿dónde está que viene? Bueno, recuerda que cada vez que compilamos programa, todas estas cosas es que se está imprimiendo. Así que vamos a volver a esto. Pero, de nuevo, hacer es una utilidad que automatiza el proceso de recopilación de ejecutar el compilador real llamado sonido metálico. Esta cosa, vamos a ver, finalmente, tiene que ver con la depuración con un especial programa que se llama el depurador. Esto tiene que ver con la optimización de la código - más sobre esto en el futuro. Std = c99 - esto sólo significa usar la versión de 1999 de C. C ha existido más tiempo que eso, pero hicieron algunas buenas Hace 10 años los cambios más. Y he aquí los relevantes. Estamos diciendo a hacer cualquier cosa que antes habría sido una advertencia un error que impide el estudiante de compilar. Y medios de pared hacen que para un manojo entero de las cosas, no sólo en relación con las variables. Y entonces déjame desplazo a el final de esta línea. Y esto, también, que finalmente va a volver a. Esta es, obviamente, el nombre de el archivo que estoy compilando. Esto recuerda el nombre del archivo Estoy salida como el nombre de mi programa ejecutable. Este lcs50 sólo significa usar el CS50 biblioteca, y los ceros y unos que el personal escribió y compiló antes este año, integrar ellos en mi programa. Y nadie sabe qué-lm es? Es la biblioteca de matemáticas, que es justo ahí, incluso si eres sin hacer nada de matemáticas. Está provisto sólo de forma automática que nos hacen. Bueno, déjame hacer otro ejemplo aquí mediante la apertura de un nuevo archivo. Y déjame guardar éste como string.c. Resulta que mientras hablamos de los datos tipos de hoy, aún hay más pasando por debajo de la campana lo que hemos visto hasta el momento. Así que permítanme rápidamente hacer un programa rápido. Incluya stdio.h. Y voy a guardar eso. Y ya sabes, no me dejes hacer el mismo error una y otra vez. Incluya cs50.h. Y déjame ir adelante ahora y hacer int main (void). Y ahora simplemente quiero hacer un programa que hace esto - declarar una cadena llamado s y obtener una cadena desde el usuario. Y permítanme hacer un poco de instrucciones aquí - por favor déme una cadena - así el usuario sabe qué hacer. Y luego aquí abajo por debajo de este, Quiero hacer lo siguiente - para int i en cero. Una vez más, los informáticos suelen empezar a contar desde cero, pero que pudimos hacer que uno si realmente queríamos. Ahora me voy a hacer i es menor que la longitud de la cadena de s. Así strlen - S-T-R-L-E-N - de nuevo, es concisa porque es más fácil para escribir, a pesar de que se trata de un poco críptico. Esa es una función que no hemos usado antes, pero, literalmente, hace que - volverá a mí un número que representa la longitud de la cadena que el usuario escribió. Si se escriben en hola, devolvería cinco porque hay cinco letras en hola. Entonces, en cada iteración de este bucle, i plus plus. Así que de nuevo, un estándar de construcción, incluso si usted no está muy cómodo o demasiado familiarizados con ella todavía. Pero ahora en cada iteración de este bucle, cuenta de lo que voy a hacer. Quiero seguir adelante y de impresión un solo personaje - por lo que la barra invertida% c n en una nueva línea. Y luego, ya sabes lo que quiero hacer? Cualquiera que sea la palabra es que el usuario en, como hola, Quiero imprimir H-E-L-L-O, un carácter por línea. En otras palabras, yo quiero entrar en el caracteres individuales de una cadena, por el cual hasta ahora una cadena tiene sólo sido una secuencia de caracteres. Y resulta que yo puedo hacer s, soporte, i, corchete de cierre, cerca paréntesis, punto y coma. Y yo tengo que hacer una cosa más. Está en un archivo llamado string.h que strlen se declara. Así que si quiero usar esa función, Tengo que decirle al compilador, esperar para usarlo. Ahora voy a seguir adelante y hacer el programa llamado cadena. Dot, barra, cadena. Por favor, dame una cadena. Voy a seguir adelante y escribe. Hola, en mayúsculas, Intro. Y ahora noto He impreso este un carácter después de la otra. Así que el nuevo detalle aquí es que una cadena, al final del día, puede ser visitada por medio de su individuo personajes mediante la introducción de la plaza notación de corchetes. Y eso es porque una cadena debajo el capó es de hecho una secuencia de personajes. Pero lo bueno de ellos es en la memoria RAM de su computadora - Mac, PC, lo que sea - son literalmente, espalda con espalda a la espalda - H-E-L-L-O - a nivel individual, adyacente bytes en la memoria. Así que si usted desea conseguir en la octava tales bytes, que en este bucle serían cero soporte, soporte de uno, soporte de dos, soporte de tres, cuatro bracket - eso es cero indexados hasta cinco - que va a imprimir H-E-L-L-O en su propia línea. Ahora, como un bromista, deja que te la muestro tipo de cosas que finalmente va a ser capaz de comprender, por lo menos con un poco de cerca buscando. Por un lado, lo que incluye en la actualidad de ejemplos, si lo desea, es en realidad una de las primeras fugas de la cárcel para el iPhone. Jailbreak significa descifrar el teléfono así que puedes usarlo en un diverso portador o instalar su propio software. Y te darás cuenta de que esto parece completamente críptica, más probable. Pero mira esto. Al parecer, el iPhone estaba roto con un bucle, una condición if, else condiciones, un manojo de funciones nosotros no hemos visto. Y de nuevo, no lo hará en primera vista, probablemente entender cómo esto está funcionando. Pero todo lo que tenemos suerte de tomar por sentado en nuestra vida moderna en realidad tiende a reducir, incluso a algunos de estos fundamentos que hemos estado mirar. Déjenme seguir adelante y abrir una otro programa, holloway.c. Así que esto, también, es algo que en realidad no debería saber. Incluso ninguno de los empleados o que pudiera probablemente resolver esto mirando porque éste era el código de otra que fue presentado a lo que es históricamente conocido como un ofuscado C concurso, en el que escribe un programa que compila y se ejecuta, pero es tan condenadamente críptica ningún ser humano puede entender lo que que va a hacer hasta que que en realidad ejecuta. Así que de hecho, si nos fijamos en este código, veo un interruptor. Veo principal. Veo estos corchetes implicando algún tipo de una matriz. ¿Alguien quiere adivinar lo que este programa en realidad lo hace si se me acaban Holloway? Sí. Aceptar. Bien hecho. Así que sólo el personal y yo no puedo entender lo que estas cosas hacen. Y ahora, por último, deja que me vaya por delante y abrir otro programa. Éste - de nuevo, vamos a hacer el código fuente disponible en línea - éste es sólo tipo de agradable a la vista. Todo lo que hicieron es presionar el barra espaciadora un poco. Pero este es el código real. Así que si usted piensa que eso es bastante, si realmente ejecutar este en el símbolo, finalmente verá lo que podría hacer cosas como esta. Así que os dejamos en esa nota y nos vemos el miércoles. [REPRODUCCIÓN DE MÚSICA] ALTAVOZ 2: En la siguiente CS50, la TFS escenifican un motín. ALTAVOZ 3: Ahí está. Sácalo! [REPRODUCCIÓN DE MÚSICA]