[Powered by Google Translate] DAVID J. MALAN: Muy bien. Esto es CS50, y este es el final de la segunda semana. Si usted espera a tener hambre alrededor de esta hora mañana, sé que vamos que convoque a un pequeño grupo de mañana, jueves, 1:15 PM. Hay un URL aquí si desea confirmar su asistencia. El espacio es limitado, así que por favor, perdóname si el formulario se ha llenado hasta el momento en que rellenar esto. Otra URL embargo, que puede ser de interés es la siguiente. Así que en casi un mes, el curso se va a poner a disposición tanto más ampliamente a través de EDX, a través del cual la gente en el Internet será capaz de seguir adelante, participar en el curso muy activamente, de hecho. Se va a utilizar el aparato CS50 CS50 y discutir y la mayor parte del diversas herramientas de software que ya han estado usando este semestre. Y una de las iniciativas que nos gustaría tomar como un experimento de este año es ver hasta qué punto el contenido que se puede traducir en otro hablada y lenguas escritas. Así que si usted podría tener interés en participar en este proyecto, en el que vamos a ofrecer transcripciones en inglés y subtítulos en el curso de conferencias y pantalones cortos y seminarios y secciones y similares - si usted habla con fluidez y escribir con fluidez otro idioma, lo haríamos encantaría participar en este proyecto, el cual te llevará a una o más de las videos, traduciéndolos en un idioma que conozco bastante bien. Para que os hagáis una idea de la interfaz, hay una interfaz de usuario basada en web que vamos a utilizar, que creará esencialmente una interfaz de usuario de esta manera. Esto me estaba enseñando algunos de Halloween atrás. Y en el lado derecho hay en negro al lado de estas marcas de tiempo, podrás ver las varias cosas que salieron de mi boca ese día. Y luego, por debajo de él, usted será capaz de traducir a otro idioma. Exactamente lo que el mapeo es entre, en este caso, Inglés y, por ejemplo, el español. Así que en realidad es un muy fácil de usar herramienta. Puede rebobinar y avance rápido muy fácilmente con el teclado. Así que si usted desea participar en este experimento y que sus palabras visto y leído por miles de potenciales personas por ahí, por favor, me siento libertad de participar. Ahora una palabra sobre el gatito del lunes, para que no nos han enviado un exceso mensaje de miedo. Se dan cuenta de que a medida que las horas de oficina y como sugieren las secciones sugieren, la diseño del curso es mucho para que los estudiantes y colaborar hablando de trabajar a través de los boletines de problemas y problemas juntos. Y realmente la línea sólo se reduce a, una vez más, el trabajo que en última instancia deben presentar debe ser la suya. Y lo que es, con toda honestidad - en horario de oficina, es totalmente normal - que está totalmente de esperar, incluso - a estar chateando con algunos amigos a tu lado. Si él o ella está luchando con algún tema, y ​​usted es como, oh, bueno vamos voy a dar una idea de alguna línea de código que he escrito. Eso está bien. Eso sucede. Y eso es muy favorable, creo que, con el proceso de aprendizaje. Cuando la línea, de nuevo, se cruza es cuando la cabeza es de tipo inclinado sobre aquí durante unos segundos demasiados o minutos para que realmente tenga sólo sido una oportunidad de desbloqueo para su amigo. Y ciertamente, cuando las cosas se intercambian a través de correo electrónico y Dropbox y similares, allí también está la línea. Así que por todos los medios, se sientan cómodos y se sienten animados a charlar con los amigos y compañeros acerca de conjuntos de procesadores y más. Y sólo se dan cuenta de que lo que en última instancia, someter debería ser el producto de su creación y no otra persona. Así pues, en la misma línea de adorables criaturas, es posible que saben de este tipo aquí. Así que esta es una película terriblemente cursi de años atrás. ¿Hay alguien aquí Spaceballs visto? Está bien. Así que un buen número aquí. Así que esta es nuestra manera maravillosamente académico de introducir hoy en última instancia, el concepto de criptografía. Y así uno de los problemas específicos de dominio para conjunto de procesadores 2, que entrará mañana por la noche tarde, es sumergirse en el mundo de la criptografía, que es el arte de cifrar o codificar información. Y en última instancia, se relaciona con el mundo de la seguridad. Ahora la seguridad para la mayoría de nosotros se presenta en forma de mecanismos bastante mundanas. Todos nosotros tenemos nombres de usuario y contraseñas. Y todos tenemos nombres de usuario y contraseñas muy malos, muy probablemente. Si la contraseña es la misma en varios sitios web, que probablemente no es la mejor idea, como veremos hacia el final del semestre. Si la contraseña se escribe en una nota adhesiva - no es broma - en su monitor, que tampoco es necesariamente el mejor diseño, pero bastante común una fenómeno. Y si usted no está utilizando la criptografía para cifrar las contraseñas, que son especialmente vulnerables. Así que si usted piensa que está siendo súper inteligente por tener una palabra oculta documentar en algún lugar de su disco duro que tiene todas sus contraseñas pero que está en una carpeta que nadie va a mirar adentro, eso también no es muy mecanismo de seguro. Y así lo pset 2 presentaré es este arte de la criptografía y luchando información para que cosas como las contraseñas tanto más segura. Con el fin de motivar a este problema muy real con un muy no-real-world escenario, permítanme presentarles a uno de nuestros clips favoritos aquí en este película Spaceballs. [REPRODUCCIÓN DE VÍDEO] -Casco, usted demonio, ¿qué está pasando? ¿Qué estás haciendo con mi hija? -Permítanme introducir el cirujano plástico brillante joven, el Dr. Philip Schlotkin, el más grande hombre nariz de empleo en toda la universo y Beverly Hills. -Su Alteza. -Nariz trabajo? No entiendo. Ella ya ha tenido una cirugía de nariz. Era un dulce 16 presentes. -No, no es lo que usted piensa. Es mucho, mucho peor. Si no me dan la combinación de la protección del aire, el Dr. Schlotkin voluntad dar a su hija de vuelta a su antigua nariz. -No! ¿De dónde sacaste eso? -Muy bien. Se lo diré. Se lo diré. -No, papá, no. No debes hacerlo. -Tienes razón, querida. Voy a extrañar su nueva nariz. Pero no voy a decirles la combinación no importa qué. -Muy bien. Dr. Schlotkin, haz lo que quieras. -Es un placer. -No! Espera, espera. Se lo diré. Se lo diré. -Yo sabía que iba a funcionar. De acuerdo, me lo da. -La combinación es uno. -One. -One. -Dos. -Dos. -Dos. -Tres -Tres. -Tres. -Cuatro. -Cuatro. -Cuatro. -Five -Cinco. -Cinco. -Así que la combinación es uno, dos, tres, cuatro, cinco. Eso es lo más estúpido combinación que he oído en mi vida. Esa es la clase de cosa que un idiota podría tener en su equipaje. -Gracias, Su Alteza. -Lo hiciste? -Apagué la pared. -No, no lo hiciste. Se apagó la película entera. -Debo de haber pulsado el botón equivocado. -Bueno, lo puso de nuevo. Coloque la película de nuevo. -Sí, señor. Sí, señor. -Vamos, Erna. Ven, Gretchen. Por supuesto que sé que todavía tendremos que cobrarle por ello. -Bueno, ¿funciona? ¿Dónde está la puerta? -Funcionó, señor. Tenemos la combinación. -Grande. Ahora podemos tomar cada último soplo de aire fresco del planeta Druidia. ¿Cuál es la combinación? -Uno, dos, tres, cuatro, cinco. -Uno, dos, tres, cuatro, cinco? -Sí. -Eso es increíble. Tengo la misma combinación en mi equipaje. Preparar Spaceball 1 para salida inmediata. -Sí, señor. -Y cambiar la combinación en mi equipaje. -Ay! [FIN DE REPRODUCCIÓN DE VÍDEO] DAVID J. MALAN: Una película increíble que ahora todos deben ver. Así el contexto aquí es que con los datos inseguros viene una oportunidad para cifrar y para trepar. Y por lo que este, por ejemplo, es un ejemplo de un mensaje cifrado. En realidad, esto dice algo en Inglés. Pero es evidente que no es totalmente obvio. Y vamos a llegar al punto de partida hoy a desmenuzar lo que este secreto mensaje aquí es. Pero en el mundo real de las computadoras, las cosas no parecen que incluso podría ser frases en inglés. Por ejemplo, esto es lo que puedes encontrar en un sistema Linux o Mac estándar o Unix ordenador en un archivo que fue en otro tiempo llamado el archivo de contraseñas. Hoy en día, se ha trasladado a otros lugares. Pero si nos fijamos en el lugar correcto en un sistema, podrás ver no sólo su nombre de usuario o la de otras personas en el sistema, pero verás un versión encriptada de su contraseña. En efecto, la cripta hay palabra sugiere que las siguientes cosas están cifrados. Y esta serie de letras aparentemente al azar y caracteres y números y etc puede ser descifrado por lo general sólo saber un secreto - una palabra secreta, un número secreto. Y así, en efecto, el arte de la criptografía en última instancia se reduce a la confianza de algunos clase y saber algo que nadie más lo hace. Vamos a estudiar esto con más detalle un poco más hoy y en el conjunto de procesadores por venir. Y ahora una palabra sobre pasa / falla. Por tanto, y como algunos de ustedes han buceado en conjunto de procesadores 1, el aparato, y un mundo muy nuevo para usted, se dio cuenta de que las frustraciones y confusión y dificultades técnicas sólo son de esperar. Especialmente con el conjunto de procesadores en primer lugar, donde hay tantas cosas nuevas, sólo conseguir familiarizados con ls y cd y todos estos comandos arcanos en un nuevo entorno. Y que es separado del material real y programación en sí. Así dan cuenta, también, que sin duda hay horario de oficina que existen como la estructura de soporte. Secciones comenzará el próximo domingo. Pero lo más importante, si te sientes solo que este no es el mundo para ti, date cuenta de que en realidad se limita a tomar tiempo. Y si no fuera por esta oportunidad hace años para mí de tomar una clase pasa / no pasa, la verdad, nunca me hubiera puesto un pie en el aula. Y usted puede cambiar esto para arriba hasta, digamos, el quinto lunes del curso. Así que si usted está en el borde ahora, darse cuenta de que en lugar de cabeza en algún otro aguas en conjunto, no ciertamente en cuenta sólo cambiar para pasar / fallar. Una vez más, no hay realmente esta cultura aquí en Harvard de tomar las cosas pasa / no pasa ya que todo el mundo quiere lograr o creces. Pero, francamente, esta es una maravillosa manera de probar algo que tal vez no ser familiar para usted. Y usted va a terminar haciendo en la mayoría de los casos muy finas, tal vez mucho a su sorpresa. Y en términos más concretos, lo que creo que pasa / no pasa generalmente lo hace, especialmente en lo que podría haber experimentado con conjunto de procesadores 0, si usted ha puesto en 10 horas, 15 horas, 25 horas en algún conjunto de procesadores - y no eres más que golpear la cabeza contra la pared, y se está haciendo super tarde en la noche, pero que ha tomado el conjunto de procesadores como el 90% del camino, usted sabe que usted no puede entender una cosa - pasa / no pasa realmente toma el borde de una clase como esta, donde se puede ordenar feliz de decir muy bien, ya sé que no es perfecto. Pero trabajé mi culo en esto. Estoy bastante contento con el lugar donde terminó. Y que cumpla con las expectativas de pasa / no pasa. Así que tenlo en cuenta. Está bien. Así que aquellos de ustedes que han tenido dificultades para utilizar la Universidad de Harvard Wi-Fi saber que hay un SSID CS50, una conexión Wi-Fi flotando alrededor que podría tener mejor suerte para. Es un poco irónico que la clave para esto - si usted desea probar conecte a este para obtener mejores velocidades y háganos saber si no es mejor - es uno, dos, tres, cuatro, cinco, todo el camino hasta ocho porque ocho es más seguro que cinco. Así que si usted necesita la contraseña de Wi-Fi, conexión inalámbrica a CS50 aquí. Uno, dos, tres, cuatro, cinco, seis, siete, ocho. Y mensaje el CS50 Hable si usted todavía tiene problemas de conectividad intermitente, y vamos a dejar que los poderes que se conocen para este espacio. Está bien. Así que un reclamo rápido, especialmente para aquellos de ustedes que son chicos o chicas fans de todas las cosas de Apple. Lo que desenterrado de hace unos años era este archivo aquí, ilock.c, sólo para tipo de hacer más concreto y más complejas algunos de los más básico C programas que hemos estado escribiendo. Así que abrí este archivo, ilock.c. Está disponible en la página de conferencias para hoy. Por el lado de la izquierda, se ve una larga lista de funciones. Así que el tipo que escribió esto escribió una gran cantidad de funciones, más que simplemente principal. Él utilizó una gran cantidad de bibliotecas aquí. Y si empezamos a desplazarse a través de, lo que esto realmente es, es el mismo En primer lugar, creo yo, para romper el iPhone original. Cuando se quería hacer jailbreak al iPhone original, lo que significa desanudar lo de AT & T y en realidad instalar software especial en él y hacer cosas que Apple no quiere que la gente a hacer - Bueno, alguien se tomó el tiempo para averiguar exactamente cómo podrían explotar defectos de software, errores, errores, en el software de Apple. Y así nació ilock.c. Que si lo recopiló en un ordenador e instalado en un iPhone Se conecta a su ordenador a través de, por ejemplo, un cable USB, esto le daría privilegios de administrador o root en tu iPhone y te hacen más o menos lo que quieras. Y así ha sido este fascinante gato y al ratón entre Apple y el resto del mundo, en particular en lo que, al igual que muchas empresas, tratan de bloquear sus cosas abajo de manera que sólo se puede hacer con ella lo que tenía planeado. Pero gracias a gente como esta y su comprensión de bajo nivel información y, en este caso, de programación C y un montón de las construcciones familiares que hemos empezado a jugar, usted puede realmente aprovechar el hardware de una manera mejor le parezca y no necesariamente una entidad corporativa. Así, por ejemplo, no tengo ni idea de lo que todo esto está haciendo. Pero GetVersion suena bastante sencillo. Y parece que esta es una función que esta persona escribió. Tome algún tipo de número entero como argumento, no devuelve nada, pero parece bucle con un bucle aquí y si una condición, si la condición, romper, y de alguna manera se relaciona con el número de versión. Si nos desplazamos hacia abajo - a pesar de que muchas de estas palabras clave se va a ser nuevo, y hay un gran cantidad de funciones en aquí nunca hemos visto y no podrían nunca ver más el transcurso del semestre - al final de la día, sigue las mismas reglas y la lógica que hemos sido jugando con hasta ahora. Así que esto es demasiado viejo para romper sus 3s 4s iPhone o 5 años o antes, en estos días, pero sepan que todo se deriva en gran medida de este mundo que hemos se zambulló en. Así que echemos un vistazo a un pequeño ejemplo más simple. Éste, sólo para entrar en calor con un poco de sintaxis y también algunos otros datos tipo que hemos hablado, pero no han visto realmente en C. Así que esta es una archivo llamado positive1.c. Y por los comentarios en la parte superior, esto sólo exige que un usuario proporcione una número positivo. Así que es un ejemplo de un bucle do-while, que es agradable para el usuario interactivo programas en los que usted necesita para avisar al usuario de que haga algo. Y si ellos no cooperan, les gritas o rechazar su entrada. El caso en cuestión, voy a hacer las líneas 19 a 24, siempre que el usuario tiene No me ha dado un número positivo. Ahora bien, este detalle aquí en la línea 18, ¿por qué yo declaro n por encima de este conjunto construcción de bucle en lugar de justo al lado de la línea 22 en el que realmente importa para obtener n? ¿Sí? [Inaudible] DAVID J. MALAN: Sí, por lo que este problema de alcance. Y, en términos sencillos, ¿qué alcance se refiere? ¿Sí? [Inaudible] DAVID J. MALAN: ¿Puedes hablar un poco más alto? Ponencia 1: Donde se puede acceder a una variable en particular. DAVID J. MALAN: Perfect. Donde se puede acceder a una variable en particular. Y, en general, la regla general hasta ahora ha sido que el alcance de algunas variable se define por las llaves más recientes que he visto. Y así, en este caso, si he cometido el error de declarar n en la línea 22, que la línea iba a funcionar. Me gustaría conseguir un int, por lo que lo pone en esa variable n en la línea 22. Pero qué línea de código ahora no tendría ni idea de lo que estoy hablando? Así que 25, y resulta que 24, así, porque en este caso, queda fuera de las llaves. Así que un poco de una molestia, pero muy fácil de resolver simplemente declarando la variable fuera de la función. Ahora vamos a ver el día de hoy, se puede ir un paso más allá. E incluso podría ser un poco perezoso - y esto no es lo recomendado, en general - sino que incluso podría darte pereza y poner una variable a nivel mundial, por así decirlo, no interior de una función, no en el interior de un bucle, pero en el propio archivo, fuera de todas las funciones que usted ha escrito, como lo hice aquí en la línea 15. Pero esto es generalmente mal visto. También debes saber esto a veces es una solución a otros problemas, como veremos finalmente ver. Así que por ahora, vamos a dejarlo así. Pero vamos a ver si podemos volver a escribir esto para iniciar una expresarnos poco diferente. Así que este programa, sólo para que quede claro, es positive1. Déjame ir por delante aquí y en mi ventana de terminal hacer positive1, Enter. Compila, está bien. Voy a correr positive1, pulse Enter. Exijo que me des un entero positivo. Diré -1. Eso no funcionó. 0, 99, que parece funcionar. Quizás no es la prueba más rigurosa. Pero por lo menos es una prueba de cordura agradable que estamos en el camino correcto. Así que ahora vamos a seguir adelante y abrir la segunda versión de este. Y lo que es diferente ya? Se implementa la misma cosa. Pero lo que está saltando como claramente diferente esta vez? Sí, por lo que este bool en verde. Gedit ha resaltado en verde esta palabra clave denominada bool, que es un tipo de datos. No viene integrado en todas las versiones de C. Es necesario incluir una biblioteca específica. En nuestro caso, que incluye la biblioteca CS50 para que nos tienen acceso a bool. Sin embargo, en la línea 18, parece que tenemos un valor booleano llamado aquí agradecidos. Así que podría haber llamado a esta cosa. Pero me llamó agradecido sólo para transmitir algún tipo de significado semántico. Así que al principio de la línea 18, no estoy agradecido al parecer debido a que el Valor agradecido Boolean se inicializa en false en la línea 18. Y entonces parece que lo que he hecho aquí en las líneas 21 a 23 se acabo tipo de reescribir mi lógica. Así que no funcionalmente diferentes. Sin embargo, en la línea 22 ahora, puedo comprobar si el int el usuario ha proporcionado es mayor que 0, entonces simplemente cambiar el valor de agradecer a true. ¿Y por qué lo hago? Debido a que en la línea 25, al parecer, voy a comprobar una condición. ¿Es este bucle while agradecido es falso. Así que propongo esto como una alternativa a la versión uno, porque es por lo menos un poco más intuitivo, quizá. Es un poco más a tierra en Inglés. Así que haga lo siguiente mientras no estás agradecido o agradecida mientras que es falso. Y esta vez, también, al parecer, no me importa recordar lo que el usuario escribió porque en el aviso no hay n variables. Así que en realidad, yo - una pequeña mentira blanca allí. Funcionalmente, el programa es un poco diferente una vez que lleguemos al fondo de porque yo no estoy acordando de lo que n es. Pero yo quería demostrar que también en este caso a pesar de que hemos visto y getInt GetString se utiliza en el lado derecho de un signo de igual modo que hasta ahora recordamos el valor, técnicamente, no es estrictamente necesario. Si por cualquier razón usted no les importa para guardar el valor, lo que desea para comprobar el valor, observe que simplemente podemos escribir esto como getInt abierto Paren, paren cerca. Esta función va a devolver un valor, como lo hemos estado diciendo. Se te va a devolver un int. Y así, si mentalmente pensar de que esto ocurra, cuando escribo en 99, getInt devuelve el número 99. Y así, conceptualmente, es como si mi código eran en realidad esto. Así que si 99 es en realidad mayor que 0, entonces se convierte en verdad agradecido. Entonces se da cuenta de la línea 25 ooh, hemos terminado porque ahora estoy agradecido. Y en la línea 26, simplemente decir gracias por el entero positivo, lo que pasó a ser. Ahora vamos a hacer el azúcar sintáctico leve aquí, por así decirlo. Vamos a ver si podemos limpiar esta línea 25 con esta variación tercera y última en positive3. Así que notar que la única diferencia ahora es qué línea de código? Sí, ¿y 25. Y no hemos visto realmente este truco todavía. Pero nos hicieron ver el signo de exclamación el lunes, lo que denota qué? Así que no, o negación. Así que toma un valor booleano y voltear su valor. Cierto convierte en falsa. Falso se hace realidad. Así que esto, propongo, es aún un poco más intuitivo de un modo de escribir el código porque todavía agradecido inicializar en false. Todavía hago lo siguiente. Puse agradecido a true cuando llegue el momento. Pero ahora usted puede realmente traducir este código sólo verbalmente izquierda a derecha, mientras no agradecido. Debido a bang, o signo de exclamación, denota la noción de no, así que mientras no gracias. Así que de nuevo, no hemos introducido nuevos conceptos en sí. Hemos hablado de Booleanos atrás cuando jugamos con Scratch. Pero doy cuenta ahora que acabamos de comenzar a escribir nuestro código en muchas maneras diferentes. Por tanto, y en pset1, si usted es una especie de lucha por descubrir la manera de escribir algún programa, la Casa estás de suerte porque no va a haber ninguna número de soluciones que le pueden suceder a. Por ejemplo, esto es sólo tres para incluso el más simple de los programas. Está bien. Y ahora recuerdo el lunes, dejamos en esta nota con valores de retorno. Así, por primera vez, escribimos un programa que no sólo tiene principal, también tiene su propia función personalizada que escribí aquí. Así, en la línea 31 a la 34, he implementado una función de cubo. No es complejo. Es que algunas veces veces y una, en este caso. Pero lo importante de esto es que estoy tomando de entrada en forma de una y Voy a devolver la salida en forma de veces y varias veces a. Así que ahora tengo la capacidad, tanto como solía hacerlo con printf solo, para llamar esta función llamando a la función de cubo. Y la función de cubo tiene alguna entrada. Y la función devuelve un cubo de salida. Y así, por el contrario, printf acabo de hacer algo. No volvió todo lo que nos importaba - a pesar de que, como Aparte de eso, no devuelve ningún valor. Sólo generalmente lo ignoran. Printf acabo de hacer algo. Tenía un efecto secundario de la impresión en la pantalla. Por el contrario aquí, tenemos la función de cubo, que en realidad devuelve algo. Así que este es generalmente - para aquellos que están familiarizados con esto, es una idea bastante sencilla. Pero para aquellos menos familiarizados con la idea de pasar en los insumos y obtener salidas traseras, vamos a tratar sólo algo simple super. ¿Hay alguien que viene cómodo en el escenario brevemente? Usted tiene que estar cómodo con una cámara en usted, también. Si. Bien, ¿cuál es tu nombre? KEN: Ken. DAVID J. MALAN: Ken. Muy bien, Ken. Vamos arriba. Así Ken va a ser una función de la clase aquí. Y vamos a seguir adelante y hacer esto. Vayamos un poco sofisticado. Gusto en conocerlo. Bienvenido al centro del escenario. Está bien. Vamos a golpear el botón aquí. Está bien. Así que aquí tienes una pizarra moderna. Y lo que yo soy es la función principal, por ejemplo. Y no tengo un iPad en la mano. Yo no me acuerdo cómo - bueno, en realidad, no puedo decir eso. Yo realmente no tengo buena letra. Y por lo tanto, quiero imprimir algo en la pantalla para mí. Así que estoy siendo el programa principal. Y le voy a decir que tienes esto escribiendo en mi garabatos y entonces el paso de una entrada. Así como tonto aunque este ejercicio es, la noción de funciones y llamar a un función y devuelve una función realmente se reduce a esto. Estoy principal. Acabo de escribir printf ("algo") en la pantalla. Estoy ejecutando este programa. Y tan pronto como se llama a printf, toma un argumento - o un parámetro, a veces - entre comillas dobles. Aquí está el argumento. Lo estoy pasando a Ken. Ahora él es un cuadro negro escrito un número de años que al parecer sólo sabe imprimir cosas en la pantalla. Por lo tanto, ejecutarse. Eso no es malo. Así, muy bien. Así que ahora se lleva a cabo la ejecución de Ken. ¿Tiene que darme nada a cambio? Así que lo que hemos visto hasta ahora. Una vez más, es en realidad printf devuelve un número. Pero vamos a ignorar que, por ahora, porque nunca he usado. Así que eso es todo por Ken. Y ahora principal vuelve a ejecutar - principal toma el control de nuevo el programa porque esa línea de código, printf, se lleva a cabo la ejecución. Y que avanzamos en nuestro camino ejecución de cualquier otras líneas están ahí. Está bien. Así que ahora vamos a probar un ejemplo un poco diferente. Y esta vez aquí, se va a borrar la pantalla aquí. Y esta vez, vamos a hacer la función de medición de volumen. Pero esta vez, espero que un valor de salida. Así que vamos a seguir adelante y hacerlo. Así que ahora tengo una línea de código que dice que x = cubo (x). Así que en realidad let's - la línea de código, el recuerdo, se ve así. x = cubo (x). Entonces, ¿cómo se va a trabajar? Así que vamos a seguir adelante y darle una pantalla en blanco de nuevo. Y yo voy a escribir ahora por el valor de x, que en este momento de tiempo pasa a ser, digamos, 2, para que sea sencillo. Así que he escrito en un pedazo de papel el valor de 2, cual es mi valor x. Se lo entrego a Ken. KEN: Y acabo de escribir la respuesta? DAVID J. MALAN: Sí, vamos a escribir la respuesta. Bien. Y ahora me tiene que devolver algo. Por lo tanto - perfecto. Niza segue. Así que ahora me pasa de nuevo el valor de 8, en este caso. ¿Y qué hago con él? Bueno, en realidad, vamos a ver. Obtener este derecho. ¿Qué voy a hacer con él? Ahora me voy a tomar este valor y en realidad lo guarde en los mismos bits en la memoria. Pero note, yo soy una especie de lucha aquí. Estoy un poco confundido porque donde puedo realmente escribir el valor de x? Porque lo que acabas de hacer es físicamente Ken mano una hoja de papel que tenía el valor 2, que era x. Y de hecho, eso es precisamente lo que sucede. Así que resulta que cuando se llama a una función, y se le pasa un argumento como "hola mundo" o se le pasa un argumento como el 2, por lo general, está pasando una copia de ese argumento. Y así como yo anoté el número 2 aquí y se lo dio a Ken, que debe significa que todavía tengo una copia del valor 2 en alguna parte. Porque en realidad, ahora que lo he conseguido volver el valor 8, tengo que volver atrás en el RAM y realmente anotar 8, donde una vez tuve el número 2. Así que recuerda visualmente esta idea de pasar literalmente en una copia del valor. Ken hace sus cosas, me da algo de vuelta - en este caso, un valor como 8. Y entonces tengo que hacer algo con ese valor si quieren mantenerlo ahí. Así que todo esto va a ser muy familiar dentro de poco. Muchas gracias por esta demostración aquí, Ken. Está bien. Muy bien hecho. Así que vamos a ver la forma en que en última instancia se refiere a algunas de las funciones pidiendo que hemos estado haciendo aquí. Así que déjame ir por delante y nos lleve de nuevo al ejemplo cubicación aquí. Y note que si queremos realmente empezar a tomar este más futuro, vamos a tener que tener en cuenta el hecho de que el número x que está siendo aprobada en aquí es diferente de lo que realmente está pasando en la función. Así que de nuevo, esto pasa por la copia va a ser muy germano en un momento. Así que vamos a echar un vistazo a algo que no acaba de funcionar bien todavía. Voy a seguir adelante y abrir un ejemplo calesa tercero, que adolece de la naturaleza. Y se llama buggy3, e implementa una función de intercambio. Así que aquí tenemos una función principal que ha xey arbitrariamente inicializa 1 y 2, respectivamente. Podríamos utilizar getInt, pero sólo necesitamos un ejercicio simple. Así que es codificada como 1 y 2. En las líneas 21 y 22, que al parecer imprimir x e y, uno por línea. Luego, en la línea 23, sostengo que estoy cambiando estos valores, punto, punto, punto. Me aparentemente llamar a una función en la línea 24 llama intercambio que toma dos argumentos. Es totalmente legítimo para las funciones que tomar dos argumentos. Hemos visto printf hacerlo ya. Así intercambio aparentemente toma x e y. Y como su nombre lo indica, es de esperar que va a intercambiar estos dos valores. Así que me dicen en la línea 25, intercambian. Y reimprimir x e y bajo el supuesto de que que han sido efectivamente intercambiados. Pero si realmente ejecutar este programa - déjame abrir una ventana de terminal. Permítanme hacer buggy3. Como su nombre lo indica, esto no va a terminar bien. Porque cuando pulse la tecla Enter, nótese que x es 1. y es 2. Y sin embargo, al final del programa, que todavía están, de hecho, el mismo. Así que basado en la demostración acaba con Ken, lo que realmente está pasando? Bueno, vamos a profundizar en esta función swap. Es súper corto. No es más que unas pocas líneas de código de tiempo. Pero ¿cuál es el problema fundamental que debe basarse en la simple historia le dijo a aquí con Ken? ¿Por qué el canje de rompe? [Inaudible] Exactamente. Así que estamos en guardar una copia, no la variable en sí. En otras palabras, de intercambio aparentemente toma dos argumentos, un int. Y está llamado arbitrariamente a y b. Y hasta aquí, he pasado en x e y, que son, respectivamente, 1 y 2. Pero no estoy literalmente pasando x. No estoy literalmente pasando en y. Estoy pasando una copia de x y una copia de y. Es como casi como si ha copiado y pegado en intercambiar los valores que desea que se manipulan en realidad. Así que si ese es el caso, cuando yo, el programa comenzará a ejecutar la línea 35, luego 36 - cuando llegue a la línea 37, en este momento de la historia, ¿cuál es el valor de a? En este punto de la historia, línea 37, ¿cuál es el valor de una en este momento? Por lo tanto, sólo debe ser 1. ¿Cierto? Como x se pasa como primer argumento. Y esta función sólo arbitrariamente se llama su primer argumento, a. Del mismo modo es y, el segundo argumento. Y es justo llamar a la b arbitrariamente segundo argumento. Ahora bien, esta dicotomía es en realidad bastante simple explicación. Piensa en ello. Ninguno de nosotros ha conocido a la persona que escribió printf. Así que seguramente, él o ella no tiene idea de lo que nuestras variables de 30 años más tarde se van para ser llamado. Así que tiene que haber una distinción entre lo que llaman variables en funciones que está escribiendo y lo que llamamos variables en funciones que está llamando o utilizando. En otras palabras, he escrito mis variables como x e y. Pero si alguien había escrito la función de intercambio, él o ella ciertamente No sabría qué mis variables van a ser llamado. Así que darse cuenta de que esto es por qué tiene esa dualidad de nombres. Técnicamente, yo podría hacer esto por casualidad. Pero todavía se pasa como copias. Sólo sería una pura coincidencia estéticamente si esa persona que escribió intercambio había utilizado los mismos nombres. Está bien. Así que en este punto de la historia, línea 37, a es 1. b es 2. Y ahora me dedico a intercambiarlas. Bueno, primero que nada, me lo hacen realmente mucho más simple. No sé cuáles son esas tres líneas de código hacían. Permítanme hacer esto. b obtiene una. obtiene un b. Hecho. ¿Por qué esta roto, lógicamente? Es algo de lo intuitivo, ¿verdad? Por lo tanto se convierte en una b. Y b se convierte en una. Pero el problema es que tan pronto como se ejecuta la línea 37, ¿cuál es la valor de a y b? El mismo, 1. Porque has paliza, por así decirlo, has cambiado b sea igual a. Así que una vez que la línea 37 se ejecuta, eso es genial. Ahora tiene dos copias del número 1 dentro de esta función. Así que cuando usted dice en la línea 38, se pone un b, bueno, eres un poco jodido. Porque estás asignando 1 a 1. Usted ha perdido el tipo de valor que le importaba. Así que en la versión original de este, observe lo que hice. Yo en cambio tuvo una tercera línea de código que se veía así. Yo declaro una variable temporal - tmp es un nombre muy común para una variable temporal. Es un int porque tiene que coincidir con lo que yo quiero hacer una copia de. Puedo guardar una copia de un interior de tmp. Así que una vez que la línea 37 se ha ejecutado, el valor de a es - cordura registro rápido - 1. El valor de b es 2. Y el valor de tmp es también 1. Así que ahora ejecutar la línea 38. Así que una vez que la línea 38 se ejecuta, una toma el valor de b. Y b fue de 2. Así es ahora un 2. Así que en este punto de la historia, a es 2, b es 2, y tmp es 1. Así que ahora, lógicamente, podemos valorar sólo tmp plop en la b. Y hemos terminado. Para ello hemos resuelto ese problema. Por desgracia, cuando ejecuto este programa en esta forma, en realidad no intercambiar cualquier valor. Pero para que quede claro, ¿por qué? He arreglado el problema lógico de hace un momento. Pero de nuevo, si ejecuta este programa, x e y no cambian a finales de la ejecución del programa. [Inaudible] DAVID J. MALAN: Así que no han devuelto nada. Así que eso es cierto. Pero resulta que hay un pequeño problema aquí, porque hasta el momento, el Lo único que hemos podido volver es una cosa. Y esta es una restricción de C. Sólo puede volver realmente un valor, en cuyo caso, estoy un poco atascado aquí porque pude devolver el nuevo valor de x o podía devolver el nuevo valor de y. Pero quiero tanto atrás. Así que regresa no es la solución simple aquí. Pero el problema fundamental es ¿por qué? ¿Qué hemos cambiado en realidad? a y b. Pero a y b son copias de x e y, lo que significa que acabamos de hacer todo esto trabajo - sólo pasamos como tres minutos hablando sobre el canje función y los tres de estas variables. Y eso está muy bien, perfectamente correcto en el aislamiento. Sin embargo, un alcance y b es la única en estas líneas aquí. Así como un bucle, si se declara un entero i para el interior de la loop - Del mismo modo, si usted está dentro de declarar a y b de una función que que has escrito, son válidos sólo dentro de esa función. Lo que significa que tan pronto como swap se realiza la ejecución y se pasa de la línea 24 a línea 25, X e Y no han cambiado en absoluto. Usted acaba de perder un montón de tiempo que se tarda copias de variables. Así resulta que la solución a esto es en realidad no evidente. No es más que suficiente para devolver valores porque podemos sólo devuelven un valor. Y realmente quiero cambiar tanto x como y, al mismo tiempo. Así que vamos a volver a eso. Pero, por ahora, se dan cuenta de que el problema fundamental se deriva del hecho que a y b son copias. Y ellos están en su propio ámbito. Bueno, vamos a tratar de resolver esto de alguna manera. Permítanme retroceder en realidad aquí y abren, digamos, una cuarta variante de este, buggy4. Y ¿qué pasa con esto? Este es un problema similar pero más sencillo que mirar antes de tomar una puñalada en resolverlo. Este programa se llama incremento. Y, al parecer, se inicializa un entero x a 1 en la línea 18. Entonces me dicen x 1. Entonces reclamación incrementando, punto, punto, punto. Entonces llame incremento. Pero entonces, en las líneas 22 y 23, que dicen que ha sido incrementado. Yo reclamo x ahora es lo que es, presumiblemente, 2. Pero este programa está libre de errores. ¿Cuál es el problema? ¿Sí? [Inaudible] DAVID J. MALAN: Exactamente. Así que x ha sido declarada, obviamente, en la línea 18. Es dentro de llaves principal. Así que la respuesta simple es que, bueno, x existe aquí. No existe en la línea 32. Así que este programa realmente ni siquiera se compilará. El compilador, cuando intento compilar este código, se va a gritarme sobre algún identificador no declarado o algo por el estilo. De hecho, vamos a intentarlo. Se trata de hacer buggy4. Ahí está. El uso de x identificador no declarado en la línea 32. Y, de hecho, vamos a ser más explícito aquí hoy para que esto sea útil en las horas de oficina y en casa. Tenga en cuenta que es un poco críptico escrito. Pero el hecho de que tiene Clang nos gritó, diciendo: buggy4.c: 32:5, es realmente útil. Esto significa que el error está en la línea 32 en la posición de cinco caracteres. Así que uno, dos, tres, cuatro, cinco. Eso es, en efecto, donde el problema es. Y también a tener en cuenta en las horas de oficina y en casa, tengo suerte aquí. Tengo un error. Va a ser relativamente fácil de solucionar. Pero si tienes una pantalla llena de mensajes de error abrumadoras, de nuevo, darse cuenta de que el situado más abajo podría ser un síntoma de las más altas. Así que siempre persigue a los errores de arriba hacia abajo. Debido a que sólo puede haber un efecto en cadena que le está sugiriendo tiene problemas mucho más de lo que realmente hacen. Entonces, ¿cómo podemos solucionar este problema si mi objetivo es incrementar x? ¿Qué es eso? Bien. Así que podemos hacer x global. Vamos a tomar el atajo que me advirtió acerca de antes. Pero diablos, sólo necesitamos una solución rápida. Así que digamos que x int aquí. Eso hace que x global. Así que ahora principal tiene acceso a ella. Y incremento tiene acceso a ella. Y así que déjame ir adelante y compilar este momento. Hacer buggy4, Enter. Parece compilar ahora. Vamos a correr buggy4, y parece que funciona realmente. Ahora bien, esta es una de esas cosas - haz lo que yo digo, no lo que hago, como acabo de hacer aquí. Debido a que en general, nuestros programas se van a poner mucho más interesante y mucho más que esto. Y si la solución a problemas de la vida es ah, poner toda la variables en la cabecera del archivo, muy rápidamente hacer llegar los programas terriblemente difícil de manejar. Se hace más difícil de idear nuevos nombres de variables. Se hace más difícil entender qué variable está haciendo qué. Y así, en general, esto no es una buena solución. Así que vamos a hacer esto mejor. No queremos utilizar una variable global aquí. Yo quiero incrementar x. Así que, obviamente, podría - al fin y al cabo, es un poco de una historia tonta, porque acabamos de hacer esto. Pero si yo no sabía nada de ese operador, de lo contrario no se le permitió cambiarla en principal en sí, ¿cómo podría yo poner en práctica Ken aquí, esta tiempo para no incrementar cubo pero a? ¿Cómo puedo cambiar esto de aquí? Si. [Inaudible] DAVID J. MALAN: Está bien, está bien. Así que ¿por qué no pasar x? Y entonces en vez de devolverlo, ¿por qué no me acaba de hacer return x + 1? Ahora, un par de cosas más que cambiar aquí. Estoy en el camino correcto. ¿Qué más necesita para modificar? Alguien más. ¿Sí? [Inaudible] DAVID J. MALAN: Tengo que cambiar el tipo de retorno de incremento porque no se anulará. Vacío significa que nada ha de ser devuelto. Pero está claro que ahora es. Así que esto tiene que cambiar a int para ser coherente con lo que En realidad estoy regresando. Ahora, otra cosa es aún con errores aquí. ¿Sí? [Inaudible] DAVID J. MALAN: Así que tengo que aumentar x? [Inaudible] DAVID J. MALAN: Ah, así que tengo que pasar x. Así que tengo que hacer esto aquí. Así que el prototipo, tengo que cambiar esto aquí. Así que esto tiene que convertirse en un int. Esto tiene que ser - hmm. De hecho, tengo un error aquí. Vamos a arreglar esto primero. ¿Cuál debe ser esta realidad? Por lo tanto, tiene que haber un algo int. Podría ser x. Pero, francamente, si usted empieza a llamar a todos los de su x variables, que va a obtener menos y menos clara cuál es cuál. Así que vamos a elegir arbitrariamente una nomenclatura diferente para mi funciones de ayuda, las funciones que estoy escribiendo. Lo llamaremos a. O podríamos llamarlo - vamos a llamarlo even_number a ser aún más explícito. Así que tengo que devolver todo lo que el número es más 1. Y ahora tengo que cambiar una cosa aquí y otra otra cosa aquí. ¿Qué tengo que cambiar en la línea 21 en primer lugar? Tengo que asignar a x. Así que no puedo llamar x incremento. Necesito recordar la respuesta al cambiar el valor de x en el lado de la mano izquierda. Y a pesar de que x se encuentra ahora en la izquierda y la derecha, que es totalmente correcto, porque a mano derecha se ejecuta primero y luego se dejó caer en la izquierda cosa mano, x en este caso. Y por último, esta es una solución fácil ahora. Esto sólo debe coincidir con lo que está abajo. Número Int. Está bien. Así que un montón de cambios para una función realmente estúpido. Pero representante de cosas que cada vez querrá hacer. Así que buggy4. Me he cagado en alguna parte. Oh mi Dios. Cinco errores, como, un programa de seis líneas. Entonces, ¿qué hay de malo en la línea 18, el carácter 5? Está bien. Así que tengo que declarar este int. Está bien. Así que vamos a ver, un montón de otros errores. Oh mi dios. 19, 18, 21. Pero, de nuevo, vamos a borrar la pantalla - L Control de aquí - y Clang repetición. Así que cinco problemas que en realidad es sólo una. Así que ahora vamos a ejecutar buggy4, Enter. ¡Menos mal. x se ha incrementado correctamente. Está bien. Cualquier pregunta sobre la forma de incrementar los números? ¿Sí? Ponencia 2: ¿Por qué es que usted puede cambiar el número x en la variable nombrar y va a saber lo que quieres decir? DAVID J. MALAN: Buena pregunta. ¿Cómo es que sólo puedo cambiar x a número y el programa sabrá inmediatamente? Así que de nuevo, piensa en él como esta abstracción. Así que si yo soy principal y Ken es incremental, francamente, no me importa Ken lo llama a su iPad. No me importa lo que él llama cualquier cosa que tenga que ver con su aplicación de esta funcionalidad. Así que este es un detalle de implementación que yo, principal, no que importa. Y así, simplemente cambiando constantemente dentro de la función, el número aquí y el número de aquí, es todo lo que toma tanto tiempo como yo recompilar. Es algo así como si usted piensa - muchos de nosotros, aquellos de ustedes con conductor licencias que han impulsado, o incluso si usted ha conducido en un coche - la mayoría de nosotros no tenemos idea de cómo funciona un coche bajo la campana. Y, literalmente, si se abre el capó, la mayoría de nosotros - yo incluido - no vamos a saber realmente lo que estamos viendo. Algo que se puede sentir con cosas como esta ahora mismo. Pero en realidad no tienen que cuidar cómo el coche funciona. Nosotros no tenemos que cuidar lo que todas las varillas y pistones y los cables en el interior de el coche está haciendo en realidad. Así que algo como lo que ustedes llaman el pistón no tiene importancia aquí en este caso. La misma idea. ¿Sí? [Inaudible] DAVID J. MALAN: Si hay más usos de la variable xa momento atrás, usted, el programador, tendría que cambiar todas partes. O usted podría literalmente hacer Archivo, Menú, y luego Buscar / Reemplazar, algo por el estilo. Pero vas a tener que hacer esos cambios por su cuenta. Hay que ser coherente. [Inaudible] DAVID J. MALAN: un orden particular como aquí? Si esto era int otro número? Si. Así orden importa cuando se llama a la función. Así que si me estaban llamando incremento aquí con algo algo coma, hay una correlación directa. La primera variable, como se llame, se hace una copia de la primera argumento aquí. Lamentablemente, esto no debería ser un paréntesis. Las líneas del segundo argumento para arriba con el segundo. Así orden, sí, importa. Está bien. No me tomé un largo camino para llegar hasta allí. Otras preguntas? Está bien. Así que vamos a ver si podemos pintar un cuadro de lo que realmente sucede aquí debajo de la capucha, por así decirlo. Así que este es un rectángulo que podría representar la memoria de su computadora. Así que incluso si usted no tiene idea de cómo funciona la memoria RAM o cómo funciona, por lo menos se supone que tiene racimos de él en estos días. Tienes megabytes de ella. Tienes gigabytes de ella. Y sabemos desde cero semana que un byte es qué? 8 bits. Bien, entonces 8 ceros y unos. Así que si su equipo tiene un giga de RAM, dos gigas de RAM en estos días, tiene un mil millones o 2 millones de bytes de memoria, o miles de millones a unos 8 millones de dólares o 16 bits, en el interior de su ordenador. Ahora, a diferencia del ejemplo poco lanoso Willy, no es partículas magnéticas típicamente más. Cada vez más, en los ordenadores portátiles por lo menos, es las unidades de estado sólido, SSD, que simplemente no tienen partes móviles. Todo es electrónico. Todo está basado electricidad. Así que pensar, sin embargo, de este rectángulo como sólo representa el uno o dos gigabytes de memoria que tiene. Así que es un trozo de memoria. Ahora el mundo de la informática tiene una especie de trozos de particiones de memoria para hacer cosas diferentes. Así, por ejemplo, si esta es la memoria RAM de su computadora - como sugiere el rectángulo allí - Resulta que, por convención, en la parte superior de la RAM, por lo que decirlo, es generalmente lo que se llama un segmento de texto. Esos son los ceros y unos que se han recopilado. Por eso, cuando hemos mirado debajo de la capucha lo a.out es decir, todos los ceros y unos - cuando se ejecuta un programa, los ceros y unos se cargan desde su disco unidad en algo que se llama memoria RAM. Y en la RAM, se las coloca en la parte superior. Ahora, mientras tanto, tiene otras cosas. Datos inicializados, datos sin inicializar. Esas dos franjas de memoria se refieren a las variables globales, que no se utilizan a menudo. Pero a veces, si lo hacen, terminan allí también. Entonces hay algunas otras cosas. Las variables de entorno, que no vamos a pasar mucho tiempo en. Pero dos cosas importantes que volverá a lo largo de este semestre, pila y pila. Así que la mayoría de la memoria del equipo está reservado al ejecutar un programa para algo que se llama la pila y algo que se llama el montón. Y no vamos a hablar sobre el montón de hoy, pero lo haremos hablar de la pila. Y la pila está destinado a evocar la visual de como el comedor bandejas de comida en Mather House, o dondequiera que usted sea, donde el comedor personal limpiarlas todos los días. Les apilar arriba de la planta de arriba. Y del mismo modo en la memoria, hay esta idea de poner algo en un apilar, poner algo en una pila, poner algo en una pila. Y ¿qué es lo que queremos decir con esto? Bueno, vamos a hacer un zoom en apenas la mitad inferior de este cuadro, su ordenador RAM, proponer la siguiente. Resulta que cuando se ejecuta un programa como a.out o hola, cualquiera que sea del programa es que usted ha escrito, otra vez, esos ceros y unos se cargan desde el disco duro - que es almacenamiento a largo plazo, se queda allí, incluso cuando se tire de la clavija - cargado en la RAM. RAM es más rápido que los discos duros. Es más pequeño que los discos duros. Pero es que los programas en vivo mientras está en funcionamiento. Así se hace doble clic en un programa en un Mac o un PC - está cargado de disco duro a la RAM. Tan pronto como se carga en la memoria RAM, los ceros y unos ir en la parte superior forma, la así llamado segmento de texto. Pero tan pronto como el programa comienza a funcionar en realidad, el principal función se llama. Y principal, como hemos visto, a menudo tiene variables locales. Y tiene enteros y cadenas y caracteres y similares. Así que si tu programa que usted ha escrito o del programa que tiene doble clic utilizan algunas variables dentro de la principal, que terminan en la parte inferior de la pila de la memoria, por así decirlo. Ahora, más concretamente, ¿qué significa esto realmente? Esto sólo significa que si íbamos a contar las cosas - si íbamos a numerar los bytes de memoria RAM en su ordenador, observe que Este número puede ser cero bytes. Este podría ser el número de bytes de una, dos, tres, cuatro, cinco, seis, todos hasta llegar a gustar - 2 mil millones sería todo el camino hasta allí en lo alto. En otras palabras, cuando hablamos de RAM o memoria en términos de bytes, se sólo significa que alguien ha decidido que a contar cada uno de esos trozos de memoria. Así que cuando usted necesita 32 bits para un int, o si necesita 8 bits para un char, en su qué terminan en la memoria? Bueno, conceptualmente, que acaba de terminar en el fondo de este cosa que se llama la pila. Pero lo interesante ahora es cuando llama a una función principal. Supongamos que una función llamada foo, sólo un nombre arbitrario. Lo que sucede es principal está en la parte inferior de esta pila de memoria. Foo ahora se coloca en la parte superior de la memoria principal. Así que cualquier variable local que ha foo terminar especie de vista conceptual arriba los de principal. Si foo llama a otra función llamada bar, aquellas variables terminan aquí. Si la barra pide algo más, aquí, aquí, aquí. Así que lo que es interesante acerca de la ejecución de un programa es que al llamar a funciones, y como las funciones que llaman a funciones, y esas funciones llamar a funciones, construir el edificio esta pila de funciones en la memoria. Y sólo una vez devuelve una función no comienza a recibir esa memoria espalda. Así que una de las maneras más fáciles de ejecutar fuera de la memoria en un programa de ordenador es escribir funciones que nunca vuelven. Así, por ejemplo, vamos a demostrar como mucho con un programa intencionalmente buggy. Déjenme seguir adelante y hacer # include, int main (void). Y lo voy a hacer, mientras que (2> 1), que probablemente nunca cambiar en nosotros. Y déjame seguir adelante ahora y hacer printf. En realidad, eso va a ser menos interesante visualmente. Vamos a hacer esto. Para int (i = 0; i> 0). Hagamos de este error, i + +. Y no printf aquí. Vamos a practicar lo que predicaba. Vamos a echar un método aquí. Coro Vacío, y diremos int i. Y luego voy a decir, printf - oh, vamos a hacerlo más interesante. Que en realidad no imprime nada en absoluto. Vamos a hacer esto. Coro (i). Está bien. Así que esto tiene fallos porque ¿por qué? Estoy haciendo esto como voy porque el programa no hace nada de interés. Pero ese no es el objetivo. El objetivo es escribir un programa que tiene como principal función hace lo que, al parecer? Llame a sí mismo. Y en realidad, no necesitamos el bucle. Vamos a simplificar aún esto sólo para no perder de vista la realidad error fundamental. Principales llamadas coro para cantar algunos coros. Entonces hice algo estúpido, y yo tenía coro coro llamada porque supuse alguien más lo iba a poner en práctica tal vez. Y ahora esto no se va a compilar todavía. Tengo que hacer qué? Necesito el prototipo, recuerda. Así que tengo que tener aquí coro void (int i). Así que ahora, si me voy por aquí - en realidad, vamos a utilizar la ventana más grande. Vamos a seguir adelante y hacer coros. Vamos a seguir adelante y hacer coros. El uso de declarante no identificado i. Oh, eso fue estúpido. No necesitamos el argumento. Vamos a hacer esto. Nos hubiera gustado haber comenzado de esta manera. Hubiera sido un programa mucho más fácil de escribir. Así que hay. Ahora vamos a ir a mi ventana de terminal, vuelva a ejecutar Clang. Y aquí vamos. Eso fue muy rápido. Lo que en realidad acaba de ocurrir, sin embargo? Bueno, ahora voy a añadir la línea de impresión, por lo que podemos ver. Así que permítanme decir printf, vamos a decir, estoy aquí. Está bien, no hay variables, lo dejaremos así. Permítanme volver a ejecutar make. Permítanme volver a ejecutar el coro. Y vamos. Sigue adelante. Como acotación al margen, ¿por qué no lo ha derrumbado todavía? El fallo de segmentación pasó súper rápido antes. [Inaudible] DAVID J. MALAN: Exactamente. Así que se necesita tiempo para imprimir. Solo se necesita más trabajo por parte del equipo. Y ahí está. Segmentación culpa. Así notar cuán rápido ejecutar programas. Si no está imprimiendo algo, super rápido. Pero todavía tengo este error de segmentación porque lo que estaba pasando? Bueno, si usted piensa acerca de cómo la memoria del equipo se presenta, esta pasa a ser principal. Pero aquí - Vamos a llamar a este coro, y vamos a llamar a este coro. Y ahora si hago mi estética bien, esto es sólo va a decir coro, coro, coro, coro, coro, coro, coro, hasta la saciedad. Y, finalmente, ¿qué va a pasar? Si el panorama es literalmente esto, ¿qué le pasa conceptual? Los excesos de la pila la pila. O peor aún, que acaba de invadir todo, incluyendo el segmento de texto, que es los ceros y unos que representan su programa. En resumen, esto es sólo super, super mal. ¿Cierto? Su programa se ha disparado fuera de control. Usted está utilizando la memoria mucho más de lo que quería todo por un estúpido error, en este caso. O, en este caso, una función muy deliberadamente hecho en sí de llamada. Ahora bien, esto no es del todo malo. Las funciones que se llaman en realidad tiene un gran poder cuando se lo usa correctamente. Yo no lo he usado correctamente aquí. Así que esto no es del todo malo. Pero el hecho de que en realidad nunca deja de llamarme a mí mismo es un derecho fundamental aquí debilidad de este programa. Entonces, ¿dónde vamos con todo esto? Bueno, ¿qué está pasando realmente? Cuando llamo a la función de incremento, al igual que hacíamos en esos ejemplos, Tengo un valor como una que yo paso pulg Me pasa una copia del número uno. Así ocurre lo siguiente. Así que vamos a entrar en el ejemplo de incremento. Y este tipo por aquí. Así que aquí es lo que está sucediendo realmente. Cuando llamé al incremento, y paso en x, pictóricamente lo que es pasando aquí es esta - si tengo el valor de 1 almacenan aquí, y yo en realidad llamar incremento, que ahora se llama coro - sí, eso me está arrojando aquí. Así que vamos a llamar a este incremento. Y no sabemos lo que esta función siguiente va a ser. Entonces, ¿qué está sucediendo realmente está aquí en alguna parte principal, tengo un trozo de memoria que almacena el número 1. Cuando llamo incremento, estoy usando otro trozo de memoria, pero ahora tiene la copia de 1. Cuando incrementar ese valor, esto se convierte en 2 - horriblemente escrito en la pantalla aquí. Pero entonces, ¿qué ocurre tan pronto como regresa de incremento? Esta memoria sólo se entregó de nuevo al sistema operativo, lo que significa que todo que has hecho es nada útil. El que estaba contenida originalmente en el principal sigue siendo realmente allí. Entonces, ¿a dónde vamos con esto? Bueno, resulta que en la memoria que tiene esta de espaldas secuencia de bytes que se pueden poner las cosas pulg Y resulta que ya hemos visto algo que consiste en colocar cosas vuelvan a la espalda con espalda con espalda. ¿Qué es una cadena, sobre la base de una semana y dos semanas ahora? Así que es sólo una colección de personajes. Así resulta que, del mismo modo que usted puede poner números en la memoria, de manera similar que pueda poner los caracteres en la memoria. Y una vez que empezamos a poner en la memoria de personajes de espaldas hacia atrás para de nuevo, resulta que el uso de las cosas más simples como un bucle o un bucle while, podemos iterar - de izquierda a derecha sobre los caracteres de una cadena - y empezar a masajear en personajes completamente diferentes. A podría convertirse en B. B puede convertirse en C. Así que, en definitiva, podemos tomar una Frase Inglés que realmente tiene sentido y convertir cada uno de los cartas de una en una mediante un recorrido por la memoria de nuestro ordenador de izquierda a derecho a cifrar en realidad. Así que vamos a tener nuestros cinco minutos de descanso aquí, y cuando regresemos, vamos a iniciar este proceso de codificación de la información. Está bien. Así que antes de bucear en algunos de criptografía y estas cosas llamadas matrices, permítanme pausa para cualquier pregunta, porque me siento como si realmente algo confusa algunos de esos temas. Así que vamos a arreglar ahora si podemos. Así que sólo hablaba de los valores de retorno. Hablamos de argumentos. Y hablamos de este concepto, que vamos a volver en las próximas semanas venir, de ver la memoria como un montón de ellos apilados bandejas, por así decirlo. De abajo hacia arriba, de manera que cada bandeja que se ponen en la pila representa una función que está siendo llamado. ¿Alguna pregunta? Entonces, ¿qué - voy a tratar de hacer una pregunta. Sigo echando a perder, pero ahora Es. - usted todo visto la cara del muchacho. Así que vamos a volver a eso. Así que permítanme hacer una pregunta aquí. Permítanme simplificar esto a lo que era antes de que algunos de nuestra anterior Q & A. Y el hecho de que el incremento tiene paréntesis de apertura, número int, cerrado paréntesis. ¿Qué número representan int? [Inaudible] DAVID J. MALAN: un argumento. De acuerdo, pero ¿qué es un argumento? [Inaudible] DAVID J. MALAN: Lo siento, ¿qué es eso? Ponente 3: Algo pasa pulg DAVID J. MALAN: Muy bien. Así que algo que se pasa pulg Y más en general, es sólo la entrada. Si usted está escribiendo una función y el propósito de tal función en la vida es hacer algo un poco diferente cada vez que lo usa, entonces la única forma de que ocurra realmente parece ser que le facilite la entrada de modo que puede hacer algo diferente con la entrada cada vez. Así que hay que especificar dos cosas cuando una función tiene entradas. Es necesario especificar el nombre que desea dar a esa entrada, simplemente por su propia conveniencia, de modo que usted pueda referirse a ella en la función que usted está escribiendo, como lo hice aquí en la línea 32. Pero también hay que especificar su tipo, ya que C es un lenguaje de programación que sólo requiere que si quieres una variable, usted tiene que decirle a la computadora qué el tipo de datos que es, en gran parte, para que sepa cuántos bits a asignar a esa variable. Debido a que podría ser de seis - lo siento, no va a ser seis. Puede ser 16. Puede ser 8. Puede ser 32, incluso 64. Pero el equipo tiene que saber. Ahora el int en el lado izquierdo representa lo que, por el contrario? [Inaudible] DAVID J. MALAN: ¿Qué es eso? [Inaudible] DAVID J. MALAN: El tipo de la función y, más específicamente, la tipo de su producción. Derecha. Así, mientras que la cosa en paréntesis representa su entrada, en su caso, la cosa a la izquierda representa la salida. Y en este caso, el incremento aparentemente devuelve un int. Y así int es el tipo de retorno de esta función. ¿Qué significa regresar? Literalmente, se utiliza la palabra clave return. Y si lo que están regresando a la derecha de la palabra clave es una entero, que es consistente con lo que hemos prometido. No se podría hacer algo como esto - hola, mundo - porque eso es una cadena. Obviamente, no es un número entero. Así que en resumen, la carga está realmente en nosotros, el programador, para ser más específico a lo que estamos regresando y para entonces que seguir para devolverlo. Y después de hacer un poco más claro el contexto - ahí está otra vez. El contexto - gran sorpresa en un momento. El contexto aquí es que la memoria de su computadora es, de nuevo, un gigabytes, dos gigabytes, lo que sea. Tal vez es más. Tal vez sea menos. Pero el equipo que considera que tiene diferentes secciones. Algo pasa ahí abajo. Otra cosa que pasa por allí. Cosas diferentes va en el medio. Y hoy, apenas comenzar a contar esta historia. Pero volveremos a esto con el tiempo. Por ahora, la única memoria que realmente importa es el segmento de texto ya que sólo representa los ceros y unos Clang que se emiten. Así que cuando se ejecuta un comando en el teclado como a.out, o doble haga clic en un icono en Mac OS o Windows, el programa está cargado de su disco conducir a la RAM. Y se dejó caer en la cima de la memoria RAM del ordenador, por así decirlo. Ahora, mientras tanto, ya que su programa se pone en marcha y el principal se llama en la programa que escribió o escribe el programa de Microsoft o Apple, que ninguno de sus variables locales terminan ahí abajo en la parte inferior de la memoria de su computadora. Pero si llama a otra función principal que se tiene variables o argumentos, terminan encima de ella. Y si esa función llama a algo, terminan encima de ella, por encima de ella, por encima de ella. Y sólo una vez una función se hace ejecutando hace la pila de bandejas, de modo a hablar, empezar a bajar cada vez más. Y esto es lo que entonces, en pocas palabras, explica por qué, cuando se llama cube - o puede llamar al incremento - que está pasando en una copia del valor. Y lo que eso significa es que pictóricamente está literalmente escrito la número 1 en otra parte de la memoria, el cambio de que 1 a 2, en el caso de los incremento - o a un 8, en el caso de cubo - y luego tirar de memoria que desaparece tan pronto como el incremento o el cubo devuelve la función. Pregunta. [Inaudible] DAVID J. MALAN: ¿Dónde - Las variables globales se almacenan en lo que es Actualmente, llamó a los datos inicializados o datos sin inicializar. La diferencia es que si usted tiene una variable global, y se le asigna inmediatamente un valor con el signo igual, que termina en la parte superior hay. Y si lo que dicen int x punto y coma sin ningún valor, termina ligeramente inferior en RAM simplemente por convención. Otras cuestiones. Está bien. Así que esta imagen regresará a medida que más poderoso de lo que podemos hacer con el equipo. Pero por ahora, vamos a tener una breve introducción a la criptografía, un tipo específico de criptografía que no resuelve todos los problemas del mundo, pero no resolver algunos de ellos. En este caso aquí, tenemos algo que se llama la criptografía de clave secreta. Y criptografía de clave secreta, como su nombre indica, deriva su seguridad a partir de un secreto. Así, por ejemplo, si usted es nuevo en la escuela primaria y que estés pasando un cartita amor secreto para el chico o la chica que te están aplastando a - si usted Quería pasar que a través de la audiencia, probablemente no escribiría una nota en Inglés o lo que su lengua materna es, más bien, podría cifrar. O usted puede enviarles un mensaje de texto en estos días. Pero que en realidad podría pasar una nota a través de la sala de clase. Y para hacerlo de forma segura, de tal manera que sus amigos y el profesor no sabes lo que estás escribiendo, es posible llegar a una bastante simple algoritmo - joven, aunque es posible que - a sólo codificar las palabras. Así que en lugar de escribir una, podría escribir B. En lugar de B, puede escribir C. En lugar de C, puede escribir D, y así sucesivamente. O bien, podría llegar a una traducción más sofisticado de las letras para diferentes letras. Pero el problema es el chico o la chica a la que le está enviando esta nota tiene que saber algo. ¿Qué es lo que, obviamente? Al igual que, cuál es su secreto. Al igual que, ¿qué es eso mapeo entre A y B y Cs y Ds? ¿Es sólo la adición de uno, por así decirlo, a cada una de las letras para ir de A a B, B a C? ¿Es más complejo que eso? Así que tú y tu enamorado es necesario tener esta información secreta. Pero hay una especie de catch-22 aquí. Si esta es la primera vez que va a enviar esta carta de amor a través de la clase, ¿cómo es ese niño o niña va a saber cuál es el secreto incluso es? Así que la clave secreta de cifrado no resuelve todos los problemas del mundo. Y de hecho hay una relación que vamos a volver a hacia semestre final. Del mismo modo, no tienen ninguno de nosotros probablemente jamás enviada a - del mismo modo, no la mayoría de nosotros conoce a alguien que trabaja, por ejemplo, en Amazon.com. Y, sin embargo, muchos de nosotros hemos comprado cosas en Amazon.com. Y hemos sido enseñados a asumir que estos e-commerce transacciones son seguras. ¿Cierto? La dirección URL https probablemente dice. Hay tal vez un icono de candado poco tonto en alguna parte. Hay una especie de criptografía de la seguridad de su información de tarjeta de crédito entre usted y Amazon.com. Y, sin embargo, si la criptografía implica conocer algún secreto, y sin embargo no lo hacen conozco a nadie en Amazon, y he arreglado ciertamente no cualquier tipo de secreto con alguien en el Amazonas, ¿cómo es mi ordenador o mi navegador haciendo esto? Bueno, resulta que hay otros tipos de criptografía en total que resuelven ese problema. Pero por hoy, nos centraremos en el sencillo, donde se pueden organizar en avanzar a conocer algún secreto, como un plus o alguna correlación entre A y B. Y el proceso de criptografía generalmente implica esto. Usted tiene un poco de texto sin formato, representado aquí a la izquierda. Puede ejecutarlo a través de algún tipo de algoritmo o procedimiento para cifrarlo. Tal vez eso es sólo A se convierte en B, B se convierte en C y luego se termina con texto cifrado. Mientras tanto, una vez que su enamorado recibe la nota secreta, él o ella tiene que entonces descifrar por lo general que el algoritmo de inversión a fin de conseguir copia el texto sin formato. Ahora hay encarnaciones físicas de este. Por ejemplo, este es un pequeño anillo decodificador secreto. Y este es un anillo en el sentido de que hay dos diales aquí. En la periferia exterior de esta cosa, no hay letras de la A a la Z, aunque están en orden aleatorio. Y en el interior, de hecho hay algunos números, de manera que con este anillo, se puede convertir tipo de fuera pero no por dentro con el fin de alinear números con letras. Y en el clip que está a punto de ver - algunos de los cuales usted pudo haber visto 24/7 durante la temporada de Navidad de una película que se llama Un cuento de Navidad. Verás que poco Ralphie estaba tan ansioso por descubrir qué huerfanito Annie mensaje secreto era lo que había sido comunicada, creo, en la forma de mensajes numéricos en una serie de la caja. Y había que acumular todas las pequeñas tarjetas que vienen en la caja de cereales. Había que enviar por correo pulg Había que recuperar el anillo decodificador secreto, de modo que usted puede finalmente entender lo que la cartografía es entre letras y números, o letras y letras. Así que te doy este clip corto de una historia de Navidad para motivar conjunto de procesadores 2 y nuestra discusión, en un momento, de las matrices. Así que aquí tenemos Ralphie. [REPRODUCCIÓN DE VÍDEO] -Sea notorio a todos que Ralph Parker se nombra miembro de la Little Orphan Annie Secret Circle y tiene derecho a todo los honores y beneficios que ocurren al mismo. -Firmado, Little Orphan Annie. Refrendado, Pierre Andre! En tinta! Honores y beneficios, ya a la edad de nueve. Vamos, vamos a seguir adelante con ella. Yo no necesito todo ese jazz sobre contrabandistas y piratas. -Escuche mañana por la noche para la aventura final de El Negro Pirate Ship. Ahora es el momento para el mensaje secreto de Annie como ustedes, miembros del Círculo Secreto. Recuerde, los niños, sólo los miembros del Círculo Secreto de Annie puede decodificar Mensaje secreto de Annie. Recuerde, Annie depende de ti. Establezca sus alfileres para B2. Aquí está el mensaje. 12, 11 - -Estoy en mi primera reunión secreta. -14, 11, 18, 16 - -Pierre estaba en esta noche gran voz. Me di cuenta de que el mensaje de esta noche fue muy importante. -3, 25. Ese es un mensaje de Annie ella. Recuerde, no se lo digas a nadie. -90 Segundos más tarde, estoy en la única habitación de la casa donde un niño de nueve años podía sentarse en la intimidad y decodificación. Aha, B. Fui a la siguiente. E. La primera palabra es ser. S. Venía más fácil ahora. U. -Oh, vamos, Ralphie. Me tengo que ir. -Voy a estar justo abajo, ma. -Gee whiz. -T, O. Asegúrese de. Asegúrese de que? ¿Cuál era Little Orphan Annie tratando de decir? Asegúrese de que? -Ralphie! Randy tiene que ir. Haga el favor de salir? -Está bien, mamá. Voy a estar fuera. -Yo estaba cada vez más cerca ahora. La tensión era terrible. ¿Qué fue? El destino del planeta puede colgar de un hilo. -Ralphie! Randy tiene que ir. -Voy a tener razón a cabo, por el amor de Dios. -Vaya, casi llegamos. Mis dedos volaban. Mi mente era una trampa de acero. Cada poro vibró. Era casi transparente. Sí, sí, sí, sí. -Asegúrese de tomar su Ovaltine. Ovaltine? Un comercial de mala muerte? Hijo de puta. [FIN DE REPRODUCCIÓN DE VÍDEO] DAVID J. MALAN: Así que ahí tenemos la criptografía. Entonces, ¿cómo en un ordenador podemos ir sobre la aplicación o que representa este tipo de cosas? Bueno, necesitamos una manera de expresarnos un poco más flexible que nuestras variables hasta el momento han permitido. Hemos tenido enteros. Hemos tenido caracteres. Hemos tenido flotadores y dobles y algunos otros. Pero esas son las piezas individuales de la memoria que realmente no nos permiten expresar cosas como las palabras y oraciones y frases. De hecho, hemos llamado cuerdas esas cosas. Pero prometió que esto es sólo una simplificación en el CS50 biblioteca que estamos intentando pelar. Así que vamos a empezar a hacer eso aquí. Déjenme seguir adelante y abrir un archivo - todos estos archivos están disponibles en línea como de costumbre - array.c llamado para resolver un problema relacionado con cadenas pero que pinta una imagen aquí de cómo podríamos utilizar algo llamado una matriz. Una matriz es un tipo de datos. Es un tipo de variable, de clases, que tiene varios tipos de datos más pequeñas dentro de ella de espaldas a la espalda con espalda. Así, por ejemplo, si queremos escribir un pequeño programa que le da su concurso medio de un curso como 50 que tiene dos exámenes, usted podría muy fácilmente escribir este programa - basado incluso en algunos de los materiales de la semana pasada - mediante el uso de getInt y un par de variables. Int quiz1, int quiz2, y es bastante sencillo. Es tal vez 10, 20 líneas de código, max, para implementar un programa que pida la usuario para dos anotaciones prueba y luego calcula su promedio agregándolos juntos, dividiendo por dos, y luego imprimir los resultados. Probablemente podríamos hacer eso muy fácilmente ahora, después de un cierto número de minutos. Pero el problema es que supongo que el 50 tenía tres o cuatro pruebas. Supongamos que usted quisiera utilizar el mismo programa para una clase que tenía pruebas semanales. Piense en una clase que ha exámenes semanales. Si hay como 16 o menos semanas en un semestre, ahora tiene 16 variables - quiz1 int, int quiz2, int quiz3, int quiz4. Tan pronto como usted comienza a ver esta redundancia, esta copiando y pegando de código, debe comenzar a hacer que te gustaría que hubiera una manera mejor. Y gracias a Dios, a causa de las matrices, lo hay. Así que vamos a hacer esto. En primer lugar, permítanme presentarles a una cosa muy simple que no hemos usado hasta ahora, pero lo vas a ver de vez en cuando en el código. Esto es lo que generalmente se llama una constante. Así que es una constante en el sentido de que este valor nunca cambia. La convención humana al crear una constante es utilizar todo el capital cartas, sólo para que realmente se destaca en el código. Y la palabra clave especial que se utiliza en C # define. Así que si usted dice # define, luego un espacio, entonces la palabra que desea utilizar para la constante de nombre, y luego el valor de la constante. Así que nota, esto es diferente de asigna algo a una variable. No hay ningún signo igual. No hay punto y coma. Esto es lo que se conoce generalmente como una directiva de preprocesador, pero más en que otra vez. Por ahora, esto crea un valor inmutable llamado TESTS cuya efectiva valor numérico es 2. Así que donde quiera que vea pruebas, exámenes, pruebas cortas a lo largo de este archivo, que es sólo el número 2. Ahora, si miro principal ahora, vamos a ver cómo funciona esto. Al principio, parece un poco críptico. Pero todo es cosa de una semana. Pida al usuario para los grados. ¿Cómo podemos hacer esto? Pues bien, en la línea 22 - esta es realmente la parte jugosa - Yo declaro un flotador, pero no es sólo un solo flotador. Estoy declarando, más bien, un conjunto de valores de punto flotante. Esa variable se va a llamar grados, como se implica aquí. Pero la única nueva sintaxis entonces son estos corchetes, el hecho de que he dicho grados flotador y luego abrir el paréntesis y luego un número. Aviso, si esto es una constante, esto es como lo hicimos. Esto significa ordenador hey, dame dos flotadores, y vamos a llamar colectivamente los grados. Esto está en contraste con un proceso mucho más tedioso como este. Grado 1 flotar, flotar grade2, y así sucesivamente. Así que una matriz que nos permite poner en práctica esta idea, pero mucho menos desordenadamente, en de forma que podemos escribir una línea de código en lugar de, por ejemplo, 16 para una 16 semana del semestre. Así que yo no quería que codificar 2 porque si piensas en este momento lógicamente - Supongo que el año que viene CS50 cambios a 3 cuestionarios en su lugar. Y yo tenía el número 2 aquí. Yo tenía el número 2 aquí. Yo tenía el número 2 aquí. Yo tenía el número 2 aquí. Se vuelve muy tedioso y muy fácil meter la pata y cambiar accidentalmente un valor a 3 y se pierda algún otro valor de 2. Así que voy a este lugar abstracto de distancia y utilizar esta constante que, como su nombre indica, nunca cambia. Y ahora, no importa si tenemos diferentes concursos de este año o el siguiente, sólo hay que cambiar en un solo lugar, aquí arriba en la parte superior. Así que eso es todo lo constante es. Mientras tanto, la característica nueva es que conceptual de una matriz. Así que los corchetes darme esta flota y me deja muchas colectivamente los llaman los grados aquí. Así que ahora vamos a ver lo que voy a hacer. Aquí, en la línea 24 es el inicio de un bucle. Esto es realmente nada especial. Es sólo mediante pruebas en lugar de un número codificado. Pero no hay nada intelectualmente diferente allí la semana pasada. Esto es sólo printf. Así printf ("número cuestionario% d de% d") porque sólo quiero imprimir dame concurso número uno de los dos y luego dos de dos. Así que esto es puramente una cosa estética. Pero la parte más interesante ahora está en la línea 27. A fin de llenar en uno de los dos marcadores de posición con un punto flotante valor, de nuevo utilizar corchetes. En este caso, estoy usando i porque este bucle for se ha iniciado con i igual a ¿Qué valor, al parecer? 0. Así que en la primera iteración de este bucle, es como si escribió esto en el código. Pero en la segunda iteración de este bucle, es como si escribió esto en mi código. Pero el hecho de que yo estoy usando una variable es perfecto porque, como su nombre sugiere, está variando su valor en cada iteración. Así que me estoy llenando este conjunto un lugar a la vez. ¿Qué hace este arreglo parece? Bueno, la razón por la que llegó a esta super simple rectángulo en la pantalla aquí antes era por esta razón. Una matriz es simplemente un trozo de memoria seguido de otro pedazo de la memoria, seguido por otro bloque de memoria, y así sucesivamente. Así que si mi matriz es de tamaño 2, en este caso aquí, lo único que estaría haciendo por escribiendo en las puntuaciones de mis preguntas y respuestas, como aquí. Tengo 100 en este caso. Y entonces me puse un 99 en este caso. Entonces, esta memoria no podría incluso ser utilizado porque sólo he pedido al equipo para una matriz de tamaño 2. Las plazas están todavía allí. ¿Cierto? Aún dispone de dos gigabytes de RAM, incluso si sólo pedir dos flotadores. Así que la idea detrás de las matrices es que la computadora sólo toma un trozo de memoria y luego reparte trozos más pequeños de espaldas a la espalda con espalda. Y eso es todo un arreglo es. Es un pedazo continuo de memoria, dentro de los cuales usted puede poner las cosas. Ahora bien, esto sucede a continuación, sólo hacer un poco de aritmética aburrido. Si me desplazo hasta aquí, aquí es donde me iterar sobre la matriz. Vengo con la suma de todos los valores de la matriz. Y luego usar la función round aquí para hacer realidad el suma dividida por concursos. Pero permítanme saludar a mi mano que como una especie de aritmética suficiente por ahora. Pero todo lo que está haciendo por mí en última instancia está calculando un promedio. Así que prueba primero más segundo cuestionario, dividido por 2 y luego imprimir hacia fuera como un int. Pero ahora vamos a la transición a un ejemplo diferente llamado cadena1, que pinta un cuadro similar pero utilizando cuerdas. Déjenme seguir adelante y simplificar esto por un momento. Y perdona la sangría por ahora. Observe en la línea 19 de este ejemplo, tengo una cadena del usuario. Pero note lo que estoy haciendo en la siguiente líneas 22 en adelante. En realidad estoy iterar desde i hasta - y este es un nuevo truco - strlen, cadena de longitud. Esta es una función que viene con C que si se le pasa una cadena, que cuenta que el número de caracteres que hay en esa cadena. Eso es todo. El hecho de que sea en lugar de strlen longitud de la cadena es sólo porque es más sucinta. Hace 30 años, la gente le gusta escribir cosas lo más sucintamente posible. Para ello hemos mantenido esa convención aquí. i + + sólo significa incrementar i en cada iteración. Y ahora noten esto, que es muy interesante. Así, en la línea 24, digo ordenador, déme un personaje, ocho bits, y lo llaman c. Pero ¿qué es esta en el lado derecho diciendo? En Inglés, ¿qué representa? [Inaudible] DAVID J. MALAN: Exactamente. Dame el primer carácter de la matriz. O más en general, me dan el carácter i-ésimo de la matriz. Y darse cuenta de que es importante ahora que como los informáticos, en realidad estamos contando desde 0. Usted no tiene discreción para empezar a hacerlo. Ahora usted tiene que comportarse de acuerdo con las expectativas del equipo y contar a partir de cero, porque [0] va a ser el primero carácter en una cadena. [1] va a ser la segunda. [2] va a ser el tercero, y así sucesivamente. Así que este programa, si lo compile - esto es, de nuevo, cadena1. Así que cadena1. Y ahora me encuentro cadena1 en mi ventana de terminal. Se espera para la entrada, así que voy a escribir, por ejemplo, David. Intro. Y ahora se imprime DAVID todo en líneas diferentes, porque darse cuenta de lo que estoy haciendo. Estoy imprimiendo un carácter a la vez. Ahora no vamos a entrar en detalles hoy sobre este tema. Pero he eliminado hace un momento este cheque aquí. Resulta que si el usuario se está portando mal, contradictorio, o simplemente confuso, en realidad se puede dejar de dar una serie de cierta extensión. Si se pulsa la tecla equivocada en el teclado, puede dar ninguna cadena en absoluto. O si usted es malicioso, puede intentar para pegar en el patrimonio de un gigabyte de un ensayo para llenar esta cadena. Y si el equipo se queda sin memoria, resulta que vamos para volver este valor especial llamado null. Así que por ahora, sólo sé que hay este valor especial llamado nula de que nos permitirá comprobar cuando estamos fuera de la memoria, entre otras cosas. Pero si abro ahora cadena2, note una diferencia aquí. Tenga en cuenta una diferencia aquí con cadena2. Con cadena2, este bucle for es un poco diferente. Déjame borrar los nulos para que podamos hablar de aquellos en otro momento. Pero, ¿qué hay de diferente en el bucle for esta vez? Y puedo volver al ejemplo anterior. Así que esa es la versión dos. Esta es la versión uno. Uno, dos, uno dos. Así que la llamada strlen es ¿dónde? Está en la primera parte del bucle for. ¿Alguna idea de por qué estoy haciendo esto? Si. [Inaudible] DAVID J. MALAN: Así que no llame a la función cada vez. Exactamente. Recuerde que en los bucles for que son súper sencillo una vez que una especie de entender que esta es la inicialización, la condición, y la actualización. El problema es que la condición ocurre en cada iteración del bucle. Y así, en este ejemplo aquí, ¿qué tiene de malo el hecho de que esta es mi condición? Estás llamando strlen una y otra vez y otra vez. Pero una vez que has escrito en David, la longitud de la cadena es de cinco. Y no va a cambiar en cada iteración del bucle porque el cadena es aún D-A-V-I-D. Así que esta es una pista de lo que va a convertirse en un idea cada vez más importante que se conoce como una decisión de diseño, donde - simplemente no hacer que el ordenador haga el trabajo innecesario. Pero así como una vista previa de pset 2, conjunto de procesadores 2 en la edición estándar es te va a desafiar a aplicar en la práctica un cierto número de cifras, algunos número de algoritmos de cifrado, para que pueda cifrar y descifrar mensajes secretos, muy parecido al Ralphie hay un decodificado. En la edición pirata de pset 2, vamos a ir un poco más lejos. Nos vamos a entregar un archivo de un sistema informático actual que contiene un gran cantidad de nombres de usuario y contraseñas cifradas reales, y el desafío para la edición pirata va a ser de descifrar las contraseñas y la figura lo criptografía o qué secreto se utilizó para realmente generar las contraseñas. Y vamos a hacer esto utilizando una nueva característica de C que voy a dar sólo una demo de, conocido como argumentos de línea de comandos. Así resulta que, como algunos de ustedes pueden haber visto en la sección o en libros de texto, principal no tiene que siempre ser nulo entre paréntesis. Resulta que la principal también se puede escribir así, con dos argumentos, argc y argv, donde argc es el número de palabras que se escribe después el nombre del programa en la línea de comandos. Y argv son las palabras reales. Y como los corchetes indican allí, argv es aparentemente una matriz. Va a ser una cadena después de una serie después de una cadena en la memoria. Entonces, ¿qué vamos a ser capaces de hacer, empezando por pset 2, se algo como esto. Si hago argv1, que es un ejemplo vamos a volver a el lunes, y ejecutar ella, notar que no parece hacer nada. Simplemente imprime su propio nombre. Pero si digo adiós clase, observe que este programa aparentemente se repite sobre cada una de las palabras que se escriben en el indicador. Y los medios por los que puedan acceder a las palabras que el usuario tiene escribe en el prompt es cambiando principal, a partir de este fin de semana, a partir de int main (void) para int main (argc, argv). Y así nacerá argumentos de línea de comandos. Y una vez que estés muy sofisticado en esto, usted será capaz de escribir programas realmente alucinantes, como este de aquí, que va por encima y más allá algunas de las funciones que hemos hecho hasta ahora, pero todo muy potente. Así que vamos a salir de esto con esto en la pantalla. Y nos vemos el lunes.