ALTAVOZ 1: Muy bien. Bienvenido de nuevo. Esta es la segunda semana de CS50, y tenemos hasta ahora estado utilizando funciones, pero gran parte de ellos se da por sentado. Hemos utilizado printf que tiene la efecto secundario de impresión cosas en la pantalla. Hemos utilizado get-int, float llegar. Pero lo que si usted realmente desea crear sus propias funciones, como algunos de Puede que ya haya empezado a hacer por problemas n Uno, aunque no se requiere estrictamente? Bueno, vamos a seguir adelante y volver a ese problema de simplemente preguntar al usuario su nombre y la impresión de algo en el pantalla, pero intenta factorizar algunos de los elementos comunes que hemos visto en nuestro código hasta el momento. Así que con esto quiero decir lo siguiente. Voy a seguir adelante y crear un nuevo programa, llame al teléfono que hola.c como de costumbre. Voy a seguir adelante y dar a mí mismo incluir io.h estándar en la parte superior. Voy a darme también preventivamente la biblioteca CS50 de manera que Que no me grite por el compilador. Y ahora me voy a ir por delante y declarar int, principal, nula. Y luego aquí, aquí es donde quiero para comenzar a externalizar funciones a alguna otra función que yo mismo soy voy a escribir, pero eso no lo hace Actualmente existe. Por ejemplo, supongamos que quería escribir una función que me permite imprimir hola, coma y entonces el nombre de algún usuario. En lugar de seguir haciendo printf hola,% s, ¿no sería agradable si había sólo una función llamada No printf pero el nombre de impresión? En otras palabras, quiero ser capaz de escribir un programa que hace un poco de algo como esto. En primer lugar, voy a decir printf su nombrar, provocando de ese modo que el usuario darme su nombre, y luego me voy va a utilizar la cadena familiarizado s para declarar una cadena. Dame una variable de tipo cadena, llamarlo s, y almacenar en la que el resultado de la llamada cadena de get. Pero ahora en semana pasado, tendría que un tanto tediosa hecho hola,% s / n. Y en otras palabras, que hemos visto esta ejemplo, un montón de veces, y es un ejemplo trivial, ya que sólo hay una línea de código así que no es realmente un gran cosa para seguir escribiendo de nuevo. Pero supongamos que esta línea de código en realidad se estaban convirtiendo en una carga, y que no es una línea de código, pero es 10 líneas de código de un par de semanas a partir de ahora, y estás cansando de copiar y pegar o volver a escribir el mismo código. ¿No sería agradable en lugar de hacer printf hola,% s, y así sucesivamente, ¿no sería agradable si había sólo una función llamada nombre de impresión que toma un argumento - en otras palabras, se toma la entrada - y luego por punto y coma. Para que la función, ¿no bueno si que existía? Entonces yo no tendría que preocuparse por printf lo es, ¿qué% s y todos estas complejidades que son no tan interesante. Son útiles. Así que escriba su nombre, por desgracia, no era inventado hace unos años 40 plus. No se le ocurrió escribirlo. Pero esa es la belleza de tener un lenguaje de programación, al igual que en Rascas puede definir bloques personalizados, por lo en C y la mayoría de cualquier idioma, puede usted definir su propia funcionalidad, puede a definir sus propias funciones. Así que, aunque lleguemos principal por automáticamente de forma gratuita, se puede declarar nuestras propias funciones. Así que me voy a hacer un poco de espacio aquí encima de la tapa, y yo voy a declarar mi propia función que va a buscar un poco extraño al principio, pero vamos a venir Volveremos a este en poco tiempo. Voy a decir nula, con lo que indicando esta función hace algo, tiene un efecto secundario, pero no devuelve algo a mí en el misma manera que recibe int o recibe propia cadena hace. Y yo voy a dar a esta función un Nombre de la letra de imprenta, y yo voy a especifica que este tipo va a tener una cadena, y yo voy a llamar a ese nombre de la cadena. Yo podría llamarlo lo que quiera, pero yo quiero que mi código sea auto-documentado. En otras palabras, si uno de ustedes fuera a abrir este archivo y leerlo, usted podría tipo de deducir del nombre de esa de entrada cuál es el papel que se supone que jugar. Y ahora debajo de eso, voy a abrir llave de cierre y llave de cierre, y así doy cuenta que he seguido la misma patrón de líneas de cuatro a siete años como He estado siguiendo por una buena semana más Ahora, digamos, entre las nueve y las líneas 14 que componen principal. En otras palabras, en letra de imprenta es otra función. Ahora, el compilador no va a saber llamar a esto de forma automática porque, literalmente, sólo inventé, pero se sabe todavía que llamar principal de forma automática y, a continuación, por supuesto, en línea 13, estoy llamando a mi propia función. Y porque yo he declarado que la función arriba en la línea cuatro antes de principal, esto va a enseñar el compilador lo que dijeron ellos, "el nombre de impresión" significa y lo que debe hacer. Así que yo soy una especie de lo que supone una nueva costumbre bloquear en el contexto de, por ejemplo, a los arañazos. Así que aquí, puedo poner eso muy común o patrón recurrente de código sigo escribir en clase, printf % S hola,% s / n ", - ¿qué es lo que quiero poner aquí? S? Así que quiero poner el nombre en este contexto. Así cuenta un poco de una dicotomía aquí. Porque yo estoy declarando mi propia función y algo que he llamado arbitrariamente se imprime el nombre, y porque he especificado en paréntesis que este función toma un argumento, el tipo de que es una cadena - por lo que es una palabra o una frase o algo así - y Voy a llamar a ese nombre de la argumentación, que significa que la única variable que está en ámbito de aplicación, por así decirlo, es el nombre. S sólo existe entre lo dos llaves, por supuesto? Bueno en realidad, al igual que la línea 10 a través de 14, por lo que al igual que el lunes no se puede utilizar S, pero lo que puedo hacer es pasar S en letra de imprenta. Escriba el nombre que pasa es que darle un alias, un sinónimo, un apodo, calificándola de nombrar, y ahora usarlo en esta línea. Así que ahora vamos a salvar esto, alejar el zoom. Déjenme seguir adelante y hacer hola. Se ve bien. No escupa cualquier error. . / Hola Intro. ¿Cuál es mi nombre? David. Y hola David. Así que no es tan emocionante, pero sólo pensar ahora. Ahora tiene el mismo ingrediente como lo hicimos en Scratch para tomar nuestras propias funciones. Pero hay un poco de una de gotcha. Supongamos que yo no había pensado realmente esto a través de y en realidad sin pensar realmente en ello escribió esa función aquí. Se siente perfectamente razonable. En arañazos no existe la noción de la ubicación de los scripts. Usted podría poner uno aquí, uno aquí, uno aquí, y podría empezar a a parecer un poco desordenado si no lo hace sentar a cabo ordenadamente, pero no es así importa donde físicamente los scripts estaban en la pantalla. Desafortunadamente en C - y esto es a diferencia lenguajes como Java y Python y otros que usted puede estar familiarizado con - por desgracia, en C, orden sí importa porque ver lo que hay va a pasar ahora. La función predeterminada que está pasando a ejecutar es, por supuesto, principal. Principal va a llamar el nombre de impresión en línea de ocho, pero por desgracia, el compilador ni siquiera sabrá que escriba su nombre existe hasta que llega a la línea 11, que, desgraciadamente, es va a ser demasiado tarde. Así que vamos a hacer y hacen hola. Y ahora maldito, dos errores generados. Así que ahora déjame desplazo hasta el mismo primero, como siempre debemos hacer, y cuenta de que está gritando a mí, "Declaración implícita de la función imprimir el nombre ". Así que hemos visto este mensaje antes, declaración implícita de la función. ¿Cuándo hemos visto ese tipo de error? Cuando no incluí una biblioteca. Si olvido cs50.h y me gustaría tener gritado por cadena GET o conseguir int. Pero en este caso, esta función de impresión nombre no está en una biblioteca, ¿verdad? Es, literalmente, en este archivo, por lo que lo que es realmente el problema? Bueno, lamentablemente, en C, que le lleva tan increíblemente literalmente que si quieren una función llamada nombre de impresión para existir, ya sea que usted tiene que poner en práctica esa función en la parte superior de su código para que sea más accesible para bajar funciones, pero, francamente, que se convierte en descuidado muy rápidamente. Personalmente, me gusta poner principales primero porque entonces es muy claro lo que esto programa hace a primera vista. Y además, usted puede conseguir en la esquina raro los casos en que si X quiere llamar y, pero y podría llamar x, sólo físicamente no puede realmente poner un por encima de la otra. Pero resulta que en C, podemos resolver este muy simplemente. Voy a poner un poco de espacio hasta aquí, y yo sólo voy a preventivamente, aunque algo redundante, va a enseñar la compilador que existe una función llamada en letra de imprenta, que toma una cadena, y yo voy a llamar que nombrar y coma. Así que esta ahora en la línea de cuatro, lo que nos no han visto antes, es una declaración de un nombre de la función de impresión, pero es sólo la promesa de que esta función se eventualmente ser definido, eventualmente implementar. Esto ahora puedo salir sola porque ahora se trata de la definición, la aplicación, tipo de la última milla de la aplicación del presente función particular. Así que, francamente, es estúpido, es molesto, pero este es el camino C es, y es porque te lleva muy literalmente y, como un ordenador francamente debería, sólo hace exactamente lo que le dices que hacer, y de manera que el pedido es importante. Así que tenlo en cuenta y otra vez, comenzar a notar la repetición de patrones. Lo más probable es que usted quiere, si no lo ha ya, empezar a encontrar mensajes como ésta, que a primera vista parecen completamente críptica, pero si usted comienza estén pendientes de las palabras clave, como "Declaración implícita", la mención de un función en este caso - y francamente, a veces incluso conseguir un poco verde símbolo de la zanahoria que le dice dónde el problema probablemente es - usted puede comenzar a trabajar su camino a través de mensajes de error pero no se ve. ¿Tiene preguntas sobre la escritura de su propia función de esta manera? Vamos a hacer algo que es un poco más convincente. En lugar de simplemente hacer algo que tiene un efecto secundario de la impresión, me dejó ir adelante y guardar un nuevo archivo, y vamos a llamar a este positive.c, aunque es va a ser un poco diferente frente a la última vez. Y esta vez, quiero volver a implementar ejemplo positive.C de última hora, que es obligar al usuario a dar me entero positivo. Pero tuve que usar get int última vez. ¿No hubiera sido agradable si había una función llamada recibe int positivo que pudiera subcontratar este parte de la funcionalidad a? Así que la diferencia aquí es que vamos a implementar conseguir int positivo, pero a diferencia de escriba su nombre, que tenía un efecto secundario - es no arrojó algo a mí como un número o una cadena - conseguir int positivo es, por supuesto, va a volver, con suerte, un int positivo. Así que vamos a hacer esto. Incluya cs50.h, Incluir io.h. estándar Void main int. Y ahora aquí, voy a seguir adelante y digamos que int, llamémosle n, es igual a conseguir int positivo. Y al igual que ya existe get int porque el personal lo escribió, me voy a asumir en el momento en que recibe int positivo existe, y ahora me voy seguir adelante y decir printf, gracias por el% i / n ", n. Así que ahora si puedo compilar este programa, lo que que va a pasar en mi terminal ventana en la parte inferior de la pantalla? Yo voy a conseguir, probablemente, que mismo error como antes. Así que vamos a probar esto. Hacer positivo. Y otra vez, la declaración implícita de la función, obtener int positivo. Así que podemos solucionar esto de un par de maneras. Voy a mantenerlo simple y justo poner mi declaración aquí y obtener int positivo. Necesito la firma llamada. La firma sólo se refiere a la estética de la primera línea del programa. Entonces, ¿qué debe recibir positivo int devolver? Así que un int. Me refiero a lo ideal, sería volver algo así como int positivo, pero que no existe. No hemos visto que entre nuestros datos tipos, por lo que tienen que hacer frente a la hecho de que tenemos muy pocos tipos de datos para trabajar. Pero podemos devolver un int y justo confiar en que va a ser positivo. Va a ser llamado conseguir int positivo. Y ahora ¿qué hay de sus argumentos? ¿Toma alguna entrada? ¿Se necesita alguna entrada? Por lo tanto, no necesita saber en nada antelación. Obtenga cadena no lo hace, recibe int no. Printf hace - tiene que tener algún entrada pasada en él - y el nombre de impresión necesaria alguna entrada, pero llegar int positivo no lo hace. Así que voy a explícitamente decirle al vacío compilador. Vacío es la ausencia de cualquier otra cosa. Así medios void nada va dentro de los paréntesis, punto y coma. Y ahora en el fondo de mi expediente - y de nuevo, sólo estoy siendo clase de anal aquí poniendo principal en la parte superior, que Es una buena práctica porque de esta manera, en cualquier momento que usted o alguien más abre el archivo, el funcionalidad está ahí. Se puede bucear desde cero. Así que ahora voy a duplicar el, conseguir int agujero positivo, pero no estoy va a golpear un punto y coma ahora. Voy a abrir las llaves, y ahora necesito que me prestes algunas ideas de lunes. Así como usted recuerda, hicimos algo como hacer lo siguiente mientras algo era cierto. Y lo que hice? Yo hice algo así como dar me un entero positivo, poco de un mensaje. Podría usar cualquier palabra que quiero. Y entonces yo solía qué? Int. n es igual a get int, no hay argumentos para ello. Y note la diferencia. Cuando se llama a una función, cuando se utiliza una función, no lo pongas en vacío. Usted sólo hace eso cuando se declara una función, la enseñanza de que el compilador lo cabe esperar. Así que usted no necesita para poner anular allí mismo. Y ahora lo que era mi condición? Bueno, n no es igual a positivo, pero eso es sólo pseudo-código. Entonces, ¿cómo puedo expresar esto más limpia? Por lo tanto menor o igual a cero. Así que de nuevo, note que usted puede hacer menos de o igual a. A pesar de ser dos separados símbolos, puede hacerlo en su teclado como tal. Pero todavía hay un error que Cometí un error última vez también. Tengo que declarar - exactamente. Debo declarar n fuera del bucle. Así que tengo que poner n hasta aquí, y yo no lo hago que desee volver a declararlo aquí no sea que llegue una nueva variable. Sólo quiero asignar un valor aquí. Y ahora no estoy bastante hecho aquí. Vamos a ver delante de mí mismo y fingir que estoy hecho. Hacer positivo, y ahora hay un nuevo error. El control llega a final de no nula función. Tan nuevo mensaje de error, pero si que tipo de desmenuzar cada una de las palabras, probablemente alude a lo que está mal. De control. Control de medios justos a la orden de las operaciones en un programa. El equipo está en control y algo salió mal. Por lo tanto, llega al final de una función no nula. ¿Qué función es, al parecer, refiriendo? ¿Qué función es no vacío? Así que int positivo, y un poco de confuso en ese pozo, es una especie de vacío. Cuenta con una especificación de vacío para su argumentos, pero su salida se va a ser de tipo n. Así que la palabra de la izquierda es el llamado tipo de retorno. La palabra en el interior aquí es las cero o más argumentos que una función de toma. Entonces, ¿qué tengo que hacer? En este punto de mi código, la línea 21, donde el símbolo parpadeante es que tener un int positivo dentro de la variable llamada n. ¿Cómo le doy vuelta a principal? Literalmente. Vuelva n punto y coma. Así como Colton devolvió un pedazo de papel con una respuesta a mí dejando caer ese pedazo de papel en el pequeño negro caja sobre la mesa, para hacer que en código, literalmente, acaba de escribir, el retorno n, y es como si fuera Colton dándome algo físico atrás. En este caso, lo que está sucediendo es conseguir int positivo va a devolver lo que es presumiblemente un positivo entero a quién? ¿Dónde termina ese valor pasa? Eso termina en esta variable, n, y a continuación, se procede con la línea de nueve. Así que en otras palabras, con el fin de operaciones, este programa se inicia la ejecución y el compilador se da cuenta, oh, desea que la biblioteca? Déjame ir a agarrar lo que sea que dentro de ese. Oh, usted quiere la biblioteca estándar IO? Déjame ir a agarrar lo que sea que dentro de ese. ¿Qué hace el compilador dice a sí mismo cuando llega a la línea de cuatro? Oh, usted se comprometió a poner en práctica el función llamada recibe positivo, pero nos pondremos en contacto para que más tarde, algo por el estilo. Void main Int. sólo significa aquí está las entrañas de mi programa. Línea siete es sólo una llave. Línea ocho está diciendo a la izquierda, dan me 32 bits para un entero, lo llaman n. En el lado derecho, es diciendo conseguir int positivo. Ahora vamos a hacer una pausa en esa historia porque ahora No guardo moviendo el cursor hacia abajo. Mi cursor ahora se pone aquí porque ahora consigue ejecuta int positivos. Int. n se declara. Haga lo siguiente. Printf me da un número entero positivo. Consigue un int del usuario, guárdela en n, y tal vez hacer esto una y otra vez. Este bucle significa que este código podría ejecutar arriba y abajo como esto otra vez y de nuevo, pero cuando el usuario finalmente coopera y me da un positivo int, me golpeó la línea 21, en cuyo punto el número se devolvió, y que uno debo destacar ahora? Nueve. De control, por así decirlo, devoluciones a la línea de nueve. Esa es la línea que ahora está a cargo. Así que eso es lo que ha estado sucediendo en todo esta vez por debajo de la capucha, pero cuando hemos usado funciones como printf o incluso obtener cadena que alguien más escribió para ti, el control estaba siendo imparcial off a la línea de código de otra persona por línea por línea. Es sólo que no podía verlo y nos realmente no podía representarlo en este programa porque es de alguna otra archivar en el disco duro desconocido para nosotros. Así que vamos a compilar realidad y ejecutar este momento. Hacer positivo. Compilar, eso es progreso. . / Positivo. Dame un número entero positivo. Vamos a ser difícil. Negativo 1. Zero. Vamos a darle 50. Gracias por el control 50, y así Ahora ha regresado. Cualquier pregunta, entonces, en que? ¿Sí? [Inaudible]. Dilo de nuevo. Ah, buena pregunta. Así que usted puede notar un paralelo que Soy una especie de corte de una esquina en. En la línea 12, que estoy diciendo, consiga int positivo devuelve un int, pero por ese mismo lógica, ahora es lógico que en línea de seis, estoy diciendo que los principales retornos un int, pero lo que tenemos que nunca tenido en cualquiera de nuestros programas? Nunca hemos tenido una mención de este retorno palabra clave. Así que resulta que en C, por lo menos la versión que estamos utilizando realizado en 1999, técnicamente, se trata de ocurre de forma automática. Cada vez que se implementa un programa y implementar una función llamada principal, que función devolverá cero por defecto si usted no dice lo contrario, y el cero es sólo una convención. Los rendimientos Mundiales Cero con ello lo que indica que todo está bien, dejándonos con cuatro mil millones posibles cosas que podrían salir mal, así que si volvemos uno, que podría significar un código que significa esto Lo que salió mal. Podríamos volver dos, lo que significa esta otra cosa que salió mal. Podríamos volver cuatro mil millones, lo que significa esto otra cosa que salió mal. Y si ahora piensa en su propio PC o Mac, se puede recordar que a veces aparecen mensajes de error crípticos desde un software que estás utilizando, ya veces tiene un ser humano Descripción amable, pero hay menudo un código o un número en la pantalla? Si esto no viene a la mente, sólo mantener un ojo hacia fuera para él. Eso es por lo general lo que estos los códigos se refieren. Están incluidos en Microsoft Word y otros programas de modo que si usted presenta una reporte de error con la empresa, se puede decirles, oh, tengo el numero de error 45. Y algunos de nuevo programador en la empresa puede parecer que en su código y dicen, oh, eso es porque yo hice este error y es por eso que el usuario obtenido este mensaje. Pero, francamente, es sólo un poco distracción y un poco tedioso para concluir que, al menos en nuestra primeros programas, por lo que hemos sido omitirla. Pero todo este tiempo cada uno de sus Las principales funciones ha tenido en secreto este línea agregada automáticamente por usted por el compilador, simplemente por convención ahorrar algo de tiempo. [Inaudible]. No es necesario incluirlo en principal. Eso está bien. Sí es necesario incluirla si fueras la implementación de una función como esta. De lo contrario la función plana cabo no iba a funcionar. Pero en principal, no es necesario. En una o dos semanas, vamos a empezar a conseguir en ese hábito una vez que queremos empezar significando errores. Muy buena pregunta. Pausa verbal Así rápida de mención que este viernes, no estaremos almorzando per se, pero vamos a tener una cena con algunos de los estudiantes y el personal. Si desea unirse a nosotros, se sienten libre de ir a cs50.net/rsvp. 18:00 de este viernes. El espacio es, como siempre, limitado, pero vamos a seguir haciendo esto en un casi semanalmente si el espacio se agote esta semana. Así que el drama de suspenso que lo dejamos en El lunes fue que las cadenas pueden realmente ser indexados en que sólo le significa se puede obtener en el primer carácter, el segundo personaje, el tercer personaje y así sucesivamente, porque se puede pensar de manera efectiva de una cadena, como hola, como en este caso cinco letras dentro de las cajas. Y usted puede conseguir en cada uno de los cajas con lo que hizo que la sintaxis introducir el lunes? Estos corchetes en su teclado. Eso sólo significaba ir a la posición cero. Empezamos a contar desde cero, por lo que el soporte cero significa H, soporte de uno significa e, y así sucesivamente. Y así todo el tiempo cuando hemos estado el uso de cadenas y escribir "hola" y "mundo" y otras cosas en la pantalla, se ha almacenado en cajas de este tipo. Y tomar una conjetura. ¿Qué hace cada caja representan físicamente dentro de su computadora? [Inaudible]. ¿Lo sientes? Personajes. Así que un personaje, sin duda, en el caso de cadenas, y un personaje es ocho bits o un byte. Así que probablemente es por lo menos vagamente familiarizado con el hecho de que su equipo tiene memoria. Tiene dos tipos de memoria, por lo menos. Uno de ellos es el disco duro donde se guarda Las cosas de manera permanente, y eso es típicamente grande, así que puedes tener películas y la música y así sucesivamente. Entonces usted tiene otro tipo de memoria llamada RAM, R-A-M, de acceso aleatorio Memoria, y este es el tipo de memoria que se utiliza cuando el equipo está correr, pero si pierde el poder o su batería se agota, cualquier cosa que se almacena en la memoria RAM desaparece si se va la electricidad completo, ya que no es persistente. Normalmente tiene, en estos días, un concierto de ella, dos conciertos, tal vez más. Y el lado positivo de la memoria RAM es que es mucho mucho, mucho más rápido que los discos duros o incluso en estado sólido impulsa en estos días, pero es generalmente más caro, así con menos de la misma. Así que la conversación de hoy en realidad se refiere a la RAM, que tipo de memoria que sólo existe mientras hay poder de introducirlo en el ordenador. Así que cuando se escribe en H-E-L-L-O, Enter en el teclado, el H va en una byte de RAM, el E va en otro byte de RAM, como es el resto de la palabra. Así recordamos lo que hemos podido hacer la última vez fue esto. Déjame ir por delante y abrir el archivo que llamamos string.c, y el recuerdo que parecía un poco algo como esto. Déjame en realidad lograr la regresión y el cambio es exactamente lo que parecía, longitud de la cadena de s. Así que busque en el programa aquí. Incluimos la biblioteca CS50 así que podemos utilizar cuerdas get. Incluimos io.h estándar así que podemos usar printf. ¿Por qué incluimos string.h? Esto era nuevo para el Lunes. Así que queríamos longitud de la cadena. Leng Str. La gente decidió hace años, vamos a ser sucinto. En lugar de llamarlo "longitud de la cadena," vamos a llamarlo "leng str" y dejar que el mundo darse cuenta de eso, y por lo que es lo que obtenemos acceso a con string.h. Esta es familiar. Esta es familiar. Esta es familiar. Esto es un poco nuevo. En la línea 22 - y volveremos para esto, pero por ahora saber - y usted sólo saber esto de tener leer la documentación o si sabías C ya - conseguir string veces puede meter la pata. Si el usuario es realmente contradictorio o y él o ella no coopera sólo no escriba nada en el teclado o tipos tanto en el teclado que abruma la memoria de la computadora, en teoría, llegar cadena podría volver algo que no sea un cadena de caracteres. Puede devolver un valor especial llamado NULL en mayúsculas, N-U-L-L, y esto es sólo un valor llamado centinela. Es un valor especial que significa algo malo sucedió en este caso. Es la ausencia de una cadena. Así nula Estoy comprobando por el simple hecho de modo que, cuento largo, leng str y otras funciones que vienen con C, si es que esperan una cadena pero ellos pasan la ausencia de una cadena, si se pasa ellos NULL, el ordenador o el programa de se acaba de estrellarse por completo. Se colgará. Se lanzará encima de algún mensaje de error. Las cosas malas sucederán. Así que, aunque esto sigue siendo no bien definido - esto tendrá más sentido en una semana o dos - en la línea 22, esto es sólo una ejemplo de auto comprobación de errores en defensa sólo en caso de una vez de cada un millón de que algo va mal, al menos mi programa no se estrellará. Así que si s no es igual a algo malo, Tengo este bucle for, y esto fue donde teníamos que otra nueva pieza de sintaxis. Tengo una para la iteración de bucle de cero en un máximo de la longitud de s. Y luego aquí, estaba imprimiendo una s soporte de i, pero ¿por qué utilizo% c todos repente en lugar de% s aún aunque s es una cadena? Es un personaje, ¿no? S es una cadena, pero s abrazadera algo, s abrazadera i donde i es cero o uno o dos, eso es un individuo carácter de la cadena, por lo que para que, printf debe ser informado de que es de hecho un personaje que puede esperar. Y a continuación, recordar, lo que hizo este programa realmente? Impreso a cabo en columnas. Sí, exactamente. Simplemente imprime la palabra que escribo en una columna, un carácter por línea. Así que vamos a ver esto de nuevo. Así que la cadena. Compilado Aceptar. . / String. Permítanme escribo en H-E-L-L-O, ENTER, y de hecho lo entiendo, una línea por. Así que déjame hacer una optimización de aquí. Si se piensa en ello, sobre todo si que haya programado antes, hay posiblemente una ineficiencia en la línea 24. En otras palabras, no es necesariamente el mejor diseño. Sencillo, al menos, una vez que recordar lo leng str es, pero es haciendo algo tonto potencialmente. ¿Qué podría ser? [Inaudible]. Exactamente. Es la comprobación de la longitud de s cada vez que a pesar de que H-E-L-L-O siempre va a ser de cinco caracteres. Cada vez que a través de este bucle, los cinco no está cambiando. Yo podría estar incrementando i, pero lo es la longitud de s en todos los iteración de este bucle? Son las cinco, que es de cinco años, que es de cinco años, y sin embargo, yo estoy pidiendo esto, sin embargo, pregunta una y otra vez y otra vez. Ahora, francamente, el ordenador es tan condenadamente rápido, nadie va a notar una diferencia en este caso, pero estos tipos las decisiones de diseño de pobres puede empezar a sumar si el propio compilador no tratar de arreglar esto para usted que que por lo general no lo haría, por lo menos en el aparato. Así que voy a hacer esto. Voy a añadir una coma después de mi primera variable, i. Voy a darme otra variables, que calificó de n, con sólo convención para los números, y entonces estoy va a asignar n el valor de cadena longitud de s. Y entonces voy a cambiar mi condición de ser qué? Voy a cambiar mi condición al mismo tiempo i es menor que n. Así que ahora, ¿cuántas veces estoy el control de la longitud de s? Una vez, pero está bien para comprobar i contra n una y otra vez porque ahora los Los valores no son en realidad cambiando. Ahora por ahora, sólo sé que en cualquier momento que llamar a una función, hay un poco de gastos generales, no es suficiente para desalentar realmente desde siempre el uso de funciones, pero sin duda cuando hay una línea de código así - y las líneas tendrán más interesante en poco tiempo - en su hay una oportunidad para pensar, si yo escriba este código, el número de veces va a ejecutar? Usted comenzará a ver con el tiempo el rendimiento de los programas pueden de hecho cambiar. De hecho, uno de los boletines de problemas que hemos hecho en los últimos años implica ejecución en lo que usted puede recordar de semana cero, un corrector ortográfico, sino una corrector ortográfico que está diseñado para soportar un diccionario de 150.000 más palabras que le ofrecemos chicos. Usted tendría que escribir código que se carga esas palabras en la memoria RAM, por lo que en cajas como la que vimos en la pantalla de un momento hace, a continuación, lo más rápido que puede, tiene que ser capaz de responder a una cuestión de la forma, es la palabra mal escrito? Está mal escrito en la palabra? Está mal escrito en la palabra? Y en algo así lo que hemos hecho en los últimos años se convirtió en, aunque de manera opcional opt-in, un la competencia de las clases, por lo que el los estudiantes que utilizan el menos RAM y menos tiempo, menos ciclos de CPU, terminan burbujeando hasta la cima de una pequeña tabla de clasificación o ranking que nos ponemos página de inicio del curso, ya que hemos hecho en los últimos años. Así que de nuevo, totalmente opcional, pero esta habla de las oportunidades de diseño que están por delante una vez que empezamos edificio encima de algunos de estos bloques de construcción básicos. Así que permítanme volver a este diagrama para un momento y revelar un poco algo más. De hecho, esto es una cadena, y hemos tomado ventaja de algunas bibliotecas, io.h estándar que tiene - Printf. Printf, entre otras cosas. cs50.h, que ha conseguir int y obtener string y así sucesivamente, string.h, que tenido leng str. Pero resulta que hay otra. Francamente, hay montones y montones de cabecera archivos que declaran funciones para las bibliotecas, pero esto es ctype.h en realidad va a ser algo ventajosa porque voy seguir adelante y poner en práctica una otro programa aquí. Déjame ir adelante y abro algo Escribí con antelación llamada capitalize.c, y echemos un vistazo a cómo funciona esto. Observe que estoy usando, en esta versión de la misma, tres archivos familiares. Nótese que en la línea 18, que soy obtener una línea de texto. Fíjese en la línea 21, estoy afirmando que el siguiente código va a capitalizar s, lo que el usuario escribió , y cómo hago eso? Bueno, yo estoy tomando - lección aprendida de la última vez - Estoy declarando i y n y la iteración lo largo de los caracteres de la cadena. Y entonces, ¿qué es este bloque de código en la línea 24 hasta el 27 de haciendo en términos sencillos? Letra minúscula espalda. Exactamente. Si s abrazadera i - por lo que si el i-th carácter de s, que es una específica charla en la cadena, es mayor que o igual a minúsculas y un - recordar que signo doble significar y - y el mismo carácter, s i soporte, es menos de o igual a z minúsculas, eso significa que es una A o una B o una C o punto, punto, punto, o una Z, que medios está en minúsculas. ¿Qué es lo que quiero hacer en ese caso? Bueno, yo puedo hacer esto de alguna manera crípticamente, pero vamos burlan de esta separación. Voy a llamar a printf, impresiones% c porque quiero hacer uso de este carácter en la pantalla. Luego voy a tomar s soporte i, la i-ésimo carácter en s, y entonces ¿por qué estoy haciendo este pequeño truco aquí, minúscula mayúscula menos A? ¿Qué es eso de ir a dar mí, en términos generales? [Inaudible]. Exactamente. Yo no me acuerdo - que era de 65 años para el capital A. Realmente no me recordar lo que una minúscula, es decir, pero no importa. La computadora sabe. Así diciendo, minúscula un signo menos A mayúscula, es raro estar restar un carbón de leña de otro, pero ¿cuáles son caracteres debajo de la campana? No son más que números. Así que cualquier cosa esos números son, dejar que el ordenador recuerde que más que me lo humano. Así minúscula mayúscula menos A se me va a dar la diferencia. Le pasa a ser 32, y que sería el caso de la b minúscula y mayúscula B y así sucesivamente. Se mantiene constante, por suerte. Así que estoy diciendo en esencia, tomar la letra minúscula, restar off que diferencia norma, y ​​que cambia efectivamente s abrazadera i de minúsculas a, por supuesto, en mayúsculas, sin que yo realmente tener que pensar sobre o recordar, ¿cuáles fueron los los números de los que hablamos cuando los ocho voluntarios llegaron al escenario? Ahora mientras tanto, en el otro, si no es una letra minúscula, determinado por la línea 24, al imprimirlo. Yo sólo quiero tocar el caracteres que eran de hecho originalmente en minúsculas. Así que veamos esto. Hacer capitalizar. Compilado, OK. . / Capitalizar. Y permítanme escribo en H-E-L-L-O en minúsculas, Intro. Y note que se convierte en mayúsculas. Déjame hacer esto de nuevo con una palabra diferente. ¿Qué hay de D-A-V-I-D con la primera D capitalizado como un nombre típicamente es? Intro. Observe que sigue siendo correcta. Sólo emite esa primera D sin cambios a través de otra cosa que construir. Así que tenga en mente, entonces, un par de cosas aquí. Uno, si alguna vez desea comprobar dos condiciones a la vez, que pueda y les juntos como lo habíamos previsto. Puede comparar los caracteres de esta manera y tratar eficazmente caracteres como números, pero, francamente, esto es tan maldita críptico que nunca voy a recordar cómo llegar a este desde cero sin razonar a través de ella durante bastante un poco de tiempo. ¿No hubiera sido agradable si alguien por ahí escribió una función llamada es un menor que podría responder por mí verdadera o falso, este personaje está en minúsculas? Bueno gracias a Dios, quien escribió ctype.h hizo exactamente eso. Déjame ir aquí y añadir ctype para c tipos, y ahora déjame bajar aquí y reescribir esta línea de la siguiente manera. Así que si se llama es menor, reclamo, S soporte de i, entonces yo voy a borrar estas dos líneas en total. Así que ahora alguien más, espero, escribió una función llamada es más bajo, y resulta que lo hicieron y fueron reunidos dentro de ctype.h. Y ahora voy a salir de la línea 27 solo, voy a salir de la línea 31 solo, pero noto lo mucho que he reforzado mi código. Ahora es más limpio. Es menos difícil de mirar a través de porque ahora la función, por otra parte, es tan maravillosamente llamado simplemente hace lo que dice. Así que ahora voy a guardar esto. Me voy a alejar. Y al igual que en los arañazos que podría tener Booleanos, valores booleanos true o falso, eso es exactamente lo que es devuelve menor eficacia. Déjame a compilar. Déjame volver a ejecutar. Y ahora vamos a intentarlo de nuevo, H-E-L-L-O, Enter. Eso es bastante bueno. Y tratar de nuevo, asegúrese de que no atornillar algo. Eso se capitaliza también. Pero esto no es lo suficientemente bueno, porque el Otra cosa que yo nunca voy a recuerde a menos que trabaje a través de lo que realmente cuidadosamente sobre, por ejemplo, el papel es esta maldita línea. ¿No sería agradable si había una función llamada a la parte superior? Pues resulta que hay está en ctype.h también. Voy a seguir adelante y escribir - permítanme traer esa línea de la espalda. En lugar de esto aquí, que me deje ir por delante y decir, sustituto de la c% del resultado de llamar a esta función para superior en el carácter i-ésimo de s. Y ahora note que se está haciendo un poco equilibrada. Tengo que mantener un registro de cuántas paréntesis que he abierto y cerrado. Así que ahora es aún más limpio. Ahora bien, este programa es cada vez mejor y mejor diseñados posiblemente porque es mucho, mucho más fácil de leer, pero no es de Vamos a corregir. Hacer capitalizar. . / Capitalizar. H-E-L-L-O. Vamos a correr de nuevo, D-A-V-I-D. Aceptar, por lo que aún estamos en muy buena forma. Pero ahora al superior. Propongo que hay uno más refinamiento podríamos hacer eso sería muy agradable, que realmente podía apretar hasta este código y realmente nos dan cinco Fuera de cinco para el diseño, por ejemplo. Lo que sería bueno para deshacerse de? Bueno, mira lo malditamente largo de este bloque de código es sólo para hacer algo simple. Ahora, como un aparte, como es posible que tenga visto en súper sección el pasado fin de semana, usted no necesita estrictamente la llaves cuando sólo hay uno línea de código, a pesar de que hemos propuesto mantenerlos para que haga mucho más claro, como en la forma de U de Scratch bloques, lo que está dentro de la sucursal. Pero ¿no sería agradable si al superior, cuando se les da su entrada, lo convirtió en mayúsculas, si no lo es, y lo que haría ser maravilloso en el caso contrario, si ya está en mayúsculas? Sólo tiene que pasar a través de y dejarlo solo. Así que tal vez lo hace. Podría intentarlo y sólo espero que lo hace, pero me dejó introducir una cosa más. En lugar de utilizar esta integrado en el terminal ventana de aquí abajo, recordemos que este icono cuadrado negro le da un ventana de terminal más grande que puedo completo detectar si quiero? Así que resulta que son una especie de extraña nombrado, pero hay esas cosas llamadas páginas de manual, páginas de manual, hombre, para abreviar, y puedo acceder a ellos hombre escribiendo - ¿qué quiero escribir? Man to superior. Y ahora fíjense si existe una funcionar en el interior de la computadora, en este caso el aparato, que se encuentra el sistema operativo Linux, que va para darme un conjunto un tanto críptica de de salida, pero usted encontrará que con el tiempo siempre tiene el formato más o menos la misma por lo que empezar a acostumbrarse a él. Fíjese en la parte superior a la parte superior, y al parecer es la misma documentación para bajar. Quienquiera que haya escrito que estaba recortando algunos esquinas y lo puso todo en una página. Propósito Estas cosas 'en la vida es para convertir un carta a mayúscula o minúscula. Nótese que bajo Sinopsis, la página de manual me está enseñando lo archivo que tengo para incluir a usar esta cosa. Me está dando las firmas para estos funciones, tanto de ellos, incluso a pesar de que en estos momentos sólo se preocupan por uno. He aquí ahora una descripción. Para convierte superior de la letra c a mayúsculas si es posible. Aún así no es que instructiva, pero déjame Ahora mire bajo valor de retorno, lo eso se devolvieron. Así que el valor devuelto es el de la carta convertido o c si el conversión no era posible. ¿Qué es el c? El carácter original. El carácter original y sabemos que por, otra vez, subiendo a la sinopsis, y el que escribió esto función acaba de decidir que la entrada para que superior e inferior es sólo para ir arbitrariamente a llamarse c. Podrían haber llamado más nada que quieran, pero lo mantuvieron en simple como c. Así que he consultado la página de manual. Esta frase me asegura que si que no es una letra minúscula, es va a darme la espalda c, que es perfecto, lo que significa que puedo deshacerme de mi condición más. Así que permítanme volver a GEdit y Ahora déjame hacer esto. Voy a copiar mi sentencia printf. Voy a seguir adelante y la derecha en el interior el bucle de impresión que fuera, y recibe deshacerse de ahora este conjunto si constructo. ¿No era una mala idea, y era muy mucho más correcto y consistente con todo lo que hemos predicado, pero simplemente no es necesario. Tan pronto como te das cuenta de alguna biblioteca existe la función que otra persona escribiste, o tal vez usted escribió en otra parte de el archivo, se puede usar y realmente comenzar a endurecer el código. Y cuando digo cosas como buen estilo, el hecho de que esta persona que se denominará función superior, o previamente es menor es maravillosamente útil porque que son muy descriptivos. Usted no quiere llamar a sus funciones X e Y y Z, que tienen mucho, mucho menos significado,. ¿Tiene preguntas sobre la serie de mejoras? Así que basta con decir una de las comida para llevar es como vuestro propio problema set - tal vez un problema establece una, pero Ciertamente P fijó dos en adelante, incluso cuando son correctas no necesariamente significa que sean perfectos sólo todavía o particularmente bien diseñada. Ese es el otro eje de empezar a pensar. Así que esto era una cadena dentro de su la memoria de la computadora, pero si usted tiene un manojo entero de personajes como H-E-L-L-O dentro de la memoria RAM, y supongamos que en su llamada al programa obtiene cadena varias veces de manera que usted llamar obtener string una vez, entonces usted llamar obtener string de nuevo. Bueno, ¿qué va a suceder con el tiempo? En otras palabras, si usted tiene una línea de código, aunque sea fuera de contexto, como string s consigue - vamos a hacer esto. String nombre es igual a conseguir cuerda. Así que supongo que esa línea de código está destinado para preguntar al usuario por su nombre. La siguiente línea de código tiene la intención de pedir el usuario para su escuela, y esta línea siguiente, y así sucesivamente. Supongamos que seguimos pidiendo el usuario para otro y otra, y otra cadena. Ellos van a permanecer en la memoria al mismo tiempo. Uno no va a darle una paliza al otro. La escuela no se sobrescribe el otro. Pero ¿de dónde todos terminar en la memoria? Bueno, si nos ponemos a dibujar en la pantalla, que podemos utilizar esta cosa aquí, como una pizarra, si este negro rectángulo representa mi equipo de memoria, voy a empezar de forma arbitraria dividirlo en pequeños cuadrados, cada uno de los cuales representa un byte de la memoria. Francamente, si usted tiene un gigabyte de RAM en estos días, usted tiene un billón de bytes de la memoria en su ordenador, por lo que un mil millones de estas plazas. Así que basta con decir, esta no es realmente a escala. Pero podríamos seguir dibujando todo esto claramente no a escala cuadrados, y esta representa colectivamente la memoria de mi ordenador. Ahora sólo tendremos que hacer punto, punto, punto. En otras palabras, cuando ahora pedirá al usuario con una cuerda get a darme un cadena, ¿qué sucede? Si el usuario escribe "hola", que los extremos en H-E-L-L-O. Pero supongamos que el usuario entonces los tipos de - En realidad, yo no debí haber hecho hola porque estamos pidiendo ellos por sus nombres. Así que vamos a volver si puedo hacer esto. Así que si escribo en D-A-V-I-D a mi nombre, sino recordar que la segunda línea de código era string get nuevo para llegar a su escuela. ¿Dónde está esa palabra que el usuario tipos en ir a ir ahora? Bueno, tal vez esto va a ir a H-A-R-V-A-R-D. Así que, aunque no tengo dibujado como dos filas, esto es sólo un montón de bytes en su la memoria RAM del ordenador. Hay un problema ahora, porque ahora si estoy utilizando la memoria RAM en este muy razonable pero algo ingenua manera, lo que puede al parecer no se distinguen? Cuando uno empieza y dónde uno termina, ¿no? Son una especie de desdibujar juntos. Así resulta que el ordenador no hacer esto. Permítanme realidad retroceder en el tiempo un pocos personajes, y en vez de Harvard ir inmediatamente después del nombre del usuario, el usuario consigue realmente, detrás las escenas, un carácter especial insertado por el equipo para él o ella. / 0, también conocido como el carácter nul molesto llamado N-U-L, no N-U-L-L, pero se escribe como / 0. Son sólo los bits cero es un marcador de entre la primera palabra que el usuario escrito y la segunda. Así Harvard realidad ahora termina como esta secuencia de caracteres y uno más / 0. Así, en otras palabras, al tener estos valores de centinela, ocho cero contigua pedacitos, ahora puede empezar a distinguir un personaje de otro. Así que todo este tiempo lo que estaba "hello" es realidad "hola" con a / 0, y por su parte, podría muy bien ser un poco más de memoria RAM interior de la computadora. Déjame hacer otra cosa ahora. Resulta que todos estos cuadrados hemos estado dibujando, son, sí, cadenas, pero más generalmente, estas cosas son arrays. Una matriz es simplemente un trozo de memoria eso es volver a la espalda con espalda con espalda, y normalmente se utiliza una matriz por medio de esta notación de corchetes. Así que vamos a ver a estos un poco con el tiempo, pero me dejó ir adelante y abrir, vamos a llamarlo edades. Y notamos lo que podemos hacer con estos mismos trucos, un poco poco más de la sintaxis aquí. Así, en la línea 17 de este programa - En realidad, déjame correr primero el programa para que podamos ver lo que hace esta cosa. Déjame llamar a realizar las edades para compilar este programa. . / edades. ¿Cuántas personas hay en la habitación? Llámelo tres. Edad de la primera persona? 18, 19, y 20. Y ahora un poco ridículo, sólo han hecho un programa que esas edades tres personas. Así que hay claramente una oportunidad para un poco de aritmética diversión aquí. Afortunadamente, la matemática es correcta. 18 fueron a 19, 19 fue a 20 y así sucesivamente. Pero lo que realmente significa ser ilustrativa aquí es cómo lo estamos almacenando edades esos tres de las personas. Permítanme ampliar desde lo que es pasando aquí. Así que en primer lugar, estas primeras líneas deben estar recibiendo bastante familiar. Sólo estoy preguntando al usuario para la número de personas en la habitación. Entonces estoy usando get int y hacer tiempo para hacer esto una y otra vez y otra vez. Hemos visto que el patrón anterior, pero la línea 27 es nuevo y en realidad bastante útil, y se convertirá en cada vez más útil. Tenga en cuenta que lo que es diferente en la línea 27 es que me parece que haya declarado una int llamado las edades, pero espera. No es sólo int edades. Hay estos corchetes, dentro de los cuales es n. Así el soporte de N en este contexto, no dentro de una instrucción printf aquí, pero en esta sola línea 27, esta línea es diciendo dame N ints, cada uno de los cuales es de tipo int. Así que este es un cubo, por así decirlo, de, en este caso, tres números enteros de nuevo a espalda con espalda para que efectivamente tener tres variables. La alternativa, para ser claro, sería esta. Si yo quería del primer estudiante edad, yo podría hacer esto. Si yo quería que el segundo de los estudiantes edad que yo podría hacer esto. Si yo quería del tercer estudiante edad, yo podría hacer esto. Y Dios no lo quiera que necesitamos todo el mundo es edad en esta sala - Quiero decir, esta es una diablos de un montón de copia, pegar una y otra vez y otra vez. Y más de una vez puedo compilar este programa, si otro estudiante camina en más de fuera de esa puerta, ahora mi número de variables es incorrecta. Así que lo que es bueno acerca de un arreglo es tan pronto como usted comienza a sentirse a sí mismo copiar y pegar, las probabilidades son que hay no es el mejor enfoque. Una matriz es dinámica potencialmente. No sé de antemano cuántas personas van a estar en la sala, pero sí sé que necesito n de ellos, y voy a averiguar n cuando llegue el momento. Esta línea de código significa que ahora, dame un trozo de memoria que tiene este aspecto donde el número de cajas en la pantalla es totalmente dependiente de n que que el usuario escribió pulg Así que ahora el resto de este programa es En realidad es bastante similar a lo que acaba de hacer con los personajes. Note que tengo un bucle comienza en la línea 30. Así que justo después de obtener la matriz, que iterar de y es igual a cero en un máximo de n. Sólo tengo esta printf instructivo mensaje que acaba de decir, me da la edad de persona #% i, por lo que el número uno, número dos, número tres. ¿Y por qué hago esto? Francamente, los seres humanos prefieren contar de uno subiendo mientras que los informáticos, cero en adelante. los informáticos no van a utilizar este tipo de programas, por lo que estamos va a simplemente empezar a contar a la una como la gente normal. Y ahora, en la línea 33, observe el poco diferente pedazo de sintaxis. La edad de orden i en esa variable de tipo matriz se va a conseguir un int. Y ahora, por último, esto es sólo aritmética aquí abajo. Decidí en un bucle por separado con la reivindicación algún tiempo pasa, y ahora en esta bucle separado, estas líneas se ejecutan. Dentro de un año, la persona i será i años de edad, pero note que esto no es el i variable. Esto es ahora% i para int. Y noten como el primer marcador de posición, me enchufamos i + 1, por lo que contamos como un persona normal. Y luego por el valor de su edad, por i años de edad, me tomo las edades soporte i - y por qué estoy haciendo más uno aquí? Acaban de edades. Es mi estúpida elección de los programas. Ellos sólo un año de edad. Yo podría escribir cualquier número que Realmente quiero allí. Así que lo que en realidad es todo la relevancia aquí? Bueno, déjame en realidad retroceder aquí y pintar un cuadro de lo que se avecina. ¿Qué vamos a hacer con nuestro próximo Problemas de Two está incursionando en el mundo de la criptografía. Así que esto es una cadena de caracteres, por lo que un secuencia de múltiples caracteres, y lo que Qué dice esto? No está en la versión en línea de las diapositivas. Así que afirmo que esto es igual a esto, un estúpido anuncio de muchos años hace que en realidad podría recordar uno de sus orígenes. Así que este es un ejemplo de cifrado o la criptografía. Resulta que si quieres en realidad enviar información o compartir información con alguien de forma segura, como un mensaje de este tipo, se puede revolver las letras. Pero por lo general, las palabras son no revueltos al azar. Están permutan de alguna manera o se cambian de alguna manera, por lo que - ¡Uy. Eso es un spoiler de la diversión para la próxima vez. Así que usted puede asignar lo que es aparentemente O a B. Tenga en cuenta que se alinea Capitalización del reloj. Aparentemente R se convierte en e. Aparentemente F-H-E-R se convierte en S-U-R-E. Así Resulta que hay una asignación, y en este caso hay una bastante estúpido mapeo si alguien se ha dado cuenta? Esto es algo que se llama Rot 13, Girar 13. Es el más estúpido de cifrado mecanismos, ya que, literalmente, sólo 13 añade a cada una de las cartas, estúpido, en el sentido de que si sólo tener un poco de tiempo libre en sus manos y un lápiz, o simplemente crees que a través de su cabeza, usted podría intentar todas las adiciones posibles - una, dos, tres, punto, punto, punto, 25 a sólo girar todo el alfabeto, y finalmente, te enterarás lo que este mensaje es. Así que si usted hizo algo como esto en la escuela primaria pasando mensajes a su mejor amigo, si su escuela primaria maestro simplemente leer a través de la mensaje y bruta obligaron a la solución, es posible que haya llegado una respuesta para eso. Ahora, por supuesto, en el mundo real, criptografía es más sofisticado. Se trata de un fragmento de texto de un sistema informático que tiene los nombres de usuario y contraseñas, ya que casi todos los nuestros lo hacen, y esto es lo que tu contraseña puede verá como si se almacena en el disco conducir, pero en forma encriptada. Esto no es sólo una rotación de las letras, A es B y B es C. Esto es mucho más sofisticado, pero utiliza lo que generalmente se conoce como clave secreta la criptografía. Esta imagen dice lo siguiente historia con algunos iconos. A la izquierda, tenemos lo que vamos a llamar a texto sin formato. En el mundo de la criptografía, la llanura texto es sólo el mensaje original escrito en Inglés o Francés o cualquier otro idioma que sea. Si desea cifrarlo, pasaremos pictóricamente a través de un candado, de modo algunos de tipo de algoritmo, alguna función o programa que alguien escribió que mezcla las cartas con suerte más complicadamente que simplemente añadir 13 para cada uno de ellos. Lo que se obtiene de ese proceso en el medio hay se llama texto cifrado. Así que tipo de una palabra sexy. Sólo significa que es el cifrado versión del texto sin formato. Y sólo si tiene el mismo secreto, 13 o menos 13, que son capaces de descifrar un mensaje así. Así, en Problemas de Dos, entre las cosas que va a hacer si en el Hacker Edition, tendrá que escribir código para descifrar estas contraseñas, averiguar lo que eran y cómo eran cifrada, aunque le damos un poco de orientación a lo largo del camino. En la edición estándar, se introduce un par de sistemas de cifrado, cifrado mecanismos, uno llamado César, uno llamado Vigenère, que todavía están sistemas de cifrado de rotación en la que A se convierte algo, B se convierte en algo, pero usted tiene que hacerlo mediante programación porque habrá hecho ser un secreto clave involucrados, que es típicamente un número o una palabra clave que sólo el remitente y el destinatario de estos mensajes deben entender. Ahora bien, esta realidad tiene encarnaciones en el mundo real. Esto, por ejemplo, es pequeño huérfano Annie secreto anillo decodificador, y usted en realidad puede aplicar estos cifras de rotación - A se convierte en algo, se convierte en B algo - con un par de ruedas, una en el exterior, uno en el interior de manera que si se gira la rueda o el anillo, en realidad se puede alinear el letras con diferentes letras, conseguir un código secreto. Y así como el drama de suspenso para hoy, lo que pensé que haría un poco de retroceso que si se enciende la TV el 24 de diciembre, se puede ver el película hasta la saciedad para 24 horas en una fila. Pero por hoy, lo abriré aquí y nos dan sólo dos minutos de un Historia pedagógicamente relevante Navidad con un poco de tipo llamado Ralphie. [REPRODUCCIÓN DE VÍDEO] -Sea notorio a todo el mundo que Ralph Parker Se nombra al miembro de la secreta Little Orphan Annie círculo y tiene derecho a toda los honores y beneficios que ocurren al mismo. -Firmado, Little Orphan Annie. Refrendado, Pierre Andre en tinta. Honores y se benefician ya a la edad de nueve años. [GRITA EN RADIO] 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 concluyendo aventura del negro barco pirata. Ahora, es el momento para Secret de Annie Mensaje para ustedes, miembros del círculo secreto. Recuerde, los niños. Sólo los miembros de Annie Secret Circle puede decodificar el mensaje secreto de Annie. Recuerde, Annie depende de ti. Establezca sus alfileres para B2. Aquí está el mensaje. 12, 11, 2 - -Estoy en mi primera reunión secreta. -25, 14, 11, 18, 16 - -Pierre estaba en gran voz esta noche. Me di cuenta el mensaje de que esta noche que era realmente importante. -3, 25. Ese es un mensaje de Annie sí misma. Recuerde, no se lo digas a nadie. -90 Segundos más tarde, estoy en la única habitación en la casa donde un niño de nueve años podía sentarse en privacidad y decodificación. Aha, B. me fui a la siguiente. E. La primera palabra es "ser". S. Venía más fácil ahora. U. 25. Eso es R. -Vamos, Ralphie. Me tengo que ir. -Voy a estar justo abajo, Ma. Whiz Gee. -T. O. Asegúrese de. Asegúrese de que? ¿Cuál era la huerfanita Annie tratando de decir? Asegúrese de que? -Ralphie, Randy tiene que ir. Haga el favor de salir? -Está bien, mamá. Saldré derecha. -Yo estaba más cerca ahora. La tensión era terrible. ¿Qué fue? El destino del planeta puede pender de un hilo. -Ralphie, tengo de Randy van. -Voy a estar a derecho por el amor de Dios. -Ya casi. Mis dedos volaban. Mi mente estaba en una trampa de acero. Cada poro vibró. Era casi transparente. Sí, sí, sí, sí, sí. -Asegúrese de beber su Ovaltine. Ovaltine? Un comercial de mala muerte? Hijo de puta. [VIDEO PLAYBACK FIN] ALTAVOZ 1: Este es CS50, y que será de problemas Two. Nos vemos la semana que viene. ALTAVOZ 2: En la siguiente CS50, esto sucede. ALTAVOZ 1: Así que un tema que no tenemos mirado hasta ahora es la de los punteros de función. Ahora, un puntero de función es sólo la dirección de un público función, pero al igual que - hijo de un -