DAVID J MALAN: Todas derecha, por lo que este es CS50. Y esto es claramente un viernes. Y este es el final de la primera semana. Así que usted puede recordar que lo dejamos, la última vez, con un cliffhanger de clases. Por el cual exponemos esta mentira, que no importa lo que te han enseñado creciente arriba, 1 dividido por 10 no es, en De hecho, 0,1 o 0,100 o 0,10000. De hecho, si compilamos este programa, como lo hicimos ayer, con, hacer imprecisión, y luego hacer punto, raya vertical, imprecisión, nos enteramos de que esto es lo que hay 1 dividido por 10 es en realidad. Así que eso no es realmente el caso. Pero esto no hace alusión en algún limitación fundamental de las computadoras. Y, de hecho, entre los cosas que van a hacer hoy es echar un vistazo a por qué esto tiene sucedido, ¿qué implicaciones que esto tiene, cómo la humanidad ha fracasado comprender esto en algunos muy situaciones-grave el resultado de la cual ha sido bastante trágica y expensive-- y también echar un vistazo a la forma en que en realidad puede defender contra estos tipos de limitaciones. Así que de manera intuitiva, tal vez, por eso es 1 dividido por 10, de acuerdo a mi equipo aquí, no sólo 1.10, 0.10? Sí. ¿Qué piensas? MIEMBRO DE LA AUDIENCIA: La raíz es diferente? DAVID J MALAN: El lo que es? ¡Oh, la raíz es diferente? Así que no del todo. En realidad es más fundamental para el hardware. ¿Otros pensamientos? Sí. MIEMBRO DE LA AUDIENCIA: Ellos representar los números de manera diferente? DAVID J MALAN: Así ellos-- Derecho. Ellos representan números diferente. Inexacta, al parecer. Así que es-- Bueno, diferente a lo que? O ¿de quién? ¿De nosotros? MIEMBRO DE LA AUDIENCIA: Sí. No utilizan el decimal sistema para [inaudible]. DAVID J MALAN: OK. Así que en cierto sentido, no lo hacen utilizar el sistema decimal. Debajo del capó, todo lo que es, de hecho, binario, y eso es relacionado, de hecho. Pero es aún más simple explicación que eso. Sí. MIEMBRO DE LA AUDIENCIA: Ellos sólo tienen tantos bits. Sólo pueden almacenar hasta un cierto medida, al igual que con los decimales. DAVID J MALAN: Sí. Esto es lo que realmente está consiguiendo en ella. Resulta que los ordenadores generalmente, siempre lo hará solamente utilizar una cantidad finita de información para representar algo. ¿Correcto? Después de todo, sólo tenemos un fijo cantidad de espacio en disco duro. Sólo tenemos una cantidad fija de RAM, o memoria de la computadora. Y si sólo tiene un cantidad fija de algo, Seguramente usted no puede realmente contar hasta hasta el infinito o cualquier número que desee. Usted, clase de, tiene que escoger y elegir qué rango de los valores que van a apoyar. Y así, por ejemplo, una o dos semanas atrás, cuando hablamos de ASCII, Y hablamos de 8 bits o un byte, por así decirlo, el mayor número que pudimos representar con 8 bits fue qué? 255. Y podemos representar 256 valores totales pero no si pasamos a uno de ellos en 0-- Bueno, pero si pasar uno de ellos en 0, entonces el mayor número es, por supuesto, 255. Así que resulta, que esto es el caso también, en este contexto. Empezamos a hablar, la última vez, acerca de los números de punto flotante, que son diferentes de números enteros, en que tienen un punto decimal y, con suerte, algunos números después de eso, pero son demasiado. Una computadora es solamente normalmente va para utilizar 32 bits, tal vez 64 bits para representar un valor de punto flotante. Así que, aunque hemos crecido aprendizaje de las matemáticas y el conocimiento que puede tener absolutamente un número infinito de números después del punto decimal, no si tiene memoria finita. Usted, clase de, tiene que redondear, o elegir qué números que van a representar. Y por lo que se pueda imaginar, en cierto sentido, siendo este de la computadora más cercana aproximación al valor que décimo que puede conseguir, con tan sólo 32 o menos bits. Y no es sólo un décimo. Por ejemplo, si cambio esto 03.01, que creemos que es aún más simple. Así que 1 dividido por 3. Déjame guardar el archivo. Déjame ir por delante y recompilarlo. Y permítanme volver a ejecutarlo. También en este caso, al parecer, un tercio no es 0.3 y luego un número infinito de 3 de a partir de entonces. Usted tiene esta imprecisión al final. Así que nosotros, los humanos son correctas, y qué que aprendió es, de hecho, correcta, pero estamos chocando contra algunas limitaciones. Y lo que yo pensaba haríamos hoy, está empezamos examinado, francamente, el trágicas consecuencias de esta a veces, cuando la humanidad no acaba de poner en práctica de esta realidad y de estas limitaciones. Y vamos a ver una serie de viñetas desde el canal de la historia que se lleva a Una mirada a cómo las cosas han ido mal. Se trata de 8 minutos de duración, y vamos a volver después de este y echar un vistazo a exactamente ¿qué otra cosa puede ir mal. Si pudiéramos atenuar la lights-- [REPRODUCCIÓN DE VÍDEO] -Informática, Todos hemos llegado a aceptar los problemas a menudo frustrantes que ir con ellos. Errores, virus y software fallos son precios pequeños a pagar por la comodidad. Pero en la alta tecnología y de alta velocidad aplicaciones militares y programa espacial, el problema más pequeño posible magnificarse en el desastre. El 4 de junio de 1996, los científicos prepararon para lanzar un cohete Ariane 5 no tripulado. Llevaba científica satélites diseñados establecer con precisión cómo el Interactúa del campo magnético de la Tierra con vientos solares. El cohete fue construido para la Agencia Espacial Europea y despegó de su instalación en la costa de la Guayana Francesa. -Y Unos 30 segundos en el vuelo, primero algo notado iba mal. Que las boquillas se giratorio de una manera que realmente no debería. Alrededor de 40 segundos de vuelo, claramente el vehículo estaba en problemas, y eso es cuando hicieron la decisión de destruirlo. Un oficial de seguridad Serie compuesta enormes tripas presiona el botón, explotó el cohete antes de que pudiera convertirse en un peligro para la seguridad pública. -Esta Era la doncella viaje del Ariane 5, y su destrucción se llevó lugar debido a un defecto integrado en el software del cohete. -El Problema de la Ariane fue que no era un número que requiere 64 bits para expresar, y él quería convertir a un número de 16 bits. Asumieron que el número Nunca iba a ser muy grande, que la mayoría de esos dígitos en el número de 64 bits eran de 0. Ellos estaban equivocados. -La Incapacidad de un solo programa de software para aceptar el tipo de número generado por otro estaba en la raíz de la falla. El desarrollo de software se había convertido en un muy costoso parte de la nueva tecnología. El Ariane 4 cohete había sido muy éxito, por lo que gran parte del software creado para ella era también utilizado en el Ariane 5. -El Problema básico era que el Ariane 5 era más rápido, más rápido acelerado. Y el software no tenía representaron para eso. -La Destrucción del cohete fue un gran desastre financiero, todo se debe a un error de software minutos. Pero este no fue el primero problemas de conversión de datos de tiempo había plagado la tecnología moderna de cohetes. -En 1991, con el inicio de la primera guerra del Golfo, el misil Patriot experimentado una clase similar problema de la conversión de número. Como resultado, 28 personas, 28 soldados estadounidenses murieron y alrededor Otras 100 resultaron heridas, cuando el Patriot, que se suponía para proteger contra scuds entrantes, dejado de disparar un misil. -Cuando Irak invadió Kuwait y América lanzado Tormenta del Desierto a principios de 1991, Baterías de misiles Patriot fueron desplegados para proteger a Arabia Saudita e Israel de los ataques iraquíes misiles Scud. El Patriot es un estadounidense, de mediano alcance tierra-aire del sistema fabricado por la empresa Raytheon. -El Tamaño del interceptor Patriota, sí, se trata de, aproximadamente 20 pies de largo. Y pesa alrededor de 2,000 libras. Y lleva una ojiva de sobre-- Creo que es más o menos 150 libras. Y la ojiva, en sí, es un potente explosivo, que tiene fragmentos de alrededor de él. La carcasa de la ojiva es diseñado para actuar como perdigones. -Los Misiles son llevado, 4 por contenedor, y son transportados por un semi-remolque. -El Sistema de defensa antimisil Patriot se remonta por lo 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 la guerra llegó, el Ejército quería utilizarlo para derribar misiles Scud, no aeroplanos. La Fuerza iraquí no era tanto de un problema, pero el Ejército estaba preocupado acerca scuds. Y por lo que trataron de actualizar el Patriot. -Intercepting Un enemigo misil que viaja a mach de cinco que iba a ser un reto suficiente. Pero cuando el Patriot fue trasladado de urgencia en servicio, el Ejército no estaba al tanto de un Modificación iraquí que hizo sus scuds casi imposible de golpear. -¿Qué Pasó, es que los scuds fueron entrando, eran inestables, fueron desplazamiento. La razón de esto, era que los iraquíes, con el fin para llegar a 600 kilómetros de una gama de misiles 300 kilometros, llevó el peso de la ojiva delantera y la ojiva hecho más ligero. Así que ahora, el patriota de tratar de llegar en el scud, y la mayoría de las veces, la abrumadora mayoría de la tiempo, sería simplemente volar por el scud. -Una Vez que los operadores del sistema Patriot dio cuenta de la Patriot no alcanzó su objetivo, detonaron ojiva del Patriota, para evitar posibles bajas si se dejó caer al suelo. -Eso Fue lo que vieron a la mayoría de la gente, esas grandes bolas de fuego en el cielo, e incomprendido como intercepciones de ojivas Scud. Aunque en la noche cielos, Patriotas apareció para ser éxito destruyendo scuds, en Dhahran, no podía haber error sobre su desempeño. Allí, sistema de radar de la Patriot perdido el rastro de un Scud entrante, y nunca puesto en marcha, debido a un defecto de software. Fueron los israelíes que primero descubrió que cuanto más tiempo el sistema estaba en marcha, cuanto mayor es la discrepancia de tiempo se convirtió, debido a un reloj incrustado en el ordenador del sistema. -Acerca De 2 semanas antes la tragedia en Dhahran, los israelíes informaron a el Departamento de Defensa, que el sistema estaba perdiendo el tiempo, que después de aproximadamente 8 horas de funcionamiento, se dieron cuenta de que el sistema era que se vea con menos precisa. El Departamento de Defensa respondió contando todas las baterías Patriot para no dejar los sistemas durante mucho tiempo. Nunca dijeron lo que era mucho tiempo. ¿8 horas? ¿10 horas? 1000 horas? Nadie sabía. -La Batería Patriot destinado en el cuartel en Dhahran, y su deficiente interna reloj, había estado en más de 100 horas en la noche del 25 de febrero. -Es Rastreados tiempo con una precisión de aproximadamente 1/10 de un segundo. Ahora 1/10 de segundo es un número interesante porque no puede ser expresado en binario, exactamente. Lo que significa, no puede expresarse, exactamente, en cualquier computadora digital moderna. Es difícil de creer, pero utilizar esto como un ejemplo. Tomemos el número, la tercera. 1/3 no puede ser expresado en decimal, exactamente. 01/03 es 0.333 pasando para el infinito. No hay manera de hacer eso, con precisión absoluta, en decimal. Ese es exactamente el mismo tipo de problema que sucedió en el Patriot. Cuanto más tiempo el sistema funcionó, el peor se convirtió en el error de tiempo. -Después De 100 horas de funcionamiento, el error en el tiempo sólo alrededor de 1/3 de segundo era. Pero en términos de la orientación de un misil que viaja a Mach 5, que dio lugar a un seguimiento de error de más de 600 metros. Sería un error fatal para los soldados en Dhahran. -¿Qué Pasó, es el lanzamiento de un Scud era detectado por los satélites de alerta temprana, y nuevos que el Scud era viniendo en su dirección general. Ellos no sabían de dónde venía. -Fue Ahora hasta el radar componente del sistema Patriot, defensa de Dhahran, para localizar y mantener pista del misil enemigo entrante. -El Radar era muy inteligente. En realidad, sería realizar un seguimiento la posición del Scud y luego predecir dónde probablemente sería, la próxima vez, la radar envía un pulso a cabo. Eso se llamaba a la puerta rango. -Entonces, Una vez que el Patriot decide suficiente tiempo tiene pasó a volver atrás y comprobar la siguiente ubicación para este objeto detectado, que se remonta. Así que cuando se volvió al mal lugar, a continuación, no ve ningún objeto y decide que no había objeto, se trataba de una falsa detección, y deja caer la pista. El Scud entrante desapareció desde la pantalla de radar, y segundos más tarde, se se estrelló contra el cuartel. El Scud mató a 28 y fue el último se dispararon durante la primera guerra del Golfo. Trágicamente, el software actualizado llegado a Dhahran el día siguiente. La falla de software tenía estado fijo, cierre un capítulo en el atribulado historia de los misiles Patriot. [FIN DE REPRODUCCIÓN] DAVID J MALAN: Así que vamos a echar un vistazo a algunas limitaciones similares en sólo un poco. Pero primero, vamos a transición a unos pocos FYI es. Así uno-- este fin de semana, hay será secciones súper, que están destinados a suplantar secciones regulares, que pondrá en marcha una semana de ahí. Echa un vistazo a la página web del CS50 para obtener más información al respecto. También serán filmados y streaming vivir para aquellos que no puedan asistir. Boletín de problemas 1 está en el la página web del curso ya, y vamos a echar un vistazo a que en tan sólo un poco. Y las horas de oficina también se llevarán a colocar este lunes a jueves. Así que este era el más canónica programa vimos por última vez. Es como el más simple programa que puede escribir en C, e incluso eso es un poco de una afirmación audaz. ¿Correcto? Porque hay un montón de aparente complejidad a esto. Así que vamos a echar un vistazo rápido a lo que algunos de estos elementos eran y luego tratar de proporcionar un modelo mental de cómo éstas más simple de programas Trabajamos, y luego vamos a empezar ver las cosas cada vez más complejo. Así que esta línea de aquí, ha destacado hoy, en amarillo, lo dijimos, la última vez, que este hace por nosotros? ¿Cuál es el propósito al que sirve? Cualquier persona de más atrás? Sí. MIEMBRO DE LA AUDIENCIA: [inaudible] DAVID J MALAN: Good. Por lo que le da acceso a los comandos, o dejar de llamar a funciones, que alguien más escribió, que se declaró, por así decirlo, en algún otro archivo. Así que vamos a ver exactamente lo que un archivo .h es frente a un archivo .c, con el tiempo. Pero, por ahora, sólo sé printf que, por ejemplo, es una de las funciones que han sido declarada en algún otro archivo, en alguna parte más en el disco duro de la nube que nos permite acceder a printf y usamos sin tener que reinventar que rueda a nosotros mismos. Mientras tanto, el principal. ¿Cuál fue el análogo de la principal, la semana pasada? Sí. MIEMBRO DE LA AUDIENCIA: Bandera verde se hace clic. DAVID J MALAN: Sí. Scratch, cuando se hace clic en bandera verde. Es como la pieza del rompecabezas que patea las cosas. Y así mismo modo, hizo el mundo decidió hace unos años que en C, y un montón de otras lenguas, si quieres escribir un programa, su primera función ha de ser llamado, principal. Y tiene que tener este aspecto. Pero vamos a volver, otra vez, a lo que, int, y, nula, significa en ese contexto. Por ahora, las llaves son amables de igual forma de pieza de puzzle de Scratch que encapsula un número de líneas. Y entre en las líneas aquí, es este de aquí. printf es una función cuyo propósito en la vida es imprimir una cadena con formato. Y por formateada, quiero decir que puede enchufar en los valores de marcador de posición, y usted puede especificar el número de decimales puntos, la cantidad de números para imprimir después de un punto decimal y similares. Y printf, por supuesto, se necesita un o más argumentos o parámetros, si no conocido, más simplemente, como entradas. Así printf, como un montón de funciones, toma insumos. Y esas entradas se abrazaron por los dos paréntesis aquí. Y dentro de los que es una entrada. Es una cadena, como lo hemos llamado, que es sólo una secuencia de caracteres, como una palabra o una frase, o en su conjunto ensayo, incluso, entre comillas dobles. Y eso es lo que va a influir en el comportamiento de printf porque, por supuesto, es sólo una función de impresión genérica. No va a saber lo que para imprimir, a menos que usted le indique. Y luego, algunas minucias. Lo que dijimos esta extraña secuencia de símbolos es? Sí. MIEMBRO DE LA AUDIENCIA: Nueva línea. DAVID J MALAN: Nueva línea. Así que resulta, que no sólo puede golpear, entrar, cuando estás escribiendo el programa. En general, el compilador se va a poner un poco confundido en cuanto a lo que te refieres. Más bien, lo que tienes que literalmente decir, dame una nueva línea aquí. Y así / n es lo que generalmente llamar a un carácter de escape. Así que n, para la nueva línea. Y el compilador sabe que cuando se ve / n, que en realidad debería inducir a la computadora, en última instancia, o printf, en este caso, para imprimir un nuevo real línea, como golpear el, entrar, tecla del teclado. Y por último, lo que hizo que decimos esta pieza de la sintaxis es para? ¿Qué representa? Sí. MIEMBRO DE LA AUDIENCIA: [inaudible] DAVID J MALAN: Es sólo el final de la línea. Es el final de la declaración. Y damos cuenta de que no lo hacemos ponerlos en todas partes. Desde luego, no los pusimos en los extremos de cada línea. Por ejemplo, no hay ninguno en el primera línea, no hay nada en la línea con, principal, no hay ninguno después de las llaves, pero usted comenzará a ver y obtener familiarizarse con el lugar donde se llama a. Y es casi siempre después de una función llamar o una declaración, un poco de acción que en realidad estás tomando. Y saber ahora, especialmente si entre los menos cómodo, estos son el tipo de cosas estúpidas que usted va a terminar golpeando accidentalmente su cabeza contra la pared otra vez. Porque podrás lógicamente confianza en algunos problemas has resuelto para un problema conjunto, y la maldita cosa simplemente no compilará o incluso correr. Y tan a menudo, desde el principio, que va a deberse a que se ha perdido un paréntesis, o se ha perdido un punto y coma. Y por lo que sólo tener en cuenta de este tipo de cosas, y tratar de no quedar frustrado por porque lo hace muy rápidamente este convertido en viejo sombrero. Pero es muy fácil de conseguir frustrado desde el principio, como resultado. Así que ahora, vamos a echar un vistazo a cómo esta línea es en realidad trabajando y luego mirar un poco una más complicado. Así que tenemos por aquí, la capacidad de dibujar en la pantalla. Y supongamos que este es mi pantalla de ordenador, pero estoy escribiendo la, hola programa, y no he implementado, printf. Alguien más ha puesto en marcha, printf. ¿Quién quiere reclamar a han puesto en marcha, printf? Si puede? Muy bien, ¿cuál es tu nombre? ESTUDIANTE 1: [? Copal. ?] DAVID J MALAN: Copal, vamos para arriba. Vamos arriba. Correcto. Así que tenemos, aquí, algunas etiquetas de nombre, ya que vamos a hacer un pequeño juego de este. Y nosotros te llamamos, printf. Y si quieres venir aquí, lo que acabo he dibujado en la pantalla, es, sencillamente, no soy yo, esto. Muy bien, así que, hola mi nombre es, printf, si desea poner eso en. Correcto. Y si se puede ir soporte por la pantalla de la computadora como si usted es la función que llegó con este sistema informático. Y su propósito en la vida es imprimir realmente algo. Pero al igual que el programa que sólo tenía en la pantalla, aquí, vamos a tener que en realidad le dará alguna entrada. Y así, si mi entrada, aquí, es al parecer, lo que se pasa a printf, vamos a tipo de burlan de ella de esta manera. Voy a escribir literalmente en un pedazo de papel, "hola, mundo" barra invertida N. Y para que quede claro, lo que Yo sólo he dibujado en este pedazo de papel, se parece a esto. Así que cuando ejecuto este programa, y ​​esto línea amarilla de código es ejecutado, es como si yo, el programa hola, estoy entregando alguna entrada fuera a una función que alguien más escribió. Y si, con el dedo, podía en realidad, con el dedo, dibujar en la pantalla lo que sea es que ha estado entregado, el efecto, en última instancia, es ver exactamente que, en la pantalla. Y un caso esquina poco aquí. Y bueno, no hay que ver la, nueva línea, en este punto. Sería incorrecto para usted llamar explícitamente la nueva línea. Pero si seguimos escribiendo palabras en la pantalla, que terminaría por debajo de eso. Así que muchas gracias, pero se adhieren por aquí por sólo un momento. Ahora necesitamos otro voluntario, si pudiéramos, eso va a tener que jugar el papel de-- Es únicas personas en la orquesta Ahora mismo. Cómo sobre-- Aceptar. Aquí. Vamos arriba. ¿Cómo te llamas? ESTUDIANTE 2: [? Ivay. ?] DAVID J MALAN: Lo siento? ESTUDIANTE 2: [? Ivay. ?] DAVID J MALAN: Ethan, vamos para arriba. ¿No? ¿Obtuve que mal, incluso después de que usted lo ha dicho dos veces? Vamos arriba. Es difícil escuchar aquí. OK. Y lo siento, ¿cuál es tu nombre? ESTUDIANTE 2: [? Ivay. ?] [? DAVID J MALAN: Ivay. ?] OK. Por ahora, si no lo hace mente, usted está GetString. ESTUDIANTE 2: OK. Fresco. DAVID J MALAN: Así que si usted desea a estar aquí por un momento, vamos a echar un vistazo a un poco programa más complejo, que ahora cuenta con tres líneas de código. Así que tenemos, uno, diga su nombre utilizando printf; dos, una llamada a GetString, seguido de una asignación a una variable llamada, cadena s, o llama s; y luego otra llamada a, printf, pero esta vez con dos entradas. Estado Así que ya hemos hecho su nombre, o mejor dicho, tenemos ha hecho una llamada printf. Así que voy a escribir, diga su nombre. Y así, lo que voy a pasar, printf, en un momento, es, sencillamente, esto. Así que si quieres seguir adelante y sacar esta en la pantalla, esa es tu entrada ahora. Correcto. Y olvídate de cuerdas, ahora tenemos nuestra propia línea de código aquí. Así que en, GetString, necesitamos llamar realidad, GetString. Así que su propósito en la vida es simplemente caminar salir a la orquesta, si pudiera, y obtener el nombre de alguien. Pero vamos a darle algo que la puso. Si quieres ir adelante y obtener una cadena, obtener el nombre de alguien en esa pedazo de papel, si pudiera. Correcto. Y vamos a ver, en un momento, cuyo nombre estamos recibiendo. Mientras tanto, lo que voy a tiene listo, es una hoja en blanco de papel, en el que, me voy para almacenar cualquier valor que se es que GetString está volviendo a mí, Yo, siendo una variable de cadena llamada, s. Correcto. Entonces, ¿qué tenemos aquí? Nik. Correcto. Así que tenemos el nombre de Nik aquí. Así que esto es lo que, literalmente, se ha vuelto a mí, por así decirlo, por GetString. Yo, ahora, voy a ejecutar el lado izquierdo de esa expresión, en el que simplemente copiar hacia abajo, a los efectos de la actualidad, Nik. Así que ahora, tengo una variable llamada, s, almacenar el nombre de Nik. Ya he entregué printf, un argumento anterior. Pero en nuestra tercera y última línea de código, que en realidad tiene que printf mano algo un poco diferente-- "hola,% s," barra invertida n. Y así, la última línea me voy a send-- lo último que estoy va a escribir ahora, es esto. Así que las dos líneas de código, o en lugar de la última línea de código, llamadas para dos inputs-- uno, este, y dos, esto. Así que si nuestra función printf Ahora puede tomar estos como entrada, déjame borrar la pantalla para usted. En realidad no, usted puede seguir adelante. Dejaremos para arriba, ya que está en el mismo programa. Debemos ver, hola, Nik. Correcto. Así que este era un buen número aros para saltar a través, simplemente escribir, indique su nombrar y, hola, Nik. Pero esta simple idea de paso de mensajes, de paso de entrada y de salida de recepción, es exactamente el modelo que vamos a tener incluso para las funciones más complejas. Así que muchas gracias a los dos. Tenemos un estrés encantadora bola aquí para usted. Y gracias a nuestro GetString y voluntarios printf igual. Gracias. Correcto. Gracias a los dos. Así que hemos estado hablando hasta el momento, sobre todo acerca de las cadenas. Y resulta que C puede de hecho entender algunos tipos de datos diferentes. De hecho, vamos a tomar un vistazo a estas aquí. Así C, y una gran cantidad de idiomas, entender las cosas llamados caracteres. Un char es generalmente una solo byte, u ocho bits. Y representa un único carácter, como la letra A, o la capital letra A, o la letra minúscula A, o un signo de exclamación, o cualquier carácter que usted puede escribir en el teclado, ya veces incluso más. También llegan a ver carrozas. Un flotador es, por lo general, un 32-bit de valor, o cuatro bytes porque, de nuevo, es un byte de ocho bits. Así que un flotador es un valor de punto flotante, algo con un punto decimal. Y de hecho, eso es lo que la película estaba hablando sobre cuando hablaban acerca flotante valores de puntos, algunos número fijo de bits se utiliza para representar un número real. Pero también hay cosas llamadas dobles. Estos existen en Java, si usted ha tomado APCS, y un doble, como su nombre por suerte sugiere, es dos veces tan grande como un flotador. Todavía es un número real, que sólo tiene más bits con la que ser cada vez más precisa, o para almacenar un número aún mayor. int es fácil. Hablamos de que la última vez. Es sólo un entero. Y es por lo general 32 bits, o cuatro bytes. Y así, si usted tiene, vamos a ver ahora, 32 bits-- y lo hicimos en la semana 0, siempre tan briefly-- si usted tiene 32 bits, lo que es el más grande número que puede representarse como un entero? ¿Da o toma? Es como 4 mil millones, y eso es sólo si somos que representa sólo números positivos. Si usted tiene 32 bits, y desea representar números negativos, así, su alcance es, esencialmente, negativo 2 mil millones a positivo 2000000000. Pero, en general, vamos a empezar a 0 subir a 4 mil millones. Usted no tiene que saber con precisión, pero podemos ver esto, de hecho, si sólo abrir una pequeña calculadora, aquí. Yo puedo hacer 2 al 32, y eso es exactamente lo grande, cuántos valores puede representan, con 32 bits. Y es más o menos 4 mil millones. Así que vamos a seguir viendo ese número en unos pocos lugares diferentes. Pero si usted necesita más tiempo números que eso, Resulta que hay de algo que se llama un largo tiempo. Y mucho, mucho es en general de 64 bits, los cuales significa que es un orden de magnitud incluso más grande que un int. Así que ni siquiera puedo pronunciar el mayor número que puede representar, pero es notablemente más grande. Ahora como un aparte, históricamente, si un int es de 32 bits, y mucho, mucho es de 64 bits, la forma grande es mucho, no hace mucho tiempo? Se podría pensar que es más largo que un int pero tal vez menos largo de un largo tiempo, pero en realidad depende. Y así resulta que un solo de las frustraciones también, con la escritura de código en ciertos sistemas, es que no todos estos tipos de datos tener valores predeterminados. A veces es esta cantidad de bits. A veces es que muchos bits. Así que usted realmente tiene que saber, a veces, qué hardware se está ejecutando el software en. Afortunadamente, otros idiomas y otros tipos de datos que existen actualmente, permitirá ser más preciso. Bueno, vimos cuerda, y vimos bool, también, pero resulta que los que vienen sólo con la biblioteca CS50. Así que los que no están construidos en C. Aquellos lugar, llegado en ese archivo llamado CS50.h, que finalmente va a pelar las capas de. Pero, por ahora, son sólo tipos de datos adicionales. Un bool es un verdadero o falso, y un cadena es una secuencia de caracteres, como una palabra. Ahora printf, que hemos visto, ha marcadores de posición,% s es uno. Y es posible que pueda, ahora, inferir de estos otros ejemplos, cómo usted podría tener un marcador de posición para diferentes tipos de datos. Por ejemplo, tomar una conjetura, si querido imprimir una sola carbón utilizando printf, el marcador de posición es probablemente% c. Y si desea imprimir una entero con el marcador de posición,% i. % LLD es un valor decimal de largo a largo, pero mucho, mucho, por lo que se asigna a eso. Y luego% f para flotar valor de punto o de un doble, así que a veces que están re-utilizada en diferentes contextos. Así que vamos a ver y utilizar algunos de los mayores de tiempo. Y printf y otras funciones también secuencias de escape de apoyo de los demás, y, a veces, estos son necesarios. Así barra invertida n es una nueva línea. Backslash t, ¿alguien querer tomar una puñalada? MIEMBRO DE LA AUDIENCIA: Tab. DAVID J MALAN: Tab. Así que si usted realmente quiere para imprimir una ficha, no un número fijo de espacios sino una real carácter de tabulación, que no alcanzó su, pestaña, tecla del teclado, en general, que realmente hacen barra invertida t. Cita doble barra invertida, ¿por qué iba a querer eso? ¿Correcto? ¿Por qué no puedo simplemente escriba un comillas dobles en mi teclado? MIEMBRO DE LA AUDIENCIA: Porque, de lo contrario, es va a pensar que es el fin de que su impresión [? texto. ?] DAVID J MALAN: Exactamente. Recuerde, con nuestra ejemplos printf, cuando pasaban a printf en la entrada, a la izquierda de esa cadena de entrada y sobre el derecho de esa entrada primavera, por supuesto, era una doble cotización. Si su propia entrada tiene un doble cita en medio de eso, el equipo podría potencialmente confundirse, ya que, hace esta doble cita pertenecer en el medio? ¿Pertenece a la izquierda? ¿Pertenece a la correcta? Y así, si quieres que sea súper claro, lo hace barra invertida doble cita, de modo que ha escapado, por así decirlo, y no es combinó para otra cosa. Y hay algunos otros aquí, r barra invertida, comillas simples, 0, para que veamos con el tiempo, también. Y ahora, ¿qué pasa con las funciones? Así que las acciones que podemos tomar hasta el momento en este idioma, C, así, que hemos visto, printf, por supuesto, y todos de los otros en la pantalla, aquí, que vamos a utilizar para el primeros sólo semanas del curso, venir cuando la biblioteca CS50. Y hacen que sea mucho más fácil, en C, para conseguir realmente la entrada del usuario. Resulta que en C, y francamente en unos pocos idiomas, es un verdadero dolor en el cuello que hacer algo simple, como símbolo del usuario para el teclado, para su entrada. Y así, estas funciones hacen que sea más fácil. Y también tiene error comprobar en todo, de modo que, cuando se recordar el miércoles, nos vio el, reintentar, advertencia, cuando no cooperaba, y he escrito una palabra, en lugar de un número? Hemos hecho el trabajo pesado temprana a asegurarse de que el usuario coopera. Pero estos son sólo la formación ruedas que lo haremos con el tiempo, y rápidamente, despegar. Así que para recapitular, a continuación, vamos a echar un vistazo rápido, al igual que lo hicimos con Scratch, en algunas construcciones canónicas en C. Con ello se pretende, más o menos de, ser un viaje relámpago, simplemente para que tenga una referencia y que usted ha visto las cosas al principio. Pero entonces veremos codificación real utilizar algunos de estos bloques de construcción. Así que al igual que en Scratch, cuando habíamos declaraciones como, decir o, espera, en C, que tenemos funciones, así, como printf. Si queremos expresar una condición en C, que es similar en espíritu, a esa pieza del rompecabezas que parecía esto en Scratch. Pero en cambio, nos literalmente a escribir, si. Y luego, entre paréntesis, ponemos una condición, donde esa condición es lo que vamos a llamar, de nuevo, una expresión booleana. Y de nuevo, esto es una especie de pseudocódigo. Y, de hecho, la // es un comentario. Son sólo palabras en inglés a mí mismo. Pero este es el general, estructura de una, si, condición. Pero ya veremos hormigón ejemplos en un momento. Si usted quiere tener un bidireccional tenedor en la carretera, al igual que lo hicimos con nuestra voluntaria en Miércoles, usted puede tener una, más si. Y si usted quiere tener una tercera y condición final, o la situación por defecto, usted puede tener sólo una cuadra más, allí. Y del mismo modo, con expresiones booleanas, usted puede, y, juntos. Y vimos el miércoles que no es un solo signo, es dos, por razones de nivel inferior que que con el tiempo vemos y jugamos con. O-ing cosas juntos es de 2 barras verticales. En un teclado de EE.UU., esta es generalmente una clave con la tecla de mayúsculas anterior clave de la tecla Intro o Retorno. Luego está estas cosas que usaremos tal vez una o dos veces. Ellos son funcionalmente equivalentes a lo que puede hacer con una, si, más si, más si lo demás, construir, pero se les llama un interruptor. Se ven muy diferentes, pero vamos a ver en algunos de nuestro código de distribución, para un conjunto problema futuro, lo más probable, que a veces es sólo una más bonita manera de expresar su conjunto manojo de condiciones, sin tener una gran cantidad de llaves y un montón de paréntesis y sangría. Pero ellos nos dan no más el poder de lo que ya tenemos. Y ahora bucles. Y éste, veremos en un poco más lentamente. Pero entonces, vamos a empezar a utilizar estos, especialmente para aquellos que ya están familiarizados. Esta es la forma canónica, si increíblemente modo arcano, para escribir un bucle en C. Ahora un bucle en Rasguño era muy claro. Usted tiene una, para siempre, bloque. Usted tiene una, repetir, bloque con sólo un número que tiene que escribir. Y con el bucle for,, puede poner en práctica tanto de esas ideas, pero es un poco más técnico. Pero, francamente, también es relativamente simple. Una vez conocido el orden de operaciones, que, literalmente, sólo se va a conectar en los valores y decirle a la computadora qué hacer. Así que aquí está un ejemplo. Este es un bucle que, bastante simplemente, cuenta de un número hasta a través de otro. Y con sólo echar un vistazo por lo que, incluso si usted tiene sin experiencia previa con este lenguaje, ¿qué número no es probable que empezar a contar a? OK, 0. Y supongo que es porque ver que hay un int y un i, que es una variable. Se inicializa a 0. Y más tarde, parece que estamos pasando printf, un valor. Y, de hecho, hice un pequeño error tipográfico aquí. Pero eso es fácilmente fijado. Permítanme añadir en, i aquí. Ahora tenemos ser printf pasado ese valor de marcador de posición. Y lo que va a contar a través de? AUDIENCIA: 50. 50. 49. DAVID J MALAN: 49. Así que 50, a primera vista, parece correcto. Pero eso, resulta que va a ser nuestra condición que guardemos cheques. Y vamos a dejar de una vez Ya no es menos de 50. Así que este bucle, por el contrario, debe ejecutar, siempre que i es menor que 50. Pero tan pronto como tenga 50 o 51 años, o peor aún, se debe detener automáticamente. Correcto. Así que lo que realmente sucede aquí? Así que este es el orden de operaciones para un bucle. Uno, usted tiene la la llamada de inicialización. Este fragmento resaltado amarillo de código que se ejecuta en primer lugar, y tiene el efecto de que, por Miércoles, probablemente imaginar. Se crea una variable llamada i y tiendas en esa variable el valor 0. Así que i es 0 en este momento de la historia. La siguiente cosa que que sucede en este constructo, es que la condición se comprueba. Así que puedo comprobar de inmediato, es i menos de 50? Y, por supuesto, la respuesta por ahora es, sin duda, sí. Sí, porque i es 0, y eso es sin duda menos de 50. Entonces lo que sucede, es que esta línea de código es ejecutado. Y de hecho, si hay múltiples líneas de código en esas llaves, todos ellos se ejecutan uno tras otro. Y en el efecto aquí, es al parecer, para imprimir el número i, que se va a ser 0, y luego 1, y después 2. ¿Pero por qué? ¿Por qué obtener incrementa? Bueno, la cuarta cosa que que pasa es que esta sintaxis es ejecutado, tras el punto y coma. i ++ es una forma abreviada de decir; tomar el valor de i, y añadir 1 a la misma; y luego la próxima vez, añadir 1 a la misma; y la próxima vez, añadir 1 a la misma. Así que si seguimos adelante, Qué va a pasar Lo siguiente es que no voy a inicializar i nunca más. Si seguía inicializar i a 0, este ejemplo nunca terminaría, porque i estaría pegado a 0. Pero lo que va a suceder es que la condición se comprobará, la línea de código conseguirá ejecutado, la i se incrementará, condición se comprueba, código conseguirá ejecutado. Y siguió en bicicleta de nuevo, y otra vez, y otra vez, hasta i ++ induce un valor de 50. La condición luego dice: es de 50 a menos de 50? La respuesta, por supuesto, es que no, y por lo que todo el código deja de ejecutarse. Y si usted tiene más código en la pantalla abajo, eso es lo que sucede después. Se sale de estas llaves y continúa imprimir más después de eso. Así que una broma ahora, desde el foxtrot, que usted quizás ahora entiendes. Siempre es divertido. Es como las risas tipo de filtrarse, y luego te das cuenta de que no debería estar riéndose de humor como este. Pero hay algo de comida para llevar aquí, pedagógicamente, también. Así que resulta que soy falta una pieza de la sintaxis, o foxtrot de perder un pedazo de sintaxis aquí. Lo que falta, que hemos tenido en cualquier otro ejemplo, hasta el momento? Retorno, es allí, así eso es otra cosa, que vamos a volver al poco tiempo. Lo que falta, sin embargo? Sí. MIEMBRO DE LA AUDIENCIA: El inicialización de [inaudible]. DAVID J MALAN: OK. Así que sí. Así que en realidad, esto es-- Bueno, y el recuento se inicializa arriba, o más bien, declarada por encima. Así que esta es otra manera de hacerlo. Pero no en una línea que es válida sin embargo. ¿Qué hay aquí? MIEMBRO DEL PÚBLICO: ¿Es de las llaves? DAVID J MALAN: Sí. Así que las llaves están desaparecidos. Pero este código, quiero decir, a su crédito, es, en realidad, sintácticamente válida. Resulta, no lo hace necesitará las llaves si sólo tiene una línea de código que desea que se ejecuten dentro del bucle. Ahora estamos siempre, en clase y en todo nuestro código de distribución, incluir las llaves de todos modos, sólo por el bien de la claridad. Pero darse cuenta de que los libros de texto y los ejemplos en línea, usted puede ver muy bien rizado los apoyos que faltan en algún momento. Y eso está bien, si lo que han sangrado y destinados es sólo una sola línea de código, y no múltiples líneas de código, potencialmente. Correcto. Así relacionado con el tema de la imprecisión, es un problema de desbordamiento, en el sentido de que, de manera similar, no enteros tienen límites a ellos al igual que los valores de punto flotante? En el mundo de un punto flotante valores, que sólo pueden ser tan precisa, después de lo cual, a veces cosas malas pueden suceder, y nuestros programas pueden ser buggy y error. Ahora, incluso con números enteros, puedes tener problemas. Ahora un número entero no tiene una punto o números después se decimal. Es sólo un número natural, por lo general. Entonces, ¿qué podría salir mal con un int? Si estoy usando un int a contar, lo que podría salir mal? Parece mucho más simple. Sí. MIEMBRO DE LA AUDIENCIA: Si el número consigue [inaudible] DAVID J MALAN: Sí. Lo que si se cuenta tan alta, que no puede expresar ese número realmente grande. ¿Correcto? En algún momento, vas para exceder los límites de un valor de 32 bits o un valor de 64 bits. Ahora, de nuevo, no estoy seguro de cómo pronunciar un valor de 64 bits, pero sé que con un entero de 32 bits, el valor más grande que puede ser, si es sólo positivo valores, es más o menos 4 mil millones. Así que si trato de contar hasta 5 mil millones, algo va a suceder. Pero veamos lo que, de hecho, puede suceder. En el mundo de número entero desbordamiento, en el que, en cierto sentido, desbordar la capacidad de una número entero, lo que podría pasar? Así que aquí está un número binario, es un retroceso a 0. Es todos los 1 de, y los marcadores de posición allí, son potencias de 2, así que esto es binario. Así que estos son 8, 1 bits en la pantalla. Y si usted recuerda, o que rápidamente hacen las cuentas, qué valor está siendo representado aquí con estos ocho bits de 1? 255. E incluso si usted no estaba muy seguro de las matemáticas, se puede hacer a cabo. O usted podría tipo de la razón a través de él, Espera un minuto, si estoy lo que representa un valor de 8 bits, y tengo 256 valores posibles, pero el primero de los cuales es 0, Sólo sé que la mayor va a ser 255, y eso es lo que podría ser este. Así que supongo que intento añadir 1 a este valor. ¿Qué haría usted en el grado la escuela cuando se añade un 1, y en realidad no encajar porque usted tiene que llevar el 1? ¿Qué es este número va para convertirse en cuando se agrega 1? Va a ser 0. ¿Correcto? Porque si tuviera más bits-- y voy a tratar de, clase de, escriba a cabo aquí-- si tuviéramos más bits, lo que podría hacer aquí es añadir el 1, y luego nos íbamos a esto. ¡Vaya. Tendríamos un bit 1 todo el camino hasta aquí. Pero si se trata de un finito valor, es sólo 8 bits, y eso es predeterminado por el ordenador, que 1 es efectivamente no existe. Es sólo un poco se cae de un acantilado. Y así, si se agrega 1 a 255, lo que Valor es lo que al parecer obtiene? 0. Y así, los números accidentalmente, y tal vez, sin querer, terminan envolviendo así. Entonces, ¿cuál puede ser la implicación de esto? Bueno, hay un par de cosas diferentes. Así que uno, no terminan buscando como 0, involuntariamente, pero puedes tipo de ver, incluso en el mundo real, Para bien o para mal, manifestaciones de esta idea de un límite. Por ejemplo, cualquiera de ustedes que han jugado alguna vez Lego Star Wars, ¿alguien suceda saber el número máximo de monedas puede obtener en Lego Star Wars? Tome una conjetura basada en preguntas principales de la actualidad. Es más grande que 256 o 255. Es 4000000000. Así que resulta, y hay algunas personas-- algunos googlear confirmado última noche-- han conseguido 4 mil millones de monedas de oro, o lo que sea, en Lego Star Wars. Aunque al parecer, no hay una manera de engañar al juego, hay un error o una característica, que permite simplemente acumular montones y montones de puntos. Pero el más grande posible valor, de acuerdo a esta captura de pantalla de alguien que encontrar en línea, es de hecho, 4 mil millones. Ahora ¿por qué es eso? Es, precisamente, 4 mil millones, probablemente porque alguien decidió, que estaba escribiendo este juego, que podían hacer 4 mil millones, algo, algo, algo, como el valor Puse con la calculadora antes, pero que es sólo un poco más limpio para los seres humanos decir el número máximo de coins-- o espárragos, como lo llaman ellos-- que puede recoger es de 4 millones de dólares. Y así, ¿por qué es esto? ¿Cómo es el juego de LEGO la aplicación del contador eso es hacer el seguimiento de la número de monedas que tiene? Están usando qué? MIEMBRO DEL PÚBLICO: Se detiene contando después de 4 mil millones. DAVID J MALAN: Detiene contando después de las 4 millones de dólares, que significa puede inferir, como programador, que son, probablemente, utilizando un entero de 32 bits. Al igual que el programador literalmente sólo con tipo, int, en su código, y ese es el tipo de variable que que están usando para almacenar el código de alguien. Así que hay otras manifestaciones de estos tipos de límites. Así que no he jugado este game-- y yo estaba leyendo sobre la historia para confirmar como mucho-- pero en el versión original de la civilización, donde que al parecer interactúa con cada uno otra y puede hacer la guerra o la paz, Gandhi se supone que es uno de los personajes más pacíficos, como yo entenderlo, en la primera versión de Civilization. Y de hecho, en una escala de 1 a 10, su agresividad era sólo un 1. Así siempre tan ligeramente agresivo, al parecer. Pero en algún momento, puede parecer instalar la democracia en su geografía. Y si instala la democracia en su versión del juego, entonces su nivel de agresividad disminuye. Es algo bueno. La gente está más tranquila al parecer, en esa situación. Pero, al parecer, alguien lo hizo Todavía no tienes una, si, condición en la versión original del código. Así nivel de agresión de Gandhi pasó de positivo 1, menos 2, a negativo 1, pero el juego no lo hace entender los números negativos. Así que lo que sucedió fue la agresión de Gandhi nivel pasó de 1, 0, 1 a negativo, que tuvo el efecto de envolver alrededor para ser el carácter más agresivo en el juego, en un valor de 255, en una escala de 1 a 10. Y desde entonces, ha habido más encarnaciones de este juego, y se han mantenido como una especie de huevo de Pascua, que Gandhi es aparentemente tan terriblemente agresivo. Pero fue el resultado de un error de programación muy simple en esa versión muy temprana del juego. Ahora más preocupante, más Recientemente, el Boeing 787 fue documentado como teniendo una bug, no el tipo de dispositivo que sobre todo quiere tener un error. Y los síntomas, que leeré aquí, de un artículo en línea, Fue este, un modelo de avión 787 que se ha alimentado de forma continua para 248 días puede perder todo corriente alterna, AC, energía eléctrica, debido a las unidades de control del generador, GCU, simultáneamente entrar en modo a prueba de fallos. Así que esto era una advertencia emitida cuando se descubrió este problema. Esta condición es causada por un contador de software, interno a la GCU, por lo un número entero o una variable, que se desbordan voluntad después de 248 días de potencia continua. Boeing está en el proceso de el desarrollo de una actualización de software que GCU remediará la situación de inseguridad. Tanto como el misil escenario, en el que que tenían algún tipo de variables que contaba, y contando, y contando, pero desbordante gradualmente los límites de su capacidad, igualmente lo hizo el maldito avión tener un desbordamiento de variable de después de bastante tiempo de ejecución. Y así el camino lengua en la mejilla de trabajar en torno a este tema es verdad, reinicio, su avión cada 247 días, para que la memoria se enjugó y la variable se remonta a 0. Pero se dan cuenta, esta es una muy gran encarnación de software, pero sobre todo porque hemos oído hablar de Apple los sistemas operativos de entrar en los coches, y coches de auto-conducción de Google, y cualquier número de encarnaciones de software En nuestra vida diaria, TV y relojes, y más, darse cuenta fueron rodeados por el software, todo lo cual está escrito por nosotros los seres humanos. Y como todos vamos pronto descubrimos, es muy fácil y muy típico a cometer errores al escribir software. Y si no coger ellos, algunas cosas malas pueden suceder. Ahora, a veces, algunos cosas divertidas que puede suceder, o por lo menos a veces saber para esperar alguna maldad. Así 0 dividido por 0, desde el grado escuela, generalmente es una mala cosa. Es indefinido. Y resulta fuera-- y vamos a ver si mi micrófono puede recoger este up-- que Apple tenía un poco de diversión con este recientemente. Así que tengo un iPhone aquí. Voy a hablar con Siri y preguntarle para darme la respuesta a 0 dividido por 0. ¿Qué es 0 dividido por 0? SIRI: Imagina que tienes 0 cookies, y usted los divididos en partes iguales entre 0 amigos. ¿Cuántas galletas pone cada persona? ¿Ves? No tiene sentido. Y Cookie Monster es triste que no hay cookies. Y usted es triste que no tienes amigos. DAVID J MALAN: Es un poco desagradable. Así que esto es lo que acaba de decir no. Es indeterminado, no está definido, y de hecho, muchos lenguajes de programación o, en realidad, compiladores detectar cuando, en un programa, tratar de dividir a 0 por 0. Más divertido que esto, sin embargo, es que, al parecer, Cookie Monster es en Twitter estos días. Y él respondió a esta, con esto, que es absolutamente adorable. Pero echemos un vistazo rápido a un par de otras construcciones, y luego poner algo de esto código usar, en las buenas maneras. Así que resulta, además de para los bucles, hay algo que se llama un bucle while, que se ve diferente y se implementa un poco differently-- y que con el tiempo vemos examples-- pero en cierto sentido, es más sencillo porque no le permite inicializar y actualizar dentro de los límites del bucle. Usted todavía puede implementarlo. Así que usted puede hacer exactamente las mismas cosas con un bucle while, como con un bucle for, pero su sintaxis, ultimately-- Como veremos con el tiempo ver-- va a ser diferente. Incluso hay un do while, que en realidad es un poco diferente, en que mientras que un bucle for y un bucle while siempre comprobar su condición de primera, si usted lee esta cosa de arriba a abajo, que poco parece que va a comprobar que la propia condición última porque es verdaderamente la última línea de código. Y de hecho, eso va a ser útil en ciertos programas que escribimos, si usted quiere hacer ciegamente algo y, finalmente, comprobar el estado. Eso no es necesariamente algo malo. Si queremos que las variables, podemos hacer en un par de maneras diferentes. Y vimos en el foxtrot de dibujos animados, una forma de hacerlo, donde se declara la variable, como int contador punto y coma, y luego tarde-- tal vez la siguiente línea, tal vez 10 líneas tarde-- en realidad se inicialice. Así que estas 2 líneas de código declarar una variable de tipo int y lo llaman mostrador, por lo que da me suficientes bits para mantener un int. Y luego, finalmente, pone el valor 0 en esa variable. Arregla los años de 0 y 1 en un patrón, que sabemos de la semana pasada, representa el número que conocemos como 0. O, francamente, se puede hacer esto mucho más más sucintamente, al igual que este. Ahora también tenemos la capacidad para llamar a funciones. Y de hecho, aquí está una línea 2 programa, o un extracto del mismo, que nos permite en realidad escribir algo de código que para crear una cadena de la user-- mucho como nuestro voluntario un momento ago-- almacenando el resultado en una variable llamada nombre, y entonces-- muy parecido con nuestra voluntaria con estampados printf-- fuera esos valores pasando en dos argumentos, el cadena, seguido de la variable llamada, nombre, sí. Así que vamos a echar un vistazo, antes volvemos a Mario allí, en un par de ahora, ejemplos de esto. Voy a seguir adelante y abierto hasta, digamos, la función-0.c. Y como siempre, este código es disponible en la página web del curso, para que pueda jugar junto a casa y mirarlo más tarde. Pero aquí está el programa en que es esencia, de la línea 17 a 22. El programa principal es donde el programa siempre va a empezar. Este programa, al parecer, se va para imprimir su nombre, de colon. Es entonces va a llamar GetString, al igual que hicimos con nuestros voluntarios. Y luego, esto es interesante, que va a llamar PrintName. Resulta que, durante todo este tiempo, no parece ser una función llamada PrintName. Que imprime el nombre de alguien. Nosotros no necesitamos usar printf de antaño, hay PrintName. Pero eso es engañosa porque PrintName no lo hace vienen con C. La gente no lo hizo inventarlo hace unos 40 o 50 años, Lo hice, en su lugar. Y de hecho, si me desplazo aún más, previo aviso cómo puedo escribir mi propio funciones en C que con el tiempo Explicamos por qué seguimos diciendo: vacío, en algunos lugares, pero por hoy, vamos a basta con ver el nombre. En la línea 24, si quieres crear su propia función, que, literalmente, escribe el nombre de la función. Elegí PrintName. Entre paréntesis, se a continuación, especifique qué tipo de insumos, y cuántos quiere esta función para tomar. En este caso, quiero tomar 1 variable llamada, nombre, y que va a ser de tipo, cuerda, así que va que haber alguna secuencia de caracteres. Y entonces, este program-- al igual que en Scratch, usted puede tener rompecabezas personalizado pieces-- va a tener este comportamiento personalizado. Se va a llamar a printf pasando, hola, marcador de posición, y luego se va a conectar en lo que el usuario llamado. Así que este es un ejemplo de lo un informático haría abstracción llamada o funcional descomposición, los cuales son sólo formas de fantasía de diciendo-- es si te gusta esta idea de alto nivel, como quiero funcionalidad que grabados el nombre de alguien, absolutamente le puede escribir literalmente printf y después Aconteció en los argumentos que desea, y el programa va a funcionar, como lo ha hecho desde el miércoles. Pero usted puede comenzar a abstraer la noción de la impresión de un nombre. Puede darle un nombre, como PrintName, y esto es esta idea de capas desde la semana 0. De ahora en adelante, yo y usted no tiene que saber ni le importa cómo se implementa PrintName. Sí usa printf, tal vez no lo hace, ¿quién sabe lo utiliza? ¿A quién le importa? Ahora estoy hablando aquí, en vez de aquí. Y, en efecto, como nuestros programas reciben más avanzado y sofisticado, vamos a seguir tomando por sentado la existencia de las piezas del rompecabezas de nivel inferior. Debido a que los escribimos o alguien más lo hizo, por lo que que entonces podemos construir sobre ellos. Echemos un vistazo a este variante, función One. Así que éste es un poco más avanzado, pero resulta que en la biblioteca de CS50, sólo hay una función getInt. No pensamos, hace años, a implementar una función GetPositiveInt. Y eso es un poco molesto porque si ustedes están escribiendo un programa en el que usted desea conseguir un resultado positivo número entero de usuario, absolutamente puede utilizar getInt. Y a pesar de todo puede comprobar con la condición y tal vez un bucle si es mayor que int que 0 y gritar en el usuario si él o ella no da que un número positivo. Pero vamos a construir este el bloque hueco a nosotros mismos, a, pieza rasguño de encargo, si se quiere. Voy a tener un programa aquí que en última instancia, I quiero ser capaz de llamar a GetPositiveInt, y yo quiero ser capaz de imprimir lo que int es. Pero esto se abstrae lejos ahora. Se ha acaba de dar un alto nivel nombre que dice lo que hace, que es maravilloso porque es muy intuitivo ahora a leer. Y si me importa lo que hay debajo el capó, déjame desplácese hacia abajo. Y es un poco intimidante al principio, especialmente si este es su primer programa, pero vamos a echar un vistazo. Yo ya no estoy diciendo, nula, porque resulta que las funciones, al igual que GetString, puede devolver un valor para mí. Ellos no sólo tienen imprimir en la pantalla, que en realidad puede entregar yo algo a cambio. Y mientras que antes PrintName, Yo no necesito nada. Necesitaba el efecto secundario de algo a aparecer en la pantalla, pero yo no necesitaba un ser humano a darme algo a cambio. Aquí, con GetPositiveInt, al igual que con getInt, Quiero ser entregado algo a cambio. Así que estoy diciendo no, nula, en la línea 23, pero int, que dice, esta función que estoy escribiendo, llama GetPositiveInt va a Me devolver un entero, no nada, no nula. Mientras tanto, se va a tomar ninguna insumos, así que he, clase de, invierten la misma. Yo no voy a dar ninguna GetPositiveInt de entrada, quiero que me dé su salida. Y entonces, ¿qué pasa ahora? Así que aquí es cómo puedo declarar una variable. Lo he hecho fuera del bucle, por razones que vamos finalmente vemos, pero esto sólo da me 32 bits llamado, n, y he predeterminar les permite almacenar número entero. Y aquí hay que hacer mientras constructo, y es por eso que es útil. Literalmente ello, mientras que n es menor que 1. Así que vamos a ver qué pasa. Imprimo, por favor dame un int positivo. Luego me pongo un int, utilizando CS50 de funcionar y almacenada en n. Y entonces, ¿qué línea de código, probablemente, es ejecutado siguiente, lógicamente? Qué recta numérica? Sí, así que 31. Usted no sabe esto hasta que haya ha dicho o tipo de inferir que, pero eso es cierto. Se va de arriba a abajo y luego sigue repitiendo. Así que si he escrito en, digamos, el número 1 negativo, es n menos de 1 negativo? Sí. Debido negativo 1 es menor que 1. Entonces, ¿qué debe suceder? Voy a hacer esto mientras que n es menor que 1, así que me voy a ir de nuevo a la línea 28. Y cada tiempo-- y vamos a correr esto-- hacer la función del 1 al compilarlo, y ahora dot función 1 slash. Si escribo negativo 1, es va a seguir gritándome hasta que yo coopero debido a que cada de mis entradas es menor que 1 y si es inferior a 1, mientras que, Voy a seguir haciendo esto. Si, finalmente, le doy un número como 50, por suerte, dice, gracias por el 50. ¿Por qué? Debido a que tan pronto como n no es inferior a 1, dejo de quedarse atascado en este bucle, y esta nueva palabra clave hoy en día, A cambio, literalmente, hace eso. Así que he implementado, en un sentido, el equivalente de GetString, donde estoy devolviendo a el que me está usando, algún valor. No tiene que ser una cadena, que es un int. Así que una simple, rápida ejemplo, pero que pronto ver un poco más sofisticada versiones fijas. De hecho, vamos a echar un vistazo a una uno numérico que se llama return.c. Y éste es en realidad un poco más simple. Así que el propósito de este programa en vida-- vamos a compilar y ejecutar él, así que regreso, dot slash, aviso return-- el programa simplemente cubica el valor 2. Es bastante estúpido, es difícil código, no se necesita ninguna entrada, pero demuestra otra función que yo mismo he escrito. Así que aquí, he declarado un variable llamada x, de tipo int, igual al número 2, completamente arbitraria. Esta es sólo una impresión suave y esponjosa. Dice x es ahora, tal y tales, cubicación dot dot dot. Y la magia es al parecer en la línea 21. Voy a llamar a una función llamada, cubo, Estoy entregando una hoja de papel con el número 2 escrito en él, y qué valor, matemáticamente, Qué quiero salir de ella? Así como una comprobación de validez? 8. ¿Correcto? Quiero 2 Cubed espalda, 2 a el poder de 3, por lo que el 8 de vuelta. Entonces, ¿dónde se implementa cubo? Bueno, el aviso se implementa aquí. Y al igual que antes, lógicamente, a pesar de que la sintaxis es probablemente muy nuevo para muchos de ustedes, Quiero esta función para mí devolver una hoja de papel con un int en él. Así que tengo un int, el nombre es arbitraria, pero convenientemente llamado cubo. La entrada a la misma, es de n tipo entero, así que eso es cómo me puede pasar en el número 2 en una hoja de papel. Y luego resulta que C soportes matemáticas, por lo que no tienen los x para los tiempos, sólo tiene que utilizar el asterisco para la multiplicación. Y esto devuelve n veces n veces n, que es simplemente un valor en cubos. Entonces, ¿dónde vamos con todo esto? Esto es definitivamente un viaje relámpago, puede estar seguro, que en las secciones súper y en el conjunto de problemas 1, se le entramos por todo esto aún más. Y en un problema conjunto 1, vamos a la transición desde el mundo de la gráfica de Scratch a algo más de línea de comandos en C. Pero nos inspiramos de este juego aquí de antaño, en el que usando C y la edición estándar del p conjunto que va a poner en práctica la pirámide de Mario. Y en la edición pirata del p conjunto, si así lo desea para elegir, usted implementará un poco más desafiando pirámide con dos picos. También implementa una algoritmo, un algoritmo codicioso. Resulta que hay algo de lógica interesante detrás del proceso de corriendo estación de cajero y de hecho la entrega alguien cambio trasero. Existe un algoritmo que es bastante sencillo, que podría incluso captar intuitivamente la primera vez que lees it-- darse cuenta de que es lo que he siempre hecho alguna vez me he dado a alguien alguna parte posterior-- dinero que le permite siempre minimizar el número de notas de papel o monedas metálicas que está devolviendo al usuario. Y esto, por supuesto, es convincente porque si vas a CVS o lo que sea, usted no quiere estar sola mano un montón de los o un montón de monedas de un centavo. Usted quiere que el menor número monedas, probablemente, posible. Por último, también será desafiado a incursionar en el mundo del agua y en realidad obtener una apreciación para un mapeo entre las tasas de flujo, de recibir, el agua en la ducha, qué cantidad de agua se utiliza. Y la alusión en el mismo, será este clip aquí, que vamos a terminar por sólo 60 segundos, que pinta un cuadro de cabezales de ducha de bajo flujo. [REPRODUCCIÓN DE VÍDEO] -Correcto. Tengo todo aquí. Me dio la Serie F Ciclón, Hydra, Jetflow, Estocolmo SuperSteam, lo que sea. -¿Y Qué me recomienda? -¿Qué buscas? -Hombre de poder. Poder. -Como Silkwood. -Eso Es para la radiación. -Eso es correcto. -Ahora ¿Qué es esto? -Eso Es el Comando 450. Yo no vendo ese. -Pero Eso es lo que queremos. Es un comando 450. -No Me creen. Sólo se utiliza en el circo. Es para los elefantes. -Voy A pagar nada. -¿Qué Acerca Jerry? -Él No podía manejar eso. Él es delicada. Oh si. [FIN DE REPRODUCCIÓN] DAVID J MALAN: De acuerdo. Eso si para CS50. Nos vemos la semana que viene. ALTAVOZ 1: [? Scully?] [? Ian,?] por lo que este proyecto outro, ¿qué has chicos llegar a? ALTAVOZ 2: Bueno, le hemos dado es una variedad del pensamiento, y creemos que la mejor manera a-- ALTAVOZ 3: ¿Puedo? ALTAVOZ 2: Sí. Por todos los medios, en realidad. ALTAVOZ 3: Así que creo podemos resumir nuestra idea para los outros con un solo nada palabra--. DAVID J MALAN: ¿Nada? ALTAVOZ 3: Nada. DAVID J MALAN: ¿Qué significa eso? ALTAVOZ 3: Los outros son nueces. ALTAVOZ 2: Bueno, quiero decir, en la filosofía, Quiero decir, nada es siempre algo. ALTAVOZ 1: Así what's-- ¿cuál es la premisa? ALTAVOZ 3: Así es como la vida. OK. Qué hiciste hoy? DAVID J MALAN: me levanté, tenía desayuno, y llegó a trabajar. ALTAVOZ 3: Esa es una outro. ALTAVOZ 2: Pero, quiero decir, no debe algo le suceda a él en el-- ALTAVOZ 3: No, no, no, no. No pasa nada. ALTAVOZ 1: Así que ¿por qué estamos viendo? ALTAVOZ 3: Porque es un outro para CS50. DAVID J MALAN: Todavía no.