[REPRODUCCIÓN DE MÚSICA] DAVID J. MALAN: Muy bien. Esto es CS50, y esto es el final de la Semana 2. Así que hoy, vamos para continuar nuestra mirada la forma en que representamos las cosas debajo de la hood-- alejándose de números como números enteros y valores de punto flotante y se centra en las cadenas y programas en última instancia, más interesantes. Pero también vamos a echar un vistazo a un par de problemas-- de dominio específico la primera de las cuales será ser la participación de la criptografía, el arte de la codificación de la información, en el que se ve por encima de aquí es un cuadro de Radio Orphan Annie anillo decodificador secreto de antaño. Esto es en realidad forma muy primitiva y la forma de cryptopgraphy para niños por lo que este anillo tiene dos disks-- uno dentro y otro fuera. Y girando uno de esos, usted puede esencialmente ordenar las letras como la A A a la Z con otras letras como B a través de A. En otras palabras, puede girar literalmente el alfabeto, procedente de ese modo con un mapeo desde cartas a las cartas de modo que, si usted querido enviar un mensaje secreto para alguien como Annie, podría escribir por su mensaje y luego gire las letras, por lo que, si usted se refiere a decir "A", que en lugar de decir "B" Quiere decir "B" que en lugar de decir "C" - o algo un poco más inteligente que eso-- y, a continuación, en última instancia, siempre y cuando Annie tiene este decodificador anillo, se puede descodificar el mensaje. Ahora, usted puede recordar, en efecto, que este se utilizó en una película muy famosa que juega hasta la saciedad durante la temporada de Navidad. Vamos a echar un vistazo aquí. Ralphie PARKER: "Ya se trate de conocido por todos que en resumen que Ralph Parker Se nombra es miembro de Little Orphan Annie Secret Círculo y tiene derecho a toda la honores y beneficios que ocurren a la misma ". Ralphie PARKER (narrar): Firmado Little Orphan Annie. Refrendado, Pierre Andre! En tinta. Honores y beneficios, Ya a la edad de nueve años. [REPRODUCCIÓN DE MÚSICA] [CHATTER RADIO] Ralphie PARKER: Vamos. Vamos a seguir adelante con ella. Yo no necesito todo ese jazz acerca de contrabandistas y piratas. RADIO LOCUTOR: Escuche mañana noche para la aventura final de El Negro del barco pirata. Ahora, es el momento de Annie Mensaje secreto para ustedes miembros del Círculo Secreto. Recuerde los niños, los únicos miembros de Annie Secret Circle puede decodificar el mensaje secreto de Annie. Recuerde, Annie depende de ti. Establezca sus alfileres para B-2. Aquí está la mensaje-- 12, 11, 2-- Ralphie PARKER (narrar): I estoy en mi primera reunión secreta. RADIO LOCUTOR: -25, 14, 11, 18, 16-- Ralphie PARKER (narrar): Oh, Pierre estaba en gran voz esta noche. Me di cuenta de que esta noche mensaje era realmente importante. RADIO LOCUTOR: --3, 25. Ese es un mensaje de Annie sí misma. Recuerde, no se lo digas a nadie. [JADEO] Ralphie PARKER (narrar): Noventa segundos después, estoy en la única habitación de la casa donde un niño de nueve años podía sentarse en privacidad y decodificación. Ah. "B." [Se ríe] Ralphie PARKER (narrar): Fui a la siguiente. "E." La primera palabra es "ser." ¡Sí! Venía más fácil ahora. "U." [Se ríe] RANDY PARKER: Aw, vamos, Ralphie. Me tengo que ir! Ralphie PARKER: Estaré abajo, Ma. Whiz Gee. "T." "O." "Asegúrese a "." Asegúrese de "¿qué? ¿Cuál fue la pequeña huérfana Annie tratando de decir? "Asegúrese de" ¿qué? MADRE: Ralphie, Randy tiene que ir. Haga el favor de salir? Ralphie PARKER: Bueno, mamá! Estaré fuera cierto! Ralphie PARKER (narrar): Yo estaba más cerca ahora. La tensión era terrible. ¿Qué era? El destino del planeta puede pender de un hilo. MADRE: Ralphie, Randy tiene que ir! Ralphie PARKER: ¡Vuelvo a cabo, por el amor de Dios! Ralphie PARKER (NARRANDO): Casi allí! Mis dedos volaron! Mi mente era una trampa de acero. Cada poro vibró. Era casi claro! ¡Sí! ¡Sí! ¡Sí! ¡Sí! Ralphie PARKER: "Asegúrese beber su Ovaltine ". Ovaltine? Un comercial de mala muerte? [REPRODUCCIÓN DE MÚSICA] Ralphie PARKER: Hijo de puta. [Risas] DAVID J. MALAN: Así que a continuación es un vistazo a lo que la criptografía puede ser para un esto-- beber de antaño. Así que un anuncio rápido. Si usted es libre de esta Viernes a las 1:15 pm y lo haría gustaría unirse a nosotros para CS50 el almuerzo, la cabeza a esta URL aquí. En primer llegado, primer, como de costumbre. Pero con el tiempo, nos aseguraremos de que más todos los que quieran participar puede programar-sabio. Así cuerdas. Tenemos Zamyla-- quien ahora has conocido más probable en Boletín de problemas 1-- cuya nombre se escribe así. Y suponga que ha escrito su nombre en un programa informático que está usando algo como getString. Con el fin de recuperar los golpes de teclado, cómo vamos sobre lo que representa un cadena, una palabra, un párrafo, o varias letras como estas aquí? Hablamos acerca de la última vez enteros y problemas que surgen con desbordamiento de enteros y valores de punto flotante y los problemas que surgir dentro de la precisión. Con cuerdas, por lo menos tener un poco más de flexibilidad porque sólo strings-- en lo real mundo-- puede ser una longitud bastante arbitrario. Bastante corto, bastante largo. Pero incluso entonces, vamos a encontrar que las computadoras a veces puede quedarse sin memoria y ni siquiera almacenar una cadena lo suficientemente grande. Pero por ahora, vamos a empezar a visualizar una cadena como algo en estas cajas Aquí. Así que seis de tales cajas, cada una de las cuales representa un personaje o "char". Así que recuerda que "char" - c-h-a-r-- es uno de los tipos de datos incorporados en C. Y lo que es interesante es que se puede utilizar ese tipo de como un bloque de construcción, una pieza del rompecabezas, si se quiere, para formar un mayor tipo de datos que vamos a seguir para llamar a una "cadena". Ahora, lo que es útil sobre el pensamiento acerca de cosas como cuerdas de esta manera? Bueno, resulta que podemos realmente aprovechar esta estructura Para acceder realmente a caracteres individuales de una manera bastante sencilla. Voy a seguir adelante y crear un archivo llamado "stringzero.c," pero se le puede llamar lo que usted desea. Y en la página web del curso es ya este ejemplo de antemano, por lo que no es necesario escribir todo. Y voy a seguir adelante y primero hacer void main int. Y a los pocos días, vamos a empezar a desmenuzar lo vacío es aquí, por qué es int junto al principal, y así sucesivamente. Pero por ahora, vamos a continuar copiar pegar eso. Voy a declarar una cadena denominada s. Y voy a volver de GetString cualquier el usuario teclea. Esto va a ser un simple programa, no hay instrucciones, Yo sólo voy a ciegas esperar que el usuario conoce qué hacer para que sea sencillo. Y ahora voy a tener un bucle. Y dentro de mi bucle estoy va a tener int i en cero. Y i es, de nuevo, sólo una convención, una variable de índice para el recuento, pero yo podría llamar a esto lo que yo quiera. Yo voy a hacer i es inferior a: así El nombre de Zamyla es de seis letras. Así que voy a duro código que hay por ahora. Y luego i ++. Y ahora en el interior de éstos rizado llaves voy a hacer printf, y quiero imprimir una carácter a la vez. Así que voy a usar% c para Quizá por primera vez. Y luego quiero imprimir cada personaje en su propia línea. Así que me voy a poner un pequeña barra invertida n allí. Cerrar cotización. Y ahora quiero hacer algo aquí. Quiero imprimir el letra específica en la cadena, s, ya que estoy iteración de cero en un máximo de seis. En otras palabras, quiero imprimir el carácter i-ésimo de s. Ahora, ¿cómo puedo hacer esto? Pues al igual que las cajas en esta representación aquí, clase de, evocar la noción de boxeo letras, se puede hacer de manera similar que sintácticamente en C simplemente especificando, Quiero imprimir s del i-ésimo carácter. El uso de los corchetes en el teclado de su computadora que en un teclado de Estados Unidos son generalmente por encima de la tecla de retorno. Así que esto no es del todo correcto sin embargo, como te habrás dado cuenta. Pero yo voy a clase de forjar a ciegas aquí. Y yo voy a hacer que la cadena 0. Pero antes de hacer esto, vamos a ver si nos no pueden anticipar algunos errores comunes. ¿Esto va a compilar? No, me estoy perdiendo un montón de cosas. Bibliotecas oí. Así que archivos de cabecera podría yo desear agregar aquí? Sí. AUDIENCIA: Es necesario E / S estándar [inaudible] DAVID J. MALAN: Excelente. Así que necesito E / S estándar. Para qué propósito hacer Quiero estándar de E / S? Para printf. Así incluir stdio.h. Y también se propone que incluyo la biblioteca CS50 por qué razón? Para tener cuerdas. Así que ya veremos lo que La biblioteca del CS50 está haciendo para crear esta noción de una cadena. Pero por ahora, sólo puede pensar en él como un tipo de datos real. Así que parece ser un poco de limpiado. Y ahora voy a seguir adelante y, de hecho hacer hacer cadena de 0. Compilado. Así que eso es bueno. Así ./string0 dejarme el zoom de forma que podamos ver más de cerca lo que está pasando. Intro. Z-A-M-Y-L-A entrar. Y hemos impreso a nombre de Zamyla. Así que eso es bastante bueno. Así que ahora vamos a seguir adelante y ejecutar este programa de nuevo, y escriba el nombre completo del cabo Daven. Sorpresa, sorpresa. Intro. Hmm. No hemos impreso Daven de Nombre completo correctamente. Ahora bien, esto debería ser obvio en Retrospect debido a lo que, clase de, decisión de diseño estúpido? Sí, yo no modificable la seis interior de mi bucle. Ahora que lo hice sólo porque Sabía el nombre de Zamyla que iba a ser de seis letras. Pero seguramente esto no es una solución general. Así que resulta que podemos dinámicamente averiguar la longitud de una cadena llamando a una función llamada strlen. Una vez más, deliberadamente sucintamente llamado simplemente para que sea más cómodo para escribir. Pero eso es sinónimo de obtener la longitud de una cadena. Voy a volver a mi terminal ventana y volver a ejecutar el compilador. Pero ha gritarme. Implícitamente se declara la función de biblioteca strlen con tipo unsigned int const-- Estoy perdido. Completamente. Así, especialmente como su ojos comienzan a vidriosos con mensajes de error como este, el enfoque Sinceramente, en las primeras palabras. Sabemos que el problema está en línea 8, tal como se indica aquí. Y es en la cadena de 0.c. Implícitamente declarar función de biblioteca strlen. Así que en general se va a ser un patrón de mensajes de error. Implícitamente declarar algo. Así que en resumen, ¿qué tengo yo parecía han hecho con respecto a la línea 8, aquí. ¿Cuál podría ser la solución sea aún si usted nunca ha usado strlen a ti mismo? AUDIENCIA: Parte de una biblioteca diferente? DAVID J. MALAN: Parte de una biblioteca diferente. Así se declara, por así decirlo. Se menciona en algún archivo aparte de stdio.h y CS50.h. Ahora, ¿dónde se define? Para ser honesto, que o bien tiene que apenas saber esto de la parte superior de su cabeza, o busca en Google esto y lo averigüe. O que esto, que he abierto en el CS50 Appliance el programa de terminal, que es sólo la versión grande de pantalla completa de lo que hay en la parte inferior de la ventana de gedit. Y resulta que hay una comando similar sucinta, llamado hombre de manual, en la que si se escribe en el nombre de una función y pulse Enter, que pondremos bastante documentación arcano. Es sólo que el texto general se ve un poco de algo como esto. Es un poco abrumador a primera vista. Pero, francamente, me voy a dejar que mis ojos se ponen vidriosos y sólo se centran en la parte Me preocupo por el momento. ¿Qué es esto. ¿Qué se ve estructuralmente como algo que estoy familiarizado. De hecho, la página de manual, por lo que a hablar, le dirá en lo que encabezado presentar una función como strlen se define. Así que me voy a volver ahora a gedit. Y yo voy a seguir adelante y añadir aquí #include y guarde el archivo. Voy a limpiar la pantalla con Control de L Si usted ha estado preguntando. Y yo voy a hacer volver a ejecutar string.0, compila este momento. ./string.0 Zamyla. Eso pareció funcionar Déjame ir adelante y volver a ejecutarlo con Davenport. Intro. Y eso, también, parecía funcionar. Así podemos hacer un poco mejor que esto, sin embargo, podemos empezar a cosas ordenadas hasta sólo un poco. Y yo voy a realidad introducir otra cosa ahora. Voy a seguir adelante y guardar esto en un archivo diferente. Y yo voy a llamar este archivo string1.c sólo para ser coherente con el código podrás encontrar en línea. Y vamos a concentrarnos en el exactamente el mismo código. Resulta que tengo sido una especie de toma de por sentado el hecho de que mi portátil, y, a su vez, el aparato CS50 tiene una gran cantidad de memoria, una gran cantidad de RAM, una gran cantidad de bytes de espacio en la que puedo almacenar cadenas. Pero la realidad si me escribió largo suficientes y bastantes golpes de teclado, Pude en tipo teoría en más caracteres de mi equipo tiene memoria para físicamente. Y esto es problemático. Al igual que un int sólo puede contar tan alto, en teoría, sólo se puede meter tantos personajes en la memoria RAM del ordenador o al azar Memoria de Acceso. Así que mejor que había anticipar este problema, incluso aunque podría ser una rara caso de la esquina, por así decirlo. No sucede muy a menudo, podría suceder. Y si sucede y no lo hago anticipar y programa para ello, mi programa podía hacer quién sabe qué. Congelar, cuelgue, reinicio, lo que sea. Algo anticipado que podría suceder. Así que lo que voy a hacer Ahora, a partir de ahora de verdad, es antes de que yo ciegamente utilizar una variable como s que se le ha asignado el valor de retorno de alguna otra función como getString, Voy a asegurarse que su valor es válido. Así que sé sólo de haber leído Documentación del CS50 para getString, que en última instancia le vamos a señalar a, que getString devuelve un símbolo especial llamada NULL, N-U-L-L en toda tapas, si algo sale mal. Así que normalmente, se devuelve una cadena. Pero por lo demás si devuelve N-U-L-L-- que con el tiempo vemos lo que realmente significa: Eso sólo significa algo malo ha pasado. Ahora bien, esto significa que, al igual que en Scratch, Puedo comprobar una condición aquí en C, si s no es igual a NULL. Así que si no has visto esto antes, esto sólo significa no es igual. Así que es lo contrario de iguales iguales, que, recuerdan, es diferente de solo iguales, que es la asignación. Así que si s no es igual a NULL, sólo entonces Quiero ejecutar estas líneas de código. Así, en otras palabras, antes de sumergirme ciegamente y comenzar la iteración más de s, y tratarla como si es una secuencia de personajes, voy a comprobar en primer lugar, espere un minuto, es definitivamente no igual a este valor especial NULL? Porque si lo es, las cosas malas pueden suceder. Y por ahora, asumir que las cosas malas sucediendo significa que su programa se bloquea, y no se puede necesariamente recuperarse. Así que, francamente, parece más feo. Es un poco confuso ahora echar un vistazo a. Pero esto se hará más familiarizarse en poco tiempo. Pero yo voy a proponer ahora otra mejora. Eso es una mejora a la corrección. Mi programa es ahora más correcta, porque en el raro caso de que no hay suficiente memoria existe, voy a manejarlo, y yo voy a hacer nada. Yo por lo menos no voy a estrellar. Pero vamos a hacer una versión final aquí. Y un archivo llamado string2.c. Voy a pegar ese mismo código para un momento, y yo voy a poner de relieve este línea, 11, aquí, sólo por un momento. Ahora la realidad es que los compiladores inteligentes Clang como podría arreglar esto para nosotros detrás de las escenas sin nuestro saber nunca. Pero vamos a pensar en este fundamentalmente como un diseño problemática. Esta línea de código es, por supuesto, diciendo: inicializar una variable i en 0. Eso es bastante sencillo. Y lo nuevo es este declaración, aquí, i ++, haciendo? Lo hemos visto antes, pero en realidad no hablar de ello. AUDIENCIA: Incremento i. DAVID J. MALAN: i Incremento. Así que en cada iteración a través este bucle, cada ciclo, usted está incrementando i por uno. Por lo tanto, se hace más grande y más grande, y grande hasta que el bucle termina. ¿Cómo termina? Bueno hay este medio condición que hemos usado antes. Usted ha visto y en Tutoriales en el conjunto P. Pero, ¿qué es esta palabra? Haga lo siguiente bucle lo siempre y cuando i es menor que lo que? AUDIENCIA: La longitud de la cadena. DAVID J. MALAN: La longitud de la cadena. Por lo tanto, se traduce bastante limpiamente de Inglés en ese sentido. Ahora el problema es que cada vez que iterar a través de este bucle en teoría, Estoy haciendo esta pregunta. Soy yo menos de la longitud de la cadena de s? Soy yo menos de la longitud de la cadena de s? Ahora soy yo cambiando en cada iteración? Lo es. Debido a la ++. Así que cada iteración i es cada vez más grande. Pero es s cada vez más grande, o más pequeño, o cambiar en absoluto? No. Así que en términos de diseño, uno de los ejes a lo largo de la cual tratamos de evaluar código en la clase, esto se siente un poco estúpido. Al igual que usted es, literalmente, en cada iteración de este bucle pidiendo al misma maldita pregunta de nuevo, y otra vez, y otra vez, y, literalmente, nunca va a cambiar. Por lo menos si no estoy tocando s y tratando de cambiar el contenido de s. Así que me puedo hacer un poco mejor que esto. Y lo que voy a hacer no es declarar sólo una variable i, pero una segunda variable voy arbitrariamente, pero convencionalmente, llamarlo n. Asignar n igual a la longitud de la cadena de s. Y luego aquí, voy a hacer un poco de optimización inteligente, por lo que para hablar, que al final del día no más correcta o no menos correcta es que antes. Pero es un mejor diseño. En el hecho de que estoy usando menos tiempo, menos ciclos de CPU, por lo que de hablar, de responder a la misma pregunta, pero sólo una vez. ¿Tiene preguntas sobre este general principio de mejora, decir, la eficiencia de un programa? ¿Sí? AUDIENCIA: ¿Por qué utilizar el [inaudible]? DAVID J. MALAN: Buena pregunta. Entonces, ¿por qué ponemos la ++ en el extremo del i en lugar del comienzo de la i? En este caso, tiene ningún impacto funcional. Y, en general, tiendo a utilizar el operador de sufijo por lo que es un poco más claro para cuando la operación está sucediendo. Para aquellos no familiarizados, hay otro declaraciones por lo que usted podría hacer ++ i. Estos son funcionalmente equivalente en este caso porque no hay nada más alrededor de ese incrementación. Pero uno se puede topar con casos y líneas de código en el que eso hace la diferencia. Así que en general, no lo hacemos incluso hablar de éste. Porque, francamente, que hace que su código más sexy, y una especie de chubasquero, y menos caracteres. Pero la realidad es que es mucho más difícil, Creo que, incluso para mí que envuelvo mi mente alrededor de ella a veces, el orden de las operaciones. Así como un aparte, si Realmente no me gusta esto, a pesar de que esto es un poco sexy buscando, también puede hacer i + = 1, que es la versión más feo de la misma idea de incrementación postfix. Digo esto y usted debe burlarse de él, pero se llega a ver el código como algo hermoso en poco tiempo. [Risas] DAVID J. MALAN: ¿Verdad? Sí. Pregunta en el centro. AUDIENCIA: ¿Es necesario decir int n? DAVID J. MALAN: Haces No necesito decir int n. Así pues ya hemos dicho int, que no es necesario volver a decirlo. El problema es que n tiene que ser del mismo tipo de datos como i. Así que eso es simplemente una comodidad aquí. Sí. AUDIENCIA: ¿Se puede ir por el Soporte de caracteres de impresión s i de nuevo? DAVID J. MALAN: Absolutamente. Así% c, recordar de pasada tiempo, es sólo un marcador de posición. Significa poner un char aquí. n barra invertida, por supuesto, sólo medios poner un salto de línea aquí. Así que simplemente se va, ahora, esta pieza de la nueva sintaxis. Y esto está diciendo literalmente, agarrar la cadena llamada s y ve a buscar a su carácter i'th, por así decirlo. Y sigo diciendo carácter i'th porque en cada iteración de este bucle es como si estamos imprimiendo , en primer lugar s soporte 0, como programador podría decir. Entonces S soporte 1, a continuación, s el soporte 2, a continuación, 3, a continuación, 4. Pero por supuesto que es una variable, así que sólo lo expreso con i. Clave, sin embargo, es darse cuenta, sobre todo si no tienes sido aclimatarse a este mundo de la programación, en la que todos parecen contar desde cero, tengo que empezar a contar desde cero ahora. Porque las cadenas, primer carácter, el z en Zamyla es para bien o para mal va a vivir en el lugar número cero. Muy bien, así que vamos a traerme nosotros volver aquí para Zamyla y ver lo que realmente está pasando en debajo de la capucha. Así que hay esta noción de la conversión de tipos. Es posible que tenga realidad jugado con esto ya, tal vez por el hacker edición de P de un conjunto. Pero la conversión de tipos sólo se refiere a la capacidad en C y otros lenguajes para convertir un tipo de datos a otro. Ahora ¿cómo podemos ver esta bastante sin rodeos? Así que esto, el recuerdo, es el comienzo del alfabeto Inglés. Y el contexto, hay que recordar, de como hace una semana es ASCII. El Código Estándar Americano para Intercambio de Información. Lo cual es sólo un camino muy largo de decir un mapeo de las cartas a los números y de números a letras. Así A través de M aquí, punto punto puntos, líneas con, recordar, el número decimal 65 en adelante. Y no hablamos sobre esto de manera explícita, pero seguramente hay similares los números correspondientes a las letras minúsculas. Y de hecho, los hay. El mundo decidió algunos años Hace poco que una minúscula con va a ser 97. Y poco b va ser 98, y así sucesivamente. Y para cualquier otra tecla en su teclado, no hay va a ser un patrón similar de bits. O equivalentemente, un número decimal. Así que la pregunta que nos ocupa, entonces, es ¿cómo podemos ver realmente esta debajo de la capucha? Así que voy a ir a gedit nuevo. Y en vez de escribir éste a partir de cero, Voy a seguir adelante y Sólo tiene que abrir algo desde el código de hoy llamado ASCII cero. Y ASCII cero se parece a esto. Así que vamos a envolver nuestras mentes en torno a esto. Así que primero, yo he comentado el código, que es agradable. Debido a que es, literalmente, me dice qué esperar, mostrar una asignación para las letras en mayúsculas. Ahora, yo no sé muy bien lo que decir con eso, así que vamos a deducir. En Inglés, tal vez poco techie Inglés, lo que hace la línea 18 aparece a hacer por nosotros? Sólo la línea 18. ¿Cómo es la inducción? ¿Qué se va a poner en marcha aquí? AUDIENCIA: Un bucle. DAVID J. MALAN: un bucle. ¿Y cuántas veces es que va a repetir? AUDIENCIA: [interponiendo VOCES] seis veces. DAVID J. MALAN: no seis veces. AUDIENCIA: 26 veces. DAVID J. MALAN: 26 veces. Sí, lo siento. 26 veces. ¿Por qué? Bueno, es un poco raro, pero He empezado a contar desde el 65. Lo que es raro, pero no está mal. No está mal por la opinión. Y yo estoy haciendo que sólo porque, para este ejemplo, Soy una especie de anticipar que el capital A era 65. Ahora bien, este no es el más elegante manera de hacer esto, que tipo de código duro valores esotéricos que nadie se espera que cada vez que hay que recordar. Pero por ahora, noto que estoy hacer esto a través de 65 más 26. Porque al parecer yo no quiero ni para hacer la aritmética en mi cabeza. Así que voy a dejar que el compilador lo haga. Pero entonces en cada bucle, cada iteración del bucle, estoy incrementando i. Así que ahora esto parece un poco críptico. Pero debemos tener el edificio básico bloques con los que entienden esto. % C es sólo un marcador de posición para un char. % I es un marcador de posición para un int. Y resulta que el uso de este nueva sintaxis, este paréntesis, por lo hablar, por lo que un tipo de datos dentro de un paréntesis, Puedo obligar al compilador para tratar i no es un entero, sino como un char. De esta manera me muestra el carácter equivalente de ese número. Ahora aquí, este código es casi idéntica. Yo sólo quería hacer súper explícito el hecho de que estoy empezando a los 97, que es minúscula. En el para arriba a través de 26 cartas más. Y estoy haciendo-- de nuevo, fundición i, por así decirlo. O la conversión de tipos i, por así decirlo. Desde un int a un char. Así que el resultado final va a ser, francamente, la información que ya sabemos. Yo voy a hacer ascii-0 no dot-- dot c. Aviso, usted probablemente ha hecho que error, ya que acabo de hacer accidentalmente. Hacer ascii-0. Ahora me voy a hacer ./ascii-0. Voy a acercar, y por desgracia que va a desplazarse fuera de la pantalla. Pero vemos toda una tabla donde un mapas a 97, b mapas a 98, y si nos desplazamos hasta más A, por supuesto, se correlaciona con 65. Así que esto es sólo para decir que lo que hemos estado predicando, existe esta equivalencia, se de hecho, el caso en la realidad. Así que una modificación rápida de este. Permítanme abro ascii-1.c. Y note este listo, especie de, la aclaración de esto. Esto es ascii-1.c, y cuenta de esta locura. Y esto realmente llega al corazón de lo que los ordenadores están haciendo. A pesar de que nosotros los humanos lo haría No contar en términos de letters-- No me pongo a pensar, bien una continuación, b, y usarlos para contar objetos físicos. Por supuesto que puede decir que yo quiero inicializar una variable llamada c-- pero podría haber llamado a este algo-- así c se inicializa al capital A. Debido a que al final del día, el ordenador no importa lo que usted está almacenando, sólo le importa cómo desea para presentar esa información. ¿Cómo quiere que la computadora interpretar que el patrón de bits? Así que esto no es algo que sería generalmente recomendaría hacerlo. No deja de ser un ejemplo para transmitir que se puede absolutamente inicializar un entero a un char. Debido a que por debajo de la capó de un char, por supuesto, es sólo un número del 0 al 255. Por lo que puede sin duda lo puso dentro de un int. Y lo que esto también demuestra que se puede convertir de un tipo a otro, aquí, en última instancia, la impresión de la misma cosa. Y de hecho, esto me va a arreglar online-- fue querido decir esto, de nuevo, aquí. Déjame limpiar esto en línea, y vamos a ver en un tutorial en línea, según sea necesario, lo que se pretendía allí. Okay. Así que ayer por ejemplo que actualmente participan A y B, y luego vamos a tomar las cosas a un nivel superior. Así que con A y B, y c de en la capitalización y la equivalencia de los mismos, vamos a echar un vistazo a este ejemplo, aquí. Otro ejemplo de código. Abriremos uno que sea ya hecha, por lo que no tener que escribirla todo desde cero. Y fíjense en previsión estamos usando encabezado múltiple archivos, entre los que se nuestro nuevo amigo, string.h. Ahora esto se parece, a primera vista, un poco críptico. Pero vamos a ver si no podemos razonar a través de lo que está pasando aquí. En primer lugar me da una cadena del usuario, y puse esa cadena en una variable llamados s. Copiar pegar desde antes. En la línea 22, estoy aparentemente haciendo exactamente lo Yo lo hice hace un momento, estoy iteración sobre los personajes de s. Y los nuevos trucos aquí están utilizando longitud de la cadena, la optimización de menor importancia de almacenar la longitud de la cadena en n, En lugar de llamar strlen nuevo, y otra vez, y otra vez. Y comprobando que i es menor que n. Ahora aquí, las cosas se ponen un poco interesante. Pero es sólo una aplicación de esta misma idea nueva. Lo que en Inglés hace s soporte i representan? AUDIENCIA: Contando cada carácter [inaudible]. DAVID J. MALAN: Contando cada personaje. Y aún más sucinta, s soporte i representan qué? ¿Diría usted. Para no poner en el punto aquí. AUDIENCIA: Bueno-- DAVID J. MALAN: Así que si la palabra es-- si la cadena es Zamyla, que starts-- AUDIENCIA: --usted tratar con los personajes en forma separada: DAVID J. MALAN: Good. Exactamente. La notación de corchetes que permite acceder a cada carácter individual, por lo s soporte 0 va a ser la primer carácter en la cadena. s soporte 1 va a ser la segunda, y así sucesivamente. Así que la pregunta que estoy haciendo, aquí, en esta condición es lo que? Es el carácter de orden i de s mayor o igual a minúsculas una? ¿Y qué significa esto, aquí, con los símbolos de unión dobles? AUDIENCIA (JUNTOS): Y. DAVID J. MALAN: Y. Es sólo equivalente a este. Y no es una palabra clave en C, usted tiene que uso, molesto, signo ampersand. Y esto, por el contrario, está pidiendo es s del i-ésimo carácter menores o iguales a minúsculas z? Y una vez más, aquí es donde la comprensión de la subyacente implementación de un ordenador tiene sentido. Tenga en cuenta que, a pesar de que tengo el punto punto punto allí, se parece a la aa la z en minúsculas se todos los valores contiguos hasta de 97 en adelante. Y lo mismo para mayúsculas a partir de las 65. Así que la comida para llevar, entonces, es que en Inglés, ¿cómo describiría lo que la línea 24 está haciendo? ¿Sí? AUDIENCIA: El 24 está comprobando si cada personaje es una minúscula. DAVID J. MALAN: Se comprobar si cada carácter es una letra minúscula. Así que, incluso de forma más sucinta, es el carácter i-ésimo de s minúscula? Eso es todo lo que estamos expresar aquí lógicamente, un poco críptico, pero en última instancia, muy francamente. Es s de i'th minúsculas personaje? Si es así, y aquí es donde las cosas conseguir un poco alucinante por un momento, si es así, vaya por delante e imprimir un carácter. Así que esto es sólo un marcador de posición, pero, ¿qué personaje? ¿Por qué hago s soporte de i menos esta expresión aquí? Bueno notar el patrón aquí. Los números reales no importan tanto. Pero observe que 97 es a qué distancia de 65? AUDIENCIA: 32. DAVID J. MALAN: 32. ¿Qué tan lejos es 98 de 66? AUDIENCIA: 32. DAVID J. MALAN: Poco c de C grande? 32. Así que hay 32 saltos de una letra a otra. Así que, francamente, yo, podía simplificar este a eso. Pero entonces estoy un poco difícil de codificación Este bajo nivel de comprensión que ningún lector está siempre va a entender. Así que voy a generalizar como yo conocer las letras minúsculas son más grandes. Sé que las letras mayúsculas son valores más pequeños, irónicamente. Pero esto es efectivamente equivalente a diciendo restar 32 del s soporte de i. Así, en el contexto de estos cartas, si la carta pasa a ser una minúscula a, y le resto 32, ¿qué efecto tiene eso, matemáticamente, en minúscula? AUDIENCIA: Capitalizes-- DAVID J. MALAN: mayúscula ella. Y de hecho, esta es la razón por la programa se llama capitalizar cero. Este programa ya sea capitaliza una carta, después de comprobar si se trata de hecho una letra minúscula. De lo contrario, en la línea 30, ¿qué hago si que no es una letra minúscula que soy mirando a una determinada iteración en el bucle. Sólo imprimirlo. Así que no cambiar las cosas eso ni siquiera es minúscula. Restringirse a poco a poco a través de z. Ahora bien, esto es bastante arcano. Pero al final del día, esta es la forma en que, érase una vez, tenido que implementar cosas. Si en vez abierta con mayúscula uno, gracias oh dios. Hay una función llamados a superior que puede hacer todo lo que acabamos de hacer a un nivel bastante bajo. Ahora a parte superior es interesante porque se ha declarado en un archivo, y usted sólo saber esto mediante la comprobación de la documentación, o que me digan, por ejemplo, en la clase, donde existe, en un archivo llamado ctype.h. Así que este es otro nuevo amigo nuestro. Y lo hace superior exactamente lo que su nombre sugiere. Puede pasar, como un argumento, entre estos paréntesis, un poco de carácter. Voy a pasar en el carácter i'th de s usando nuestra nueva notación de lujo que implica corchetes. Y tomar una conjetura, lo que es el retorno valor de al superior parecer va a ser? Una letra mayúscula. Una letra mayúscula. Así que si paso en minúscula, con suerte, por definición de a superior, que va a devolver un mayúscula A. De lo contrario, si no es una letra minúscula en primer lugar, acabo de imprimirlo. Y, en efecto, observe el segundo amigo aquí. No sólo para la parte superior existe, pero es menor, lo que en realidad responde a esa pregunta para mí. Ahora quien escribió estas cosas, 10s de hace años, ¿sabes qué? Implementado a superior y es reducir el uso de código como este. Pero, de nuevo, de acuerdo con esta idea de abstraer de distancia, más o menos, el nivel más bajo detalles de implementación. Y de pie sobre los hombros de la gente que vinieron antes que nosotros, el uso de funciones como a superior y es más baja, lo que suficiente maravillosamente están muy bien llamado para decir lo que hacen, es un paradigma maravilloso para adoptar. Ahora, resulta que si leo la página de manual para, por ejemplo, para la parte superior, Aprendo algo más. Así que el hombre toUpper. Es un poco abrumador. Pero aviso, así es que la mención de el archivo de cabecera que debo utilizar. Como acotación al margen, ya que este es engañosa, la función utiliza enteros en lugar de caracteres por razones de comprobación de errores. Pero tal vez vendremos de nuevo a que en el futuro. Pero fíjate, aquí, a los conversos superiores la letra c a mayúsculas si es posible. Así que eso es bastante sencillo. Y ahora vamos a ser un poco más específico. Echemos un vistazo a la parte de la Página hombre bajo valor de retorno. El valor devuelto es que de la carta convertido. O c, si la conversión no era posible, donde c es la entrada original. ¿Qué sé de aquí, de el argumento de que al superior. Entonces, ¿qué es la comida para llevar de esta? El valor devuelto es que de la carta convertido, o c, la carta original, si la conversión no era posible. ¿Qué mejoras puedo, por tanto, hacer que el diseño de mi código? ¿Sí? AUDIENCIA: Usted puede quitar la cosa. DAVID J. MALAN: puedo eliminar la sentencia else, y no sólo la sentencia else. AUDIENCIA: Usted puede eliminar [inaudible]. DAVID J. MALAN: puedo eliminar todo el tenedor en el camino, el caso más en conjunto. Así que de hecho, déjame abrir la versión final de este, capitalizar-2 y notar cómo, si usted, sexy, el código es ahora conseguir, en que he reducido de algunos siete más o menos líneas a sólo cuatro, la funcionalidad que tenía la intención simplemente llamando a la superior, pasando en s soporte i, y la impresión a cabo, con el marcador de posición% c, ese personaje en particular. Ahora podría decirse que hay un error, o por lo menos el riesgo de un error, en este programa. Así que para volver a una comida para llevar antes, ¿qué debo hacer, probablemente, también en este programa para que sea más robusta, de manera que no hay forma de que pueda estrellarse, incluso en casos raros? AUDIENCIA: Asegúrese de que no es NULL. DAVID J. MALAN: Asegúrese de que no es NULL. Así que en realidad, para hacer esta súper adecuada, que debería hacer algo parecido, si s no es NULL, seguir adelante y ejecutar estas líneas de código, que Puedo entonces guión así, y luego poner en mi llave de cierre. Así que bueno atar juntas de las dos ideas. ¿Sí? AUDIENCIA: ¿Podrías usar un bucle Do While, en su lugar? DAVID J. MALAN: ¿Podría Hago un do while? AUDIENCIA: --usted quiero asegurarme que en realidad [inaudible]. DAVID J. MALAN: ¿Podría utiliza un do rato? Respuesta corta, no. Debido a que usted está a punto de introducir otro caso esquina. Si la cadena es de longitud cero. Si, por ejemplo, me acaba de golpear Introduzca, sin nunca escribir Zamyla. Voy a entregar una copia de un real cadena, como veremos con el tiempo vemos, que tiene cero caracteres. Todavía es una cadena, es sólo súper corto. Pero si utiliza un do tiempo, vas a ciegas tratar de hacer algo con respetar a esa cadena, y nada va a estar allí. AUDIENCIA: Bueno, si lo has hecho hacer [inaudible] mientras s-- DAVID J. MALAN: Oh, ya veo, sigo Obtención de una cadena del usuario. Así que la respuesta corta, que podría, y mantener la lata que te den una cadena que es lo suficientemente corto como para caber en la memoria. Absolutamente. Yo opté por no hacerlo. Si ellos no me dan la cadena I quiera, yo voy a dejar, me voy a rendir. Pero absolutamente, para ese propósito, usted puede absolutamente hacer eso. Así que los archivos de cabecera de la biblioteca que ahora estamos familiarizados con son estos, aquí. E / S estándar, CS50.h, string.h, ctype.h, y hay, de hecho, otros. Algunos de ustedes han descubierto la biblioteca de matemáticas en math.h. Pero permítame que le presente, ahora, a este recurso que el personal CS50, Davin, y Rob, y Gabe particular, han puesto juntas. Eso pronto enlazar en la página web del curso. Se llama CS50 referencia. ¿Qué acaba de darle una rápida sabor de la misma, funciona como sigue. Déjame ir a reference.cs50.net. Usted verá en la mano izquierda lado una lista abrumadora de las funciones que vienen con c. Pero si me importa, por el momento, sobre algo como strlen, Me puede escribir allí. Se filtra la lista simplemente lo que me importa. Voy a hacer clic en él. Y ahora a la izquierda, verás lo que esperamos es una más sencilla, humana amable explicación de cómo esta función trabaja. Devuelve la longitud de una cadena. He aquí un resumen, así es como usted utilizarlo en términos del archivo de cabecera, y en términos de lo que la función parece que en términos de sus argumentos. Y entonces aquí, devoluciones la longitud de una cadena. Pero para aquellos de ustedes más cómodo, en realidad se puede hacer clic más cómoda, y el contenido de este página, ahora, va a cambiar siendo los valores por defecto de lo se obtiene mediante el uso de la página de manual. En otras palabras, CS50 de referencia es una simplificación de hombre páginas por el personal, para los estudiantes. En particular, los menos cómodo y en el medio, de modo que usted no tienen que tratar de envolver su mente alrededor, francamente, una sintaxis bastante críptico y documentación en algún momento. Así que tenlo en cuenta en los días por venir. Así que aquí, de nuevo, es un Zamyla. Ahora vamos a hacer una pregunta que es un poco más humana accesible. Gracias a Chang, que ha estado imprimir más elefantes sin parar durante los últimos días. Tenemos una oportunidad de dar al menos uno de ellos de distancia. Si pudiéramos conseguir apenas un voluntario venir en un máximo de dibujar en la pantalla. ¿Y aquí? Vamos arriba. Cuál es tu nombre? ALEX: Alex. DAVID J. MALAN: Alex. Bien. Alex, vamos arriba. Estamos a punto de ver su escritura a mano en la pantalla aquí. Muy bien, encantado de conocerte. ALEX: Niza que usted cumple. DAVID J. MALAN: Muy bien. Así, el ejercicio super simple. Bar no es alto para conseguir un elefante hoy. Está jugando el papel de getString. Y yo voy a simplemente decirle la cadena que te has puesto. Y supongamos que, getString, han sido llamados. Y el ser humano, como yo, tiene escrito en Zamyla, Z-A-M-Y-L-A. Sólo tienes que ir adelante y escribir Zamyla en el pantalla como si usted ha conseguido y se almacena en algún lugar de la memoria. Dejando espacio para lo que será varios otra palabras-- eso está bien, sigue adelante. [Risas] Así Zamyla, Excelente. Así que ahora suponga que, getString, son llamados de nuevo. Y por lo tanto, doy que, en el teclado, con otro nombre, Belinda. Bien. Y ahora, la próxima vez es getString llamada, escribo en algo así como Gabe, G-A-B-E. Realmente estás tomando al corazón de la memoria de acceso aleatorio. ¿Qué es el dibujo todo completamente al azar. Okay. [Risas] ALEX: Lo siento mi letra es mala. DAVID J. MALAN: No, eso está bien. Y ¿qué hay de Rob, R-O-B. Okay. Bueno. Así que no te lo iba a anticipar tipo de sentar las cosas de esta manera. Pero podemos hacer que esto funcione. Entonces, ¿cómo fue el proceso de colocación estos caracteres en la memoria? En otras palabras, si pensamos en esta pantalla negro rectangular como representación de un RAM, o memoria de la computadora. Y recuerda que la memoria RAM es sólo un montón de bytes, y bytes son un montón de bits. Y bits son de alguna manera implementado, generalmente con alguna forma de electricidad en hardware. Así que es una especie de la estratificación que hemos hablado y ahora se puede dar por sentado. ¿Cómo fue el proceso de decidir dónde escribir Rob frente Gabe frente Belinda frente Zamyla? ALEX: Yo sólo lo hizo en el pide que me dijiste. DAVID J. MALAN: Y eso es cierto. Pero lo que rige donde pones El nombre de Belinda y el nombre de Gabe? ALEX: ¿Nada? DAVID J. MALAN: [Risas] Para que funcione, eso está bien. Así que las computadoras son poco más ordenado que eso. Y así, cuando nos quedamos allí implement-- por sólo un moment-- cuando en realidad aplicar algo así GetString en una computadora, Zamyla podría ser establecido más o menos como lo hizo en la pantalla, no. Y lo que es clave para notar aquí, lo que Alex hizo, es que hay una especie de demarcación entre cada una de estas palabras, ¿verdad? No escribiste Z-A-Y-M-L-A-B-E-L-I-N-D-A-G-A-B-- en otras palabras, hay una especie de demarcación que parece ser, clase de, el espaciamiento aleatorio entre estas diversas palabras. Pero eso es bueno, porque nosotros, los humanos pueden ahora visualizar que estos son cuatro cuerdas diferentes. No es sólo una secuencia de de lotes de caracteres. Así que una computadora, entonces, por su parte, podría tener una cadena como Zamyla, poner cada una de esas letras dentro de un byte de memoria. Pero ese número es mucho más grande, por supuesto, de seis caracteres. Hay un montón de RAM. Y así en adelante, este rejilla de cajas va para representar lo que Alex acaba no aquí en la pantalla. Y ahora, Alex, le podemos ofrecer una azul o un elefante naranja de Chang. ALEX: me quedo con un elefante azul. DAVID J. MALAN: Un elefante azul. Así que un gran aplauso, si pudiéramos, para Alex aquí. [Aplausos] ALEX: Gracias. DAVID J. MALAN: Gracias. Así que la comida para llevar es que, aunque el patrón de tipo de cambió con el tiempo, aquí en el tablero, había un demarcación entre las diversas cadenas que Alex tiene para nosotros. Ahora las computadoras, francamente, podría hacer lo mismo. Podrían tipo de plop cadenas en cualquier lugar en la memoria RAM. Hasta aquí, por aquí, aquí abajo, aquí abajo. Ellos podrían hacer exactamente eso. Pero, por supuesto, eso es probablemente no la mejor planificación. ¿Cierto? Si me solicitaron a Alex Obtenga los nombres, probablemente él había poner un poco más por aquí, tal vez hasta aquí, por aquí, por aquí, con el tiempo por aquí. Pero con un poco más de planificación, sin duda, podríamos poner las cosas de forma más limpia. Y de hecho, eso es lo que hace un ordenador. Pero el problema es que si la siguiente cadena obtengo después de Zamyla es algo como el Belinda, proponer donde podríamos escribir la letra B con respecto a esta rejilla? ¿Dónde te gustaría ir? A la derecha de la una, por debajo de la z, por debajo de la A? ¿Cuáles serían sus primeros instintos? AUDIENCIA: Por debajo de la z. DAVID J. MALAN: Así que por debajo de la z. Y eso es bastante sencillo, ¿verdad? Es una especie de limpia, que es lo que hacemos en un teclado cuando pulsa enter, o un correo electrónico al realizar una lista con viñetas de las cosas. Pero la realidad es que las computadoras tratar de ser más eficiente, y meter sin duda lo más datos en la memoria RAM como sea posible, de modo que usted no pierda ningún bytes. Así que no pierdas cualquier espacio de la pantalla. Y el problema, sin embargo, es que cuando la ponemos literalmente la carta b después de una, ¿cómo vamos a saber dónde termina el nombre de Zamyla y comienza el nombre del Belinda? Así que los seres humanos que acaba de proponer, así, pulsa la tecla Intro, esencialmente. Póngalo abajo. O como hizo Alex, simplemente comenzar a escribir el siguiente nombre debajo de la anterior, y por debajo de aquél, y a continuación, por debajo de aquél. Eso es una señal visual. Las computadoras tienen otra señal visual, pero es un poco más conciso. Es este carácter cobarde. Backslash 0, lo que es tal vez una reminiscencia de la barra invertida n, y así sucesivamente, ahora. Las secuencias de escape especiales. Backslash 0 es la manera de en representación de ocho bits cero consecutivos. 0000 0000. La forma de expresar que no es golpear el número cero en el teclado, porque en hecho de que es un Char ASCII. Se ve como un número, pero es en realidad un número decimal que representa la circular glifo, el tipo de letra circular. Mientras tanto, la barra invertida cero significa, literalmente, poner ocho cero bytes aquí para mí. Así que esto es algo arbitrario. Podríamos haber utilizado cualquier patrón de bits, pero el mundo decidido algunos años hace, que para representar al final de una cadena en la memoria, sólo hay que poner un montón de ceros. Porque podemos detectar eso. Ahora que significa que ninguna carta de la alfabeto puede ser representado con ceros. Pero eso está bien, ya hemos visto que estamos usando 65 en hasta en el 97 en adelante. Nosotros no llegaremos a ninguna parte cerca de todos los ceros. Así Belinda en la memoria de una computadora es en realidad va a ir aquí. He dibujado en amarillo justo para llamar nuestra atención. Y fíjense, también, esta es completamente arbitraria. He dibujado como una cuadrícula. Al igual, la memoria RAM es sólo un objeto físico. No necesariamente tiene filas y columnas, per se. Es sólo tiene un montón de bytes implementado en hardware de alguna manera. Pero si después de Belinda I escrito en nombre de Gabe, él va a terminar aquí en la memoria, y si he escrito en nombre de Daven, por ejemplo, que va a terminar aquí. Y puedo seguir escribir incluso más nombres. Por desgracia, si trato de escriba un nombre de súper larga, Yo podría finalmente quedarse sin memoria. En cuyo caso, es getString va a devolver NULL, como hemos dicho. Pero, por suerte, al menos en este visual aquí, no llegamos tan lejos. Ahora lo que es interesante es que esta idea general de tratar las cosas como es en cajas representante de una característica de C y una gran cantidad de idiomas, conocida como una matriz. Una matriz es otro tipo de datos. Es una estructura de datos, si se quiere. Estructura en el sentido de que realmente, clase de, el aspecto de un cuadro, por lo menos en el ojo de tu mente. Una matriz es un contiguo secuencia de tipos de datos idénticos, espalda con espalda a espalda con espalda. Así que una cadena, en otra Es decir, es una serie de caracteres. Un conjunto de caracteres. Pero resulta que usted puede tener arrays de racimos de cosas. De hecho, podemos poner incluso números en una matriz. Así que la forma en la que vamos a empezar declarar estos datos estructura conocida como una matriz También se va a utilizar corchetes. Pero estos corchetes van a tener un significado diferente en este contexto. Y vamos a ver de la siguiente manera. Supongamos que yo abrí un nuevo archivo aquí. Y puedo guardar esto como ages.c. Y voy a guardar esto en mi carpeta de aquí. Y ahora voy a seguir adelante y empezar a escribir algo como incluir CS50.h, incluir stdio.h, int void main. Y luego dentro de aquí, quiero tener primero un int llamada edad. Y yo voy a usar eso para conseguir un int del usuario para su edad. Pero este programa está destinado a ser utilizado por varias personas, por cualquier contexto. Tengo una fila de personas. Todos ellos tienen que escribir en su edad para tal vez un poco, no sé, concurso o evento que han llegado a. Así que la próxima persona, me necesitar otra variable. Porque si acabo de hacer edad se getInt, eso es va a darle una paliza, o sobrescribir edad de la persona anterior. Así que eso no es bueno. Así que mi primer instinto podría ser, oh, está bien, si quiero obtener varias de las personas ages-- vamos a llamar esta edad1, int age2 consigue int, int edad3 consigue getInt. Y ahora voy a usar algún código pseudocódigo aquí. Hacer algo con esos números. Dejaremos para otro día lo que estamos haciendo allí, porque sólo cuidar por el momento sobre la edad1, age2, edad3. Desafortunadamente, una vez que compilar este programa y lo puso delante de los usuarios reales, ¿cuál es el mal diseño fundamentalmente decisión me parece que han hecho? ¿Sí? AUDIENCIA: [inaudible] DAVID J. MALAN: Sí, Ni siquiera he intentado averiguar cómo muchas edades Cómo puedo realmente importa? Si tengo menos de tres personas aquí, y por lo tanto menos de tres años de edad, Todavía estoy esperando a ciegas tres. Dios no lo quiera cuatro personas se presentan. Mi programa no será incluso apoyarlos. Y por lo que este, larga historia resumen, no es un buen hábito. ¿Cierto? Yo estaba copiando esencialmente y pegar el código y sólo se pellizcan los nombres de las variables. Y, por Dios, si lo hubieras hecho, no tres las edades, pero 10 o 100, o incluso 6500 estudiantes universitarios, por ejemplo. Esto no va a ser particularmente Código elegante, o sostenible. Vas a tener que reescribir el programa cada vez que el número de personas cambia. Así que gracias a Dios, en nuestra actual archivo ages.c por hoy, tenemos una solución más inteligente. En primer lugar, voy a pedir prestado el Construimos hemos usado un par de veces, este bucle Do While, con el fin de conseguir el número de personas en la habitación. Yo sólo voy a molestar al usuario, una vez más y otra vez, hasta que él o ella me da un valor de n que es un entero positivo. Yo podría haber utilizado, último tiempo a llegar int positivo. Pero no tenemos que de verdad, así que me fui por delante y volver en práctica esta idea. Ahora aquí, este es el nuevo truco. En la línea 27, como los comentarios en la línea 26 indica, declarar una matriz en la que para almacenar la edad de cada uno. Así que si usted desea conseguir, no un int, no dos enteros, pero un montón de enteros. Específicamente n números enteros, eran n pueden ser de tres, podría ser 100, podría ser 1000. La sintaxis, simplemente, es que por ejemplo, ¿qué tipo de datos es lo que quieres? ¿Qué es lo que desea llamar que parte de la memoria? ¿Qué quieres que llamar a la rejilla que se parece a esto pictóricamente? Y entre paréntesis aquí, usted dice lo grande que desea que la matriz sea. Y así antes, cuando dije que la sintaxis es un poco diferente aquí, todavía estamos utilizando corchetes, pero cuando estoy declarando una matriz, el número dentro de la corchetes medios qué tan grande quieres la matriz sea. Por el contrario, cuando utilizamos s soporte de i hace un momento, s, una cadena, es de hecho una serie de caracteres, pero cuando no se está declarando una variable, Al igual que con esta palabra clave aquí, simplemente está recibiendo un índice específico, una específica elemento de esa matriz. Una vez que sepamos eso, el resto de esto es sencillo. Si nuevo que estoy primero va a imprimir ¿cuál es la edad de la persona número i. Cuando acabo de decir la persona número uno, persona número dos, la persona número tres. Y yo sólo estoy haciendo aritmética, de modo que las personas normales como, contamos desde uno para este programa, y ​​no desde cero. Entonces yo llamo getint, pero guardo la respuesta en edades ménsula. Que es la edad i-ésimo de la matriz. Así, mientras que la última vez que estábamos tratando estas cajas como caracteres para el nombre de Zamyla, y otros. Ahora, estas cajas representan 32 bits, o cuatro bytes en el que podemos almacenar un int, int, int. Todo lo cual, de nuevo, son el mismo tipo de datos. Ahora hago algo tonto, como pasa el tiempo, sólo para justificar la redacción de este programa. Y luego aquí abajo, volví a iterar sobre la matriz diciendo aquí a un año, persona número uno voluntad ser algo años. Y al darse cuenta de que math-- Quiero decir, esto no es muy complicado arithmetic-- Acabo de añadir uno a su edad. Sólo para demostrar, de nuevo, esta. Así como yo puede indexar en una cadena, s, así que puede indexar I en una variedad de edades, como que hay. Entonces, ¿dónde es este va a estar tomando nosotros? Así que vamos a ver, en última instancia, un pocas cosas en los días por venir. Uno, todo este tiempo, cuando escribir sus propios programas, como Mario, codicioso, el crédito. Usted ha estado escribiendo el nombre de el programa y oprimir la tecla Enter. Y a continuación, obtener la entrada del usuario. Con getString, getInt, getLongLong, o similares. Pero resulta que los soportes C algo que se llama la línea de comandos argumentos, que nos va a permitir conseguir realmente las palabras que escribe, en el indicador parpadea, después el nombre de su programa. Así que en los días por venir, podría escribir algo como César, o el número 13, a partir de entonces ./caesar. Vamos a ver cómo funciona. Debido a que de hecho, en problema fijó dos, estamos va a presentarle a un poco de algo reminiscencia de Ralphie de desafiar a principios de la cartografía. El arte de la codificación de la información. Esto, de hecho, es muy reminiscencia de lo que Ralphie hizo. Este es un ejemplo de un cifrado algoritmo llamado rot13, R-O-T 13. ¿Qué significa simplemente gire la letras en el alfabeto 13 lugares. Y si lo hace, verá ahora lo que es, tal vez, una frase familiar. Pero la forma en que vamos a utilizar esto, en última instancia, es más general. En P puesto dos, en la edición estándar, usted implementa un par de cifras, uno llamado César, uno llamado Vigenére. Ambos son de rotación cifras, en que de alguna manera convertir una letra en una letra diferente. Y César es super simple. Para agregar una, se agrega 13, o un número de hasta 26. Vigenére hace que en una base por carta. Así Vigenére, como se verá en la especificación, es más seguro. Pero al final del día lo que usted estará implementando y P establece dos, es esa llave que se utiliza tanto para el cifrado y el descifrado. En relación con el proceso de convertir texto plano, algún mensaje original, en texto cifrado, que es algo cifrada. Y luego descifrar de nuevo. En la edición de hackers, Mientras tanto, podrás encargado de algo similar en espíritu, en donde le daremos un archivo, desde un Linux típico, o Mac o Unix ordenador llamado etsy contraseña, que contiene un conjunto montón de nombres de usuario y contraseñas. Y esas contraseñas tienen todo ha cifrado o hash, por así decirlo, más adecuadamente como se verá en la especificación. Y la edición de hackers desafiará que con la toma de una entrada como esta, y agrietamiento de la contraseña. Es decir, averiguar lo que la la contraseña del humano en realidad era. Porque, de hecho, las contraseñas son generalmente no se almacenan en el claro, y generalmente contraseñas debe ser difícil de adivinar. Eso no es a menudo el caso. Y lo que yo pensaba que haríamos es concluir con un par de minutos mirada a un particular mala elección de contraseñas de una película se puede recordar con cariño. Y si no, usted debe alquilar. [REPRODUCCIÓN DE VÍDEO] -Casco, Usted demonio, ¿qué está pasando? ¿Qué estás haciendo con mi hija? Me -Permit para introducir el cirujano plástico brillante y joven, El doctor Phillip Schlotkin. El hombre más grande de la nariz en el todo el universo y Beverly Hills. -Tu Alteza. Trabajo -Nose? No entiendo. Ella ya ha tenido una cirugía de nariz. Era su dulce 16 presentes. No, no es lo que piensas. Es mucho, mucho peor. Si no me das la combinación para el escudo de aire, Schlotkin médico le dará a su hija de vuelta a su antigua nariz. - [Suspiros] nooooooooooooo. ¿De dónde sacaste eso? -Todos Derecha. Te diré, te lo diré. No, papá, no. No debes hacerlo. -Eres Derecho querida. Voy a extrañar su nueva nariz. Pero no voy a decirles la combinación no importa qué. -muy Bien. Médico Schlotkin, hacer lo que quieras. Placer -Mi. -nô! Espera, espera. Te lo diré. Te lo diré. Lo sabía iba a funcionar. Muy bien, dámelo. -El Combinación es uno. -Uno. -Uno. -Dos. -Dos. -Dos. -Tres. -Tres. -Tres. -Cuatro. -Cuatro. -Cuatro. -Cinco. -Cinco. -Cinco. -SO La combinación es uno, dos, tres, cuatro, cinco. Esa es la combinación más estúpida Yo nunca escuché en mi vida. Ese es el tipo de cosa que un idiota tendría en su equipaje. Usted -Gracias, su alteza. [CLICS REMOTO] Qué hiciste? -I Apagó la pared. No, no lo hiciste, te apagado toda la película. Debe haber -I presionó el botón equivocado. Bueno, poner de nuevo en! Coloque la película en su sitio! Sí, señor! Sí, señor. -Vamos, Arnold. Venga, Gretchen. Por supuesto que sé que voy a tener que cobrarle por este. Bueno? ¿Funcionó? ¿Dónde está el rey? -Es Trabajadas, señor, tener la combinación. -Gran. Ahora podemos tomar hasta el último aliento de aire fresco desde el planeta Druidia. ¿Cuál es la combinación? Ona, dos, tres, cuatro, cinco. Ona, 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 el combinación en mi equipaje. [PUERTA DE CLAUSURA DE SONIDO] [CLINK DE PUERTAS QUE GOLPEA EL CASCO] -Ahh. [FIN REPRODUCCIÓN DE VÍDEO] DAVID J. MALAN: Eso es todo por CS50, nos vemos la próxima semana. NARRADOR: Y ahora, Deep Pensamientos, por Daven Farnham. Daven FARNHAM: Codificación en C es mucho más difícil de arañazos. printf, Scratch era una mentira. [FRASE DEL HUMOR]