DAVID MALAN: Muy bien. Así que este es CS50, y esto es ahora el inicio de la semana tres. Así que, hasta ahora, no tenemos estado escribiendo programas en C esa mirada un poco algo como esto aquí. Así que tenemos un par de agudo incluye en la parte superior. Tenemos int, principal, nula, y entonces hay algo que hacer en el centro, algún fragmento de código dentro de esa función. Pero clave ha sido el hecho de que que hemos estado diciendo vacío aquí. Así vacío, todo este tiempo, especifica que este programa, cuando se ejecuta, sólo se puede ejecutar a través de su nombre. No se puede escribir cualquier otra palabra o números después del nombre del programa cuando ejecutarlo. Así, por ejemplo, si el programa eran compilado en un archivo llamado hola, usted podría hacer ./hola, pero eso es todo. La única manera que usted podría aportaciones a este programa es llamando a una función. Por ejemplo, ¿qué función hemos estado utilizando hasta ahora para obtener la entrada del usuario? AUDIENCIA: Obtener cadena. DAVID MALAN: Para obtener la secuencia, o conseguir int, o has visto a otros, incluso si usted no los ha utilizado todavía, como conseguir mucho, mucho y similares. Pero supongamos que realmente desee comenzar escribir programas que son poco más versátil, y, francamente, un poco más al igual que los comandos que usted ha estado recibiendo, con suerte, un poco acostumbrado. Como cd espacio Dropbox. Esto, por supuesto, los cambios su directorio, asumiendo estás en la casa de John Harvard directorio, a su carpeta de Dropbox. Mientras tanto, un comando como este crea un nuevo directorio llamado PSet2, ya que es posible que tenga o pronto para fijar un problema de dos. Hacer Hola, por supuesto, es un comando que construye un programa que se llama hola desde un archivo denominado hola punto c. Y en cada uno de estos casos, ahora, hemos tenido proporcionar un argumento en la llamada línea de comandos, el símbolo parpadea, para que haga lo que sabe construir, y así que mkdir sabe qué carpeta para crear, y por lo que sabe cd donde desea ir. Pero hasta ahora, seguimos diciendo que la principal, su función por defecto, tiene una expresión nula dentro de esos paréntesis, lo que significa que no puede tener ningún argumento. Así que a partir de hoy, lo que vamos a hacer Es decir, vamos a empezar apoyo a este tipo de cosas, incluso. De hecho, en este caso, que se no suelen escribir manualmente, Hacer que ha estado haciendo esto para nosotros, no hay uno, sino uno, dos, tres adicionales cuerdas después del programa de llamada sonido metálico. Entonces, ¿cómo lo logramos? Bueno, a partir de hoy, en los casos en los que queremos para proporcionar entrada a través de la la llamada línea de comandos, vamos a empezar a añadir aquí lo que está en Yellow-- sustitución de vacío con comas int argc cadena argv corchete abierto corchete de cierre. Ahora esto es interesante por un par de razones. Uno, que va a dejar que nos escribimos programas que son un poco más dinámico. Pero, más convincente, que va a abrir ahora una conversación sobre qué arreglos puede realmente ser utilizado, por lo que una cadena realmente está debajo del capó, hasta la próxima semana cuando comenzamos el buceo aún más profundo en cuanto a cómo la máquina está haciendo todo este trabajo cosas. Pero por ahora, vamos a dibujar, tal vez, una imagen. Cuando se escribe un programa con principal declarada de esta manera, tal que la principal toma dos argumentos, un int y-- qué tipo de datos es el segundo argumento? AUDIENCIA: Array. DAVID MALAN: Array. Así que parece a primera vista como si fuera un cadena, pero observe los corchetes. Recuerde la última vez que introdujimos la noción de una matriz. Y matrices utilizan corchetes en un par de contextos. Es posible utilizar la plaza soportes para ir en una matriz y obtener un elemento en particular, como Soporte de 0 o 1 o soporte de montaje 2. Pero vimos, aunque brevemente, la semana pasada que también utilizar estos corchetes a declarar el tamaño de una matriz, si usted sabe de antemano cuántos enteros o cuántas cuerdas o lo que usted realmente quieren. Así que resulta que hay tercera contexto aquí que no tiene número en su interior de los corchetes. Cuando se especifique, como lo he hecho aquí, el nombre de algo así como argv, que es sólo una forma elegante de diciendo argumento vector, que es otra forma elegante de diciendo una serie de argumentos, corchete abierto corchete de cierre sólo significa que usted no lo hace necesariamente saber de antemano lo grande la matriz va a ser, pero usted sabe que va a ser una matriz. Así que si usted no sabe la número no lo pongas ahí, para abrir el paréntesis corchete de cierre significa que argv no es una cadena, pero una matriz de cadenas. Así sintácticamente, si pensar de nuevo la semana pasada, es muy similar a decir algo así como int edades soporte abierto, y luego algo después. Entonces, ¿qué se parece esto? Vamos a realmente hacer un dibujo. Así que cuando se ejecuta este programa con Principal habiendo dos argumentos definida en el interior de esos paréntesis, se esencialmente tener al menos dos trozos de la memoria entregada a usted debajo de la capucha. Uno, como voy dibuja como este rectángulo, se va a llamar argc. Y así como un resumen rápido, ¿cuál es el tipo de datos de argc? Así que es un int. Así que un número se va ir por turnos argc-- que representa el recuento argumento. Mientras tanto, he dibujado argv como una matriz. Y yo no lo sé cuánto tiempo va a ser, así que para los propósitos de hoy dot dot dot. Puede ser que consiga de cierta extensión. Pero me he imaginado aquí al menos cuatro rectángulos. Así argv un trozo de memoria que almacena cadena cadena cadena dot dot dot, y argc es sólo un trozo de memoria para un entero. Así que ahora, vamos a ser un poco más precisos. Si, cuando tengo cuerdas en esta matriz, llamado argv, quiero llegar a ellos de forma individual, al igual que la semana pasada, vamos a utilizar la notación como argv soporte 0 para conseguir lo primero una matriz. Argv soporte 1 para obtener el Lo segundo, y así sucesivamente. La clave aquí es que estamos todavía 0 indexed-- todavía estamos contando desde 0. Así que ahora vamos a realidad poner algo en esto. Si tuviera que compilar un programa llamado hola desde un archivo denominado hola punto c, y luego ejecuto ese programa con el punto slash hola, lo que hace mi equipo, mi laptop, ver como debajo de la capucha el momento me encuentro dot slash hola y pulsa intro? Bueno, este es tal vez lo que podríamos describir como el contenido de la computadora de memoria, o memoria de acceso aleatorio RAM--. En otras palabras, el ordenador, de alguna manera para que por arte de magia, pone el número 1 en argc, AKA argcount, y pone literalmente la cadena ./hola en argv soporte 0. No tengo ni idea, la verdad, lo que es en el soporte argv 1 o 2 o 3, ya que si el usuario no tiene escrito nada, además ./hola, vamos a suponer que estos son valores más probables de basura, por así decirlo. Esos fragmentos de memoria existe, pero no depende de nosotros mirarlos, porque la argcount es único. Ahora, por su parte, si escribir ejecutar otro programa, cd, que es más adecuadamente un comando, en su parpadear espacio cd prompt-- Dropbox-- cuando corro que, efectivamente, cuando se ejecuta el programa de cd, argc, dentro de la memoria de mi computadora, es para el más breve segundo el número 2. Y luego argv soporte o tiene cd, soporte argv 1 tiene Dropbox, y luego, por supuesto, el comando completa, por lo que todo esto de memoria esencialmente se va y se utiliza para otra cosa. Y es por eso que digo sólo una fracción de segundo. Mientras tanto, si hacemos PSet2 mkdir, la imagen se ve casi lo mismo, pero con diferentes cuerdas dentro argv. Si lo hago tablero clang hola hola punto c, la misma idea. Más cosas se rellena para argv y argc, por supuesto, es 4. Así, en otras palabras, a pesar de que esta matriz podría dot dot dot, de alguna longitud variable, por así decirlo, que siempre sabe dónde está el final de la misma es, porque argc va a decir usted en qué punto usted tiene que parar mirando a los elementos en argv. Usted sólo puede mirar a las cuatro En total en este caso. Así que ahora vamos a echar un vistazo a, tal vez, un programa simple. Uno que sólo dice hola para alguien como Zamyla. Así que yo reclamo que voy a escribir un programa en un momento a través de la que yo podía hacer ./hola espacio Zamyla, y luego quiero mi programa para imprimir algo super-simple como "hola, Zamyla." Ahora bien, en el pasado hemos usado getString. Así que en el pasado, incluso si usted es nuevo en la programación, las probabilidades son que usted podría preparar una programa que utiliza getString y luego utiliza printf saludar a Zamyla. Pero no usemos GetString este momento. Déjame en lugar de entrar en la Appliant y no incluir estándar I O dot h. Permítanme también incluyo CS50 punto h. Ahora int main, y ahora estoy no va a hacer vacío en la actualidad. En su lugar, voy a hacer int argc argv cadena corchete abierto corchete de cierre, sin especificar un número. Y ahora aquí está mi llamado a hacer. ¿Qué voy a hacer ahora es que estoy vamos a hacer un poco de un salto de la fe, Voy a asumir que el usuario de va a utilizar este programa correctamente, y simplemente voy a hacer printf hola,% sn. Así que nada nuevo allí. Pero quiero ahora poner cualquier palabra del usuario escribe después del nombre del programa. Así que si lo hago ./hola espacio Zamyla, I desee alguna manera el acceso mediante programación comillas "Zamyla." así que puede entrar en mi argumento vector, mi matriz de cadenas, y si el comando, de nuevo, era ./hola espacio Zamyla, qué número es lo que quiero para poner en argv aquí? AUDIENCIA: 1. DAVID MALAN: 1, porque Soporte de 0 resulta va a ser la El nombre del programa, como vimos. Así soporte 1 es la primera palabra que yo, el usuario, ha escrito. Voy a seguir adelante y salvar a este. Voy a ir a mi carpeta donde he puesto este archivo. Yo voy a hacer que hola 3. OK Comp IO. ./hola Zamyla Intro. ¿Qué hice mal? Estaba atrapado por sorpresa a mí mismo por un momento allí. ¿Qué hice mal? AUDIENCIA: Nombre. DAVID MALAN: El archivo de en realidad se llama hello3.c. Y lo hice sólo para consistencia, porque hemos tenido de hola.c en el pasado en el código en línea. Así que vamos a arreglar este ./hola soporte de tablero 3 Zamyla. Intro. Y ahora tenemos hola, Zamyla. Mientras tanto, puedo cambiar esto a ser Rob, o en realidad cualquier otra palabra. Pero vamos a considerar un caso esquina. ¿Qué podría esperar que sucederá si Yo no escribo el nombre de nadie en absoluto? AUDIENCIA: Error. DAVID MALAN: un error de algún tipo, tal vez. Vamos a ver. Intro. Null. Así printf es ser realmente un poco de protección de nosotros aquí, y literalmente la impresión paren abiertas null, pero las cosas aún peores pueden suceder. Y sólo para demostrar algo que absolutamente no debe hacer, vamos a ir en aquí y empezar a jugar. ¿Cierto? Si yo sé que la imagen de memoria es esencialmente esto, argv soporte 1 tiene Zamyla, argv soporte tiene 0 ./hola, o ./hola-3. Lo que está en el soporte 2? Así que puedo responder a esa cuestionarme, ¿verdad? Yo sólo puedo cambiar el 1 a un 2. Ahora puedo volver a compilar hola 3, ./hello3 Vamos a acercar y pulsa enter. ¡Vaya. Sin comillas. Interesante. Así que es una especie de fresco a ver qué más hay por aquí. Entonces, ¿qué más hay en el interior de mi portátil? Salvemos con soporte 3. Hacer hello3, ./hola-3. Curioso. Y ahora vamos a llegar realmente bold-- 50. Así que eso es realmente buceo profundo en la memoria de mi computadora. 50 índices en. Así que hola 3 ./hola-3. Curioso. Muy bien, ahora estoy solo va a conseguir imprudente. Vayamos a 5000. Bien. Así que permítanme recompilar. Hacer hello3, ./hola-3. Okay. Ahora algunos de ustedes, no podría ser una bombilla de apagarse. ¿Cuántos de ustedes tienen visto este mensaje antes? Okay. Así que, ¿por qué? Probabilidades son-- y hay diferentes cosas que pueden causar este, y es evidente que está en buena company-- tenemos claramente causado lo que se llama un fallo de segmentación. Y cuento largo por hoy, han tocado un segmento de memoria que no debería tener. Cuando un segmento que sólo significa un trozo de la memoria que no debería tener. Ahora, el equipo garantiza que si yo ejecutar ./helloZamyla que puedo tocar argv ser soporte 0 y argv soporte 1. Pero argc es el valor 2, que significa que soy sólo allowed-- es una especie de honor system-- a tocar soporte 0 y el soporte 1. Si voy más lejos, hay absolutamente va a ser la memoria allí. Mi RAM existe físicamente en el ordenador. Pero, ¿quién sabe lo que hay allí? De hecho, me estoy quedando múltiple programas al mismo tiempo. Yo podría haber seen-- si yo no estuviera haciendo esto en el Appliant pero en mi Mac o PC-- que podría tener visto el contenido de un correo electrónico. Yo podría haber visto un instante mensaje que he enviado recientemente. Cualquier cosa que pueda ser persistente alrededor en la memoria podría haber sido visitada por medio de esta arbitraria notación de corchetes. O, peor aún, es posible que tenga encontrado uno de mis contraseñas que yo escribí recientemente en que un programa había almacenado en la memoria con el fin de me autenticar y entonces sólo un poco dejado en la memoria RAM hasta que dejé de ese programa. Y de hecho, esta es una de el peligro y uno de los poderes de la utilización de un lenguaje como C. Usted tiene acceso sin restricciones a la totalidad de los contenidos de la memoria de un programa, y lo que los chicos malos pueden incluso hacer en esos casos-- sobre todo cuando nos llegar a la programación web hacia el final del semestre, vamos a revisar este topic-- se saca alrededor, potencialmente, a alguien es la computadora de memoria y encontrar cosas tan curiosas como vimos allí. O lo que es peor aún, las contraseñas que se o ella puede entonces utilizar para hacer cosas malas. Así que está claro que no debería haber hecho esto, porque las cosas extrañas comienzan a suceder. De hecho, este es un programa de estrellarse. Esto sería el equivalente de Mac OS o Windows una ventana de programa simplemente desaparecer. Se ha producido un error inesperado. En el entorno de línea de comandos vemos algo como esto. Pero es por eso, es que estoy simplemente tocando memoria que no me pertenece. Así que vamos a defender en contra de este un poco de una manera diferente examinado este programa aquí. Así, de nuevo, el esqueleto que vimos antes les hablé y yo he destacado esta vez int. Y todo este tiempo principal tiene efectivamente devuelto un valor. A pesar de que en la mayor parte de nuestra conferencia ejemplos que hemos ni una sola vez utilizamos devolver nada en main. Sólo escribimos printf cerca corchete y eso es todo. Pero de forma gratuita, lo que la compilador estado haciendo por ti, efectivamente, regresa 0 para usted. Activa salir-- y que es un poco counterintuitive-- que 0 es buena. Esto no significa falsa per se. 0 es bueno, y cualquiera que no sea 0 valor, el mundo ha decidido, puede significar un error. Así que si alguna vez ha ensuciado algo en su equipo, o un programa acaba de morir en usted y usted ha conseguido alguna ventana errónea en la pantalla, error que dice negativo 49 o error 23-- algunos value-- aparentemente arbitrario que es debido a que un programador ha modificable un valor negativo como 49 o positivo 23 para representar cualquier número, me atrevo a decir, de 4 mil millones de cosas posibles que podría ir mal en un programa. Entonces, ¿cómo podría yo tomar ventaja de esto yo mismo? Bueno, déjame abro un programa que escribí con antelación, y hurgar en línea llamado hola 4. Y es casi idéntico, excepto que Su conseguido un poco de comprobación de errores. En este caso, he declarado de nuevo principal como tomar dos argumentos, pero esta vez, en la línea 17, la notificación Estoy haciendo un poco de una comprobación de validez. Me estoy asegurando de que argc es igual es igual a 2. Porque si lo es, que significa que puede de manera segura tocar no sólo el soporte 0, pero el soporte 1. Y sigo adelante e imprimir, en este caso, Zamyla o Rob o cualquier palabra que he escrito fuera. Y ahora acaba de llegar un poco más adecuada, Me voy a volver de forma explícita 0 para significar que todo está bien. Nada malo sucedió. Pero por convención, que voy a devuelve 1, o francamente cualquier valor que no sea 0, si algo salió mal. Ahora el usuario no va a realmente cuenta de lo que está pasando. De hecho si entro en este directorio, nos acercamos y qué hacemos hola 4, ./hola-4 Zamyla comporta como espero. Pero si en cambio no lo escribo nada, nada parece suceder, pero que no se desplome. Y si en lugar de hacer algo como Rob es un supervisor en el intercambio de Thayer-- información arbitraria. Pero aviso, argv 1, 2, 3, 4, y 5 Ahora debe existir en la memoria. Eso, también, no lo es mi programa de espera, porque yo he comprobado si argc es igual a los iguales 2 o no. Así que ahora estoy defendiendo en contra de este. Ahora, en un aparte, que la programmer-- o más bien que la users-- Nunca vemos que 0 o 1, pero utilizando un herramienta denominada depurador, u otras herramientas, como veremos antes de largo, que el programador en realidad puede ver lo que podría ser va mal dentro de su programa. Así, cualquier pregunta sobre argc? Sí. AUDIENCIA: He visto donde no han tenido el carácter, [inaudible] acaba de decir estrella cadena d, como carácter coma asterisco. ¿Son equivalentes aquí? DAVID MALAN: Son. Así que la pregunta es, usted tiene programas de vez en cuando se ven como este que no lo hacen decir soporte argv cadena pero en lugar de decir algo como soporte de carbón argv estrellas. Y hay incluso otra variantes que se pueden ver. De hecho, son equivalentes. Por ahora, tenemos estos tipo de ruedas de entrenamiento en la forma de cadena en el CS50 biblioteca, pero en poco más de una semana o por lo que vamos a eliminar esa obstrucción por completo y, de hecho mirar lo que el carbón y la estrella son, y cómo aquellos se refieren a la memoria representación más general. Así que vamos a volver a eso. Otras preguntas sobre nuestra argv o argc? Sí. AUDIENCIA: ¿Por qué volver un error [inaudible]? DAVID MALAN: ¿Por qué lo hizo devolverá un error only-- oh! En el caso anterior, cuando fueron pelearse un poco con la memoria, ¿por qué sólo se devuelve un error cuando realmente escribí un gran número? Respuesta corta es, tuvimos suerte. En términos generales, un ordenador asigna memoria en trozos, y me dio un trozo bastante grande que Me alejé, sin ser notado, de tocar el soporte 2, soporte 3, soporte de 50, pero en cuanto me empujé mi suerte, me fue más allá de la límites de la cantidad de memoria el sistema operativo me había dado. Y fue entonces cuando se tomado medidas drásticas y dijo no. Segmentación de error. Sí. AUDIENCIA: ¿Cómo funciona el ordenador conocer el valor de argc? DAVID MALAN: ¿Cómo funciona el equipo sabe el valor de argc? Cuando se ejecuta un programa, ese programa, por la naturaleza de la petición de parpadear, se le pasa el conjunto de palabras que fueron tecleadas en el indicador, que fue tecleado en el prompt. Y lo que es su funcionamiento sistema que esencialmente rellena los argumentos de los principales para usted. Así que ese es uno de los servicios que usted consigue, más o menos en secreto debajo de la capucha de un sistema operativo. ¿Otras preguntas? Sí. AUDIENCIA: ¿Qué significa volcado de memoria? DAVID MALAN: ¿Qué significa volcado de memoria? Así que esa es una buena pregunta. Y déjame volver a este directorio aquí. Y te darás cuenta de que Tengo un archivo nuevo allí. Ha hecho llama núcleo, y es en realidad suele ser un archivo de tamaño decente. Eso es esencialmente una instantánea de el contenido de la memoria de mi programa o RAM cuando se estrelló. Y esto será útil, potencialmente, diagnóstica, una vez que se habla en una conferencia futura y la sección acerca de la depuración, porque en realidad se puede hacer lo equivalente a una autopsia digitales en ese archivo para ayudar a determinar lo que hizo mal en su programa. Sí. AUDIENCIA: ¿Es argc un comando en en sí, o puede usted nombrar que nada? DAVID MALAN: Buena pregunta. Es argc un comando en sí mismo, o puedes llamarlo algo? Definitivamente no es un comando. Se trata simplemente de una variable de nombre o el nombre de un argumento, y tan absolutamente que podría llamar a este foo, podríamos llamar a este bar, que tienden ser el go-a las palabras que una computadora científico va. Pero por convención, utilizamos argc y argv. Pero eso es sólo un ser humano convención, nada más. Bien. Así resulta, he estado contando un poco de un lie-- blanco y francamente, en el futuro, usted verá hemos estado diciendo a otras mentiras piadosas. Pero por ahora, vamos para pelar uno de estos. En este caso aquí cuando previamente corrió un programa como ./hola o ./hola-3 Zamyla, tuvimos el contenido de mi la memoria de la computadora buscando más o menos igual esto. Pero recordemos lo que una cadena es. ¿Qué dijimos hace una semana lo que un cadena en realidad está debajo del capó? AUDIENCIA: Arsenal de caracteres. DAVID MALAN: Es una matriz de caracteres, ¿no? Así que puede ser que tengamos una serie de cadenas, pero, a su vez, una cadena es una serie de caracteres. Así que si yo realmente quiero ser anal cuando dibujo esta imagen, Realmente debería estar dibujando un poco de la misma familia, por lo que en cada uno de estos índices de mi matriz argv, no es en sí mismo una cadena completa que sí está en una matriz. Y ahora la mentira blanca le estamos diciendo hoy es que la imagen no mirar como este. De hecho, las pequeñas plazas son normalmente fuera de los grandes rectángulos Ya está. Pero vamos a volver a que en poco tiempo. Pero esto es ./hola barra invertida 0, que siendo el carácter especial que demarca el final de una cadena, y tenemos otro después El nombre de Zamyla. Así que ¿qué significa esto? Bueno, déjame ir adelante y abrir otras dos ejemplos que están disponibles en línea. Uno se llama argv1.c y el otro es argv2. Es un programa súper simple que es diferente de los programas anteriores en que ahora estoy usando argc y argv aquí. Y ahora me estoy integrando con un bucle for en la línea 18, desde i = 0 en un máximo de argc. Y ¿qué voy a hacer con esta línea de código en esta lista? En Inglés. Esto demuestra obviamente uso de argc. Pero en Inglés, lo que hace que hacer si me quedo este programa? ¿Sí? AUDIENCIA: Se va a imprimir su pantalla tantas veces como quieras. DAVID MALAN: Exactamente. Así que lo que sea que palabras escriba en el indicador, es ir a regurgitar ellos me uno por línea. Así que vamos a seguir adelante y hacer esto. Déjame ir a mi directorio hacer y hacen ./argv1 argv1. Y ahora, vamos a mantenerlo simple. Vamos a hacer nada al principio. Lo hizo imprimir una cosa, y eso es de hecho el nombre del programa, porque eso es en soporte 0. Si ahora digo foo, que va a hacer los dos, y si digo foo bar, que va a decir esas tres cosas. Eso sí que es algo interesante, tal vez. Pero recordar que argv es una matriz de cadenas, pero una cadena es una serie de caracteres, para que podamos tomar las cosas a un nivel superior y aplicar ese básica lógica y hacer que el código que se ve un poco más críptico, hay que reconocerlo. Pero al tener un anidada bucle, algo parecido a lo que se puede recordar de Mario, por ejemplo, si lo hizo de esta manera. Así que ahora noto en la línea 19, que soy de nuevo la iteración en mis argumentos, desde 0 hasta en argc. Y ahora en línea 21-- estoy pedir prestado un truco de última semana-- Estoy comprobando lo que es la longitud del soporte argv i. Estoy almacenando la respuesta en el n. Y entonces estoy integrando desde j en hasta n, donde j se inicializa a 0. Así, la convención para el recuento. Una vez que hayas utilizado i, si usted tiene un bucle anidado, no se puede usar i de nuevo, de lo contrario te Clobber, potencialmente, el valor fuera del bucle interno. Así que estoy usando j por convención. Podríamos utilizar k. Si usted tiene más de k, es probable que tener demasiado de anidación, por lo general. Pero ahora, notar mi printf línea es ligeramente diferente. No estoy imprimiendo% s, estoy impresión% c, que, por supuesto, es un marcador de posición para un char. Y ahora note esta sintaxis. Nuevo. Nosotros no hemos visto antes. Pero lógicamente, esto sólo significa obtener la cadena i-ésimo en argv y obtener el jth qué? AUDIENCIA: Carácter. DAVID MALAN: Personaje en esa cadena. Así mediante el uso de corchetes seguido de corchetes, este es el buceo primero en cadenas de argv, y luego el segundo corchetes con j es sumergirse en los personajes de esa cadena en particular en argv. Y entonces, sólo por si acaso, Estoy imprimiendo una nueva línea aquí. Así que ahora me dejes ir adelante y abrir una ventana un poco más grande por lo que podemos ver esto en acción. Déjame ir a esa carpeta. Y ahora lo que argv 2-- whoops-- hacer argv-2, ./argv 2. Intro. Y es un poco difícil leer verticalmente, pero eso es de hecho el nombre de la programa, seguido por una línea en blanco. Ahora voy a seguir adelante y hacer foo. Del mismo modo difícil de leer, pero es de hecho imprimir un carácter por línea. Y si lo hago bar, ahora es impresión de los línea por línea. Así que la comida para llevar aquí no es tanto que, wow, mira este nuevo truco donde se puede obtener en los contenidos de caracteres específicos de una matriz, sino más bien cómo lo estamos teniendo estos básicos ideas como la indización en una matriz, y luego la indexación en un matriz que estaba en esa matriz, y simplemente aplicar las mismas ideas a ejemplos ligeramente más sofisticados. Pero los fundamentos realmente no tienen cambiado, incluso desde la semana pasada. Ahora bien, esto es algo puntual, en que, recordemos, en la semana cero jugamos con un libro teléfono como este. Y aunque esto es obviamente piezas físicas de papel, usted puede tipo de pensar un directorio telefónico como una matriz. Ciertamente, si usted fuera a reimplementar estas piezas estas piezas de papel en un ordenador, probablemente usted utilizaría algo como una matriz para almacenar todos los nombres y números de la A hasta el final a la Z. Así que esto es bueno, porque nos permite una oportunidad, tal vez, a considerar cómo podría realmente poner en práctica algo así. Al igual que con una serie de puertas aquí. Así que si yo could-- necesitamos uno voluntario para venir en adelante. Vamos a ver. Un rostro desconocido tal vez, cara desconocida, tal vez. ¿Qué tal en naranja? Aquí. Camisa anaranjada, vamos arriba. Vamos a seguir adelante ahora y movimiento estas puertas a un lado, moverlos fuera del camino por un momento. Cuál es tu nombre? AJAY: DAVID MALAN: Ajay. David. Encantada de conocerte. Bien. Así que tenemos detrás de estos seis puertas digitalmente en la screen-- o, mejor dicho, siete puertas en el screen-- un montón de números. Y yo le he dicho nada en advance-- acuerdo? AJAY: Nada de antemano. DAVID MALAN: Todo lo que quiero que hagas ahora es encontrar para mí, y para nosotros, Realmente, el número 50, un paso a la vez. AJAY: Número 50? DAVID MALAN: El número 50. Y usted puede revelar lo que hay detrás de cada una de estas puertas simplemente tocándola con un dedo. Maldita sea. [Risas] [Aplausos] Muy bien hecho. Okay. Tenemos un regalo precioso premio para usted aquí. Su selección de películas que discutido la semana pasada. AJAY: Oh, hombre. Oh, nunca he visto Spaceballs. DAVID MALAN: Spaceballs. Bien. Así que aguanta sólo un momento. Cómo-- hagamos que esto un moment-- enseñable cómo fue el proceso de encontrar el número 50? AJAY: Elegí al azar. DAVID MALAN: Así que usted eligió azar y tuvimos suerte. AJAY: Sí. DAVID MALAN: OK. Excelente. Así que ahora, no tenía tenido suerte, ¿qué otra cosa podría haber ocurrido detrás de estas puertas? Así que si sigo adelante y revelar estos números aquí, lo que realmente son en orden aleatorio. Y lo mejor que podría tener hecho, francamente, es por, en última instancia, en el peor de los casos, la comprobación de todos ellos. Así que tienes súper afortunado, que no es lo que llamaríamos un algoritmo. Sí, felicidades. Pero ahora let's-- humor yo, si pudiera. Vamos a ir a esta ficha aquí. Y aquí están los números en claro lo que parece ser un orden aleatorio, y que eran. Pero ahora si en lugar reclamación que detrás de estas puertas son números que se ordenan. El objetivo ahora es también nosotros encontrar el número 50. Pero hacerlo algorítmicamente, y decirnos cómo va en ello. Y si lo encuentra, se mantiene la película. Usted no lo encuentras, te lo devolveré. AJAY: Así que voy a comprobar los extremos primero, para determinar si hay-- [Risas y aplausos] DAVID MALAN: Aquí tienes. Echemos un vistazo a uno de los predecesores de Ajay, Sean, que no fue tan afortunado. Aceptar, por lo que su tarea aquí, Sean, es el siguiente. Me he escondido detrás de estos puertas del número siete, pero escondido en alguna de estas puertas así son otros números no negativos. Y su objetivo es pensar en este fila superior de los números como sólo una matriz. Estamos a sólo una secuencia de piezas de papel con números detrás de ellos. Y su objetivo es, sólo con la parte superior array aquí, me encontrar el número siete. Y estamos entonces vamos a criticar cómo se van haciendo sobre él. Encuéntrenos el número siete, por favor. No. 5, 19, 13. No es una pregunta capciosa. 1. En este punto, su puntuación no es muy bueno, para que así pueda seguir adelante. 3. Adelante. Francamente, no puedo evitar preguntarme lo que estás siquiera pensar. SEAN: Puedo tomar de sólo la fila superior. DAVID MALAN: Sólo la fila superior. Así que tienes tres izquierda. Así que encontrar 7. [EXCLAMACIONES SUGERENCIAS] Así pues, tanto de los que eran increíbles por razones muy diferentes. Así que aquí es donde nos dejamos hace un momento, y la idea clave aquí Fueron estas puertas tenían números detrás de ellos que se ordenaron, el ideal comida para llevar para el cual es que se puede hacer fundamentalmente mejor en este segundo ejemplo-- y, de hecho, eso era de Sean primer intento con números aleatorios así como antes-- pero tan pronto ya que estos números están ordenados, al igual que la guía telefónica, ¿qué se puede obviamente hacer? O ¿cómo se puede aprovechar ese conocimiento? Sí. AUDIENCIA: Usted va a medio camino [inaudible]. DAVID MALAN: Si. Exactamente. Así instinto inicial de Ajay era para comprobar los extremos, por lo que recuerdo, y luego nos tipo de acabado el ejemplo rápidamente. Pero si empezamos a hacer esto más metódicamente a lo largo de esas líneas, pero partiendo quizás en el medio, ya que están ordenados, tan pronto como nos revelamos la número 16, por lo tanto, sabes-- y vamos a hacer exactamente eso-- nos por lo tanto, saber que el 50, en el caso de hoy, tiene que ser a la derecha. Así que al igual que en la semana cero cuando rompimos la guía telefónica en la mitad y lanzó la mitad de la problema de distancia, la misma idea aquí. Podemos lanzar este medio de que el problema desaparezca. Y probablemente lo que podría hacer algorítmicamente, una vez que sabes que el 50 debe ser a la derecha, si es en cualquier lugar, es probar allí, en el medio de las puertas restantes. Por supuesto, 50 es mayor del 42, por lo que podemos tirar esto restante trimestre del problema de distancia, y, por último, identificar algo como 50. Pero al igual que con la guía telefónica, estos números se les dio a nosotros ya en forma ordenada, lo que nos deja con la pregunta, ¿cómo hacer las cosas en orden ordenados? Y, francamente, ¿a qué costo? Una cosa es ser entregó la guía telefónica y luego impresionar a tus amigos mediante la búsqueda de un número de teléfono muy rápido, ¿verdad? Rasgando 32 páginas para encontrar una persona de cada 4 mil millones de páginas, dijimos era un ejemplo extremo. Pero, ¿cuánto tiempo le tomó a Verizon para ordenar que guía telefónica? ¿Cuánto tiempo nos tomó para ordenar estos siete números? Esa es una pregunta que nos hemos hasta ahora ignorado por completo. Así que vamos a responder a esta pregunta ahora. Y todos estamos de películas ahora, pero sí tenemos algunas bolas de estrés. Si, por ejemplo, ocho voluntarios no le importaría acompañarnos hasta aquí? Vamos a seguir adelante y hacer, ¿qué tal ustedes cuatro, tres de ustedes aquí? Obtener algunas caras nuevas. Y los cuatro de ustedes allí? Y ahora-- dejar no de sesgo aquí-- y número ocho de aquí al final. Vamos arriba. Bien. Así que lo que tenemos aquí para cada uno de ustedes es un número. Si desea ir Adelante, toma este número. Cuál es tu nombre? ARTIE: Artie. DAVID MALAN: Artie, está bien. Eres el número 1. AMIN: Amin. DAVID MALAN: Amin. David. Eres el número 2. Y seguir adelante, como me entrego que las hojas de papel, alinear a vosotros mismos delante de la música se encuentra en el mismo orden como allá arriba. ANDY: Hola, Andy. DAVID MALAN: Andy, es bueno verte. Número 3. JACOB: Jacob. DAVID MALAN: Jacob, número 4. Bienvenido a bordo. GRANT: Grant. DAVID MALAN: Grant. Número 5. ALANNA: Alanna. DAVID MALAN: Alanna, número 6. FRANCES: Frances. DAVID MALAN: Frances, número 7. Y? RACHEL: Rachel. DAVID MALAN: Rachel, número 8. Bien. Vaya por delante y se consigue en este orden. Permítanme poner un remanente atril en su lugar. ¿Dónde necesita un stand? Okay. Vaya por delante y sólo hay que poner los números donde el público puede verlos en, el atril hacia afuera. Y es de esperar, nuestro primer comprobación de validez aquí-- 4, 2, 6. Oh-oh. Espera un minuto. No tenemos un 8. Necesito desalojarlo de el ejemplo de alguna manera. No. No, eso está bien. Vamos a ver. Podemos hacer esto. Colocarse. Eso es. Correcta. Bien. Así pues, ahora tenemos 8, 1, 3 7, 5. Okay. Excelente. Así que la pregunta en cuestión es, en qué costo, y por medio de qué método, podemos realmente ordenar estos números aquí para que podamos tipo de trabajo hacia atrás, en última instancia, y decide-- es realmente impresionante, ¿es realmente eficaz, que puedo dividir y conquistar una guía telefónica? ¿Es realmente eficiente que Puedo dividir y conquistar esas piezas digitales de papel en el tablero, si tal vez nos va a costar un fortuna en el tiempo o los ciclos de energía o de CPU para conseguir realmente nuestros datos en cierta forma ordenada? Así que vamos a esa pregunta. Así que para empezar, estos números son en más o menos al azar, y yo voy a proponer un algoritmo o proceso por el cual podemos clasificar estas personas. Voy a abordar esta bastante ingenuamente. Y voy a reconocer que es una especie de un montón para mí para envolver mi mente alrededor de la datos enteros establecen a la vez. Pero ¿sabes qué? Voy a hacer un poco de correcciones marginales muy simples. 4 y 2 son fuera de servicio, si el objetivo es pasar de 1 en un máximo de 8. Así que ya sabes qué? Voy a tener que chicos intercambian, si cambia físicamente y posiciones sus pedazos de papel. Ahora 4 y 6, estos son en orden. Voy a dejar a los ser. 6 y 8, los que están en orden. El ir a dejarlos ser. 8 and1, fuera de orden. Si ustedes dos no le importaría intercambio. Ahora 8 y 3, si ustedes pudieran intercambiar. 8 y 7, si ustedes pudieran intercambiar. Y 8 y 5, si ustedes pudieran intercambiar. Ahora, estoy hecho? No, obviamente no. Pero he tomado la situación mejor, ¿verdad? ¿Cuál era tu nombre, número 8? RACHEL: Rachel. DAVID MALAN: Así que Rachel tiene efectivamente burbujeaba bastante lejos, todo el camino hasta el final de mi serie de números aquí. Y así, ese problema es una especie de resolverse. Ahora, claramente, 2 todavía tiene que mover un poco, y 4 y 6 y 1. Pero me parece que han conseguido una poco más cerca de la solución. Así que vamos a aplicar este mismo heurística ingenua de nuevo. 2 y 4, en Aceptar. 4 y 6, en Aceptar. 6 y 1, mm-mm. De intercambio Let. 6 y 3, mm-mm. De intercambio Let. 6 y 7 está bien. 7 y 5, pues no. De intercambio Let. Y ahora 7 y 8. ¿Y cuál es tu nombre? FRANCES: Frances. DAVID MALAN: Frances. Así que ahora es Frances, incluso en una mejor posición, porque ahora 7 y 8 se burbujeaba correctamente hasta la cima. Así que 2 y 4, en Aceptar. 4 y 1, de intercambio de let. 4 y 3, de intercambio de let. 4 y 6, que estás bien. 6 y 5, de intercambio de let. Y ahora esos tipos son buenos. Ya casi llegamos. 2 y 1, fuera de servicio, por lo que cambiar. Y ahora déjame hacer una comprobación de validez. 2 y 3, 3 y 4, 4 y 5, 5 y 6, 6 y 7, 8. OK, así que hemos terminado. Pero ¿a qué precio me hizo ordenar estos números aquí? Bueno, ¿cuántos pasos hizo que potencialmente tomar al ordenar estas personas? Bueno, vamos a volver a esa pregunta. Pero, francamente, si tienes un poco aburrido, eso es tipo de revelador en que esto no era tal vez el algoritmo más eficiente. Y, de hecho, francamente, estoy sudando tanto más yendo y viniendo. Que no se sentía particularmente eficiente. Así que vamos a intentar algo más. Si ustedes pudieran restablecer vosotros mismos a estos ocho valores. Buen trabajo. Echemos un vistazo digitalmente, por sólo un momento antes de intentar otra cosa, a lo que acaba de suceder. Hasta aquí, estás a punto de ver una visualización de estos ocho seres humanos por el que azul y rojo barras representan los números. La más alta la barra, cuanto más grande es el número. Cuanto más corta sea la barra, cuanto menor sea el número. Y lo que vas a ver es en orden aleatorio más de ocho de ellos. Usted va a ver estas barras siendo ordenado por el mismo algoritmo, o conjunto de instrucciones, que que llamaremos de ahora en adelante especie de burbuja. Así que notar, cada segundo más o menos, dos barras se iluminan en rojo, se comparan por el ordenador. Y entonces, si la gran barra y la pequeño bar están fuera de orden, que están siendo intercambiados por mí. Ahora bien, esto es increíblemente tedioso al ver esto, sin duda, por mucho tiempo, pero note la takeaway-- grandes barras en movimiento a la derecha, pequeñas barras en movimiento a la izquierda. Vamos a abortar este proceso y acelerar este proceso ser mucho más rápido, por lo que podemos conseguir un sentido de alto nivel de lo que, de hecho, una especie de burbuja que está haciendo. De hecho, está burbujeando a la lado derecho de la lista, o la matriz, los bares más grandes. Y por el contrario, los pequeños bares son burbujear su camino hacia abajo a la izquierda, aunque a un ritmo más rápido que hicimos previamente. Por lo tanto, más difíciles de ver con los seres humanos, pero visualmente eso es precisamente lo que que estaba sucediendo. Pero vamos a tratar de una forma fundamentalmente enfoque diferente ahora. Vamos a probar un diferente algoritmo mediante el cual tenemos que chicos comienzan en estos originales posiciones, que era este orden aquí. Y vamos a seguir adelante ahora. Y yo voy a hacer algo aún más simple, ¿verdad? En retrospectiva, el intercambio de pares de nuevo y otra vez, casi un poco inteligente. Vamos a hacer las cosas aún más ingenuamente, donde si quiero clasificar a estas personas, déjame seguir buscando para el elemento más pequeño. Así que ahora mismo, 4 es el número más pequeño que he visto. Voy a recordar eso. No, 2 es mejor, y recuerdo. 1 es aún menor. 3, 7, 5. Okay. Uno-- ¿cuál es tu nombre? ARTIE: Artie. DAVID MALAN: Artie. Así, Artie, adelante. Yo voy a salir de la línea. Si pudieras volver aquí. Y tengo que hacer sitio para él. Tenemos un punto de decisión aquí. ¿Cómo podemos hacer espacio para Artie aquí al comienzo, donde el número 1 pertenece? AUDIENCIA: Shift. DAVID MALAN: OK, nos podría cambiar todo el mundo. Pero proponer una optimización. Eso se siente un poco molesto para que le pregunte a cuatro personas para mover todo el camino. ¿Qué otra cosa podía hacer? AUDIENCIA: Interruptor de ellos. DAVID MALAN: Interruptor ellos. ¿Y cuál es tu nombre? JACOB: Jacob. DAVID MALAN: Jacob, se movió. Mucho más eficiente sólo para tener Lugares de intercambio Jacob con Artie, en lugar de forzar los cuatro de estas personas, muchas gracias, a su posición correcta. Lo bueno de Artie ahora, está en su posición correcta. Vamos a hacer esto de nuevo. 2, que es el número más pequeño que he visto. 3, 7, 5. Okay. 2 es sin duda la más pequeña. No tiene que hacer ningún trabajo. Vamos a hacerlo de nuevo. 6. Más pequeño? 8. Nop. 4? Ooh. Permítanme recordar 4. 3. Que recuerde 3. 7, 5. Menor número que he visto en este paso es 3. Si vienes en adelante. ¿Dónde vamos a poner usted? ¿Y cuál es tu nombre? ALANNA: Alanna. DAVID MALAN: Alanna, estamos va a tener que desalojarlo. Pero eso es más eficiente, a apenas intercambiar dos personas, de tener varias personas en realidad eludir terminado. Ahora vamos a hacer esto de nuevo. Voy a seleccionar 4, así que vamos a cabo. ¿Y quién va a mover? Número 8, por supuesto. Si ahora me encuentro con el número 5, vamos a cabo. Número 8 va a quedar desalojado de nuevo. Ahora me voy a encontrar el número 6 en su lugar. 7 en su lugar. 8 en su lugar. Lo que acabamos de hacer ahora es algo que se llama ordenamiento por selección, y si visualizamos esto, es va a sentir un poco diferente. Vamos a seguir adelante y de esta menú aquí, este visualization-- vamos a cambiar este a-- vamos, Firefox. Vamos a cambiar esto a la selección de clasificación. Y vamos a acelerarlo como antes, y comenzar la visualización ahora. Y este algoritmo tiene una sensación diferente a él. En cada iteración, francamente, es aún más sencillo. Sólo estoy seleccionando el elemento más pequeño. Ahora, francamente, tengo un poco de suerte que tiempo, en que lo resuelto súper rápido. Los elementos fueron al azar. No es, como veremos, finalmente, ver, fundamentalmente más rápido. Pero vamos a ver una tercera y última acercarse aquí en cuanto a lo que está pasando. Así que vamos a seguir adelante y restablecer chicos una última vez para estar en este orden aquí. Y ahora, me voy a ser un poco más inteligente, sólo para redondear nuestros algoritmos. Voy a hacer esto. Me voy para no ir ida y vuelta tanto. Francamente, estoy cansado de todo esto de desplazamiento. Yo sólo voy a tomar lo que soy dado al principio de la lista, y yo voy a ordenar que entonces y allí. Así que aquí estamos. Número 4. Voy a citar el número 4 en una lista ordenada. Hecho. Reclamo ahora, y sólo para hacer esto más claro, esta parte de mi lista está ordenada. Es una especie de un reclamo estúpido, pero de hecho 4 se ordena en una lista de tamaño de uno. Ahora, yo voy a tomar en el número 2. Número 2 Ahora estoy yendo a insertar en el lugar correcto. Entonces, ¿dónde 2 pertenecen? Obviamente, aquí. Así que adelante y regresar, si pudieras. ¿Y por qué no se acaba de tomar su música está con ustedes en esta ocasión. Y vamos a la fuerza que inserte en el principio de la lista. Así que un poco más de trabajo. Tuve que mover alrededor de Jacob, y ¿cuál es tu nombre? AMIN: Amin. DAVID MALAN: Amin. Pero al menos no fui hacia atrás y adelante. Sólo estoy tomando las cosas a medida que avanzo. Sólo estoy insertándolas en el lugar correcto. 6, esto es realmente muy fácil. Vamos a insertar por allí, si sólo quería pasar más ligeramente. Número 8, también es bastante fácil. Justo ahí. Maldita sea. Número 1 no podemos simplemente intercambiar con Amin aquí, porque eso está pasando echar a perder el orden. Así que tenemos que ser un poco más inteligente. Así, Artie, si pudiera una copia de seguridad por un momento. Vamos a seguir adelante y cambie ahora, a diferencia de los algoritmos anteriores, para dejar espacio a Artie aquí mismo, en el principio. Así que al final del día, yo soy una especie de haciendo lo que quería evitar antes. Y por lo que mi algoritmo es una especie de revertirse, intelectual, de lo que era originalmente. Sólo estoy haciendo el cambio en un punto diferente. Ahora estoy en el 3. Oh, maldita sea. Tenemos que hacer más trabajo de nuevo. Así que vamos a que empuja hacia fuera. Vamos a pasar 8, 6, 4-- oh OH- y 3 va a ir a la derecha allí. Así que por lo menos los ahorros leves este momento. 7, no mucho trabajo por hacer. Así que si quieres hacer estallar vuelta, vamos a insertar. Y, por último, 5, si usted querer pop volver, nos tenga que cambiar tú, tú, que, hasta las cinco está en su lugar. Así que ahora a ver esto en un alto nivel gráficamente, vamos a hacer este algoritmo visualización de una vez adicional. Así que esto que llamaremos ordenación por inserción. Haremos sólo como rápido, y empezar desde aquí. Y es, también, tiene una sensación diferente. Es una especie de mejora y mejor, pero nunca es perfecta hasta que entro y suave en esas lagunas. Porque, de nuevo, sólo estoy tomando lo Estoy siendo dado de izquierda a derecha. Así que no he tenido tanta suerte que todo era perfecto. Es por eso que tuvimos estos pequeños mispositions que fija el paso del tiempo. Así que todos estos algoritmos parecen correr a ligeramente diferentes ritmos. De hecho, ¿cuál diría que es el mejor o el más rápido hasta la fecha? Ordenamiento de burbuja, la primera? Selección especie, la segunda? Tipo de inserción, la tercera? He oído algunas clases de selección. Otros pensamientos? Así que resulta que todos estos algoritmos son fundamentalmente igual de eficiente que cada otro-- o, por el contrario, al igual que ineficaz como los otros, porque podemos hacer fundamentalmente mejor que los tres de estos algoritmos. Y eso es un poco de una mentira blanca, también. cuando digo tan eficiente o como ineficiente, eso es por lo menos para super-grandes valores de n. Cuando tenemos sólo ocho personas aquí, o tal vez 50 o más barras en la pantalla, te darás cuenta de absolutamente diferencias entre estos tres algoritmos. Pero como n, el número de personas, o el número de números, o el número de personas en el teléfono libro, o el número de páginas web base de datos de Google se hace más grande y más grande, veremos que los tres de estos algoritmos son en realidad bastante pobre. Y podemos hacerlo fundamentalmente mejor que eso. Vamos a echar un vistazo, por último, lo que estos algoritmos pueden sonar como en la contexto de algunos otros así como por medio de este visualización aquí que nos introducirá en una serie de algoritmos. Vamos a seguir adelante y felicitar nuestros participantes aquí, todos los cuales ordenados de manera muy adecuada. Si desea dar un regalo de despedida. Usted puede mantener sus números también. Y lo que verás, o más bien oír, ahora, es que a medida que ponemos sonidos a cada una de estas barras y asociarlo con el software, diferentes frecuencias de sonido, usted puede envolver su mente más audioly alrededor de lo que cada una de estas cosas parece. El primero de ellos es la ordenación por inserción [TONOS] Esta es una especie de burbuja. [TONOS] Selección especie. [TONOS] Algo llamado merge sort. [TONOS] Tipo Gnome. [TONOS] Eso es todo por CS50. Nos vemos el miércoles. NARRADOR: Y ahora, "Deep Pensamientos ", por Daven Farnham. ¿Por qué es un bucle? ¿Por qué no hacerlo mejor? Me gustaría hacer un bucle de cinco. [Risas]