[Powered by Google Translate] [Artículo 4] [Menos Cómodo] [Nate Hardison] [Harvard University] [Esta es CS50.] [CS50.TV] Muy bien, bienvenidos de nuevo a la sección. En la sección de esta semana vamos a hacer un par de cosas. Vamos a la primera serie de problemas recapitulación 2, que es el conjunto de problemas César y Vigenère. Y luego vamos a bucear en Concurso 0 opinión y pasar un poco de tiempo volver a tapar lo que hemos hablado en cada una de las clases hasta el momento, y vamos a hacer unos cuantos problemas de concursos del año anterior. Así que ustedes tienen una buena manera de prepararse para eso. Para empezar, he arrancado un par de buenas soluciones para el conjunto de problema anterior, problema Set 2, en este espacio. Si ustedes todos los afectados en este enlace, y si hace clic en mi nombre y haga clic en mi primera revisión verás caesar.c, que es exactamente lo que estoy buscando. Vamos a hablar de esto muy rápidamente. Esto es sólo una solución de muestra. Esto no es necesariamente la solución perfecta. Hay muchas maneras diferentes de escribir esto, pero hay algunas cosas que yo quería destacar que vi cuando estaba clasificación, los errores más comunes que creo que esta solución hace un trabajo muy bueno de la dirección. La primera es tener algún tipo de comentario encabezado en la parte superior. En las líneas 1 a 7 se ven los detalles, ¿qué es exactamente este programa está haciendo. Una buena práctica estándar cuando estás escribiendo código C sin tener en cuenta si su programa está contenido en un solo archivo o si está dividido en varios archivos es tener algún tipo de orientar comentario en la cima. Esto es también para las personas que salen y escribir código en el mundo real. Aquí es donde van a poner la información de derechos de autor. A continuación se incluye el #. En la línea 16 no es esto # define, que vamos a volver en un poco. Y luego, una vez que la función se inicia, una vez que se inicia principales, ya que este programa ha sido todo contenido en una sola función la primera cosa que sucede-y esto es muy idiomático y típico de un programa en C que acoge los argumentos de línea de comandos-es que se comprueba inmediatamente para el recuento de argumentos, argc. Aquí vemos que este programa está a la espera 2 argumentos exactamente. Recuerde que hay que el primer argumento es el especial que siempre es el nombre del programa que está siendo ejecutado, el nombre del archivo ejecutable. Y lo que esto hace es que evita que el usuario ejecute el programa con argumentos más o menos. La razón por la que desea comprobar esto de inmediato se debe a que en realidad no podemos acceder a esta matriz argv aquí fiable hasta que hayamos comprobado para ver lo grande que es. Uno de los errores comunes que vi fue la gente inmediatamente iría en y apropiación de argv [1]. Habían agarrar el argumento clave de la matriz y se la a a i comprobar en ella, y luego se haría la prueba para argc, así como la prueba siguiente, si el primer argumento era de hecho un número entero, al mismo tiempo, y eso no funciona, porque en el caso de que no haya argumentos proporcionados te agarrar un argumento que no está allí o tratar de agarrar uno que no está allí. La otra cosa importante que se debe notar es que uno siempre quiere imprimir algún tipo de mensaje de error útil para el usuario para orientarlos. Estoy seguro de que tengo todos los programas de ejecución que de repente se bloquea, y se obtiene poco ridículo este cuadro de diálogo que aparece y dice algo terriblemente críptico y tal vez te da un código de error o algo por el estilo que no tiene sentido. Aquí es donde usted realmente quiere ofrecer algo útil y orientadas al usuario para que cuando se ejecute van "Oh," cara de palma. "Sé exactamente qué hacer. Sé cómo solucionar este problema." Si no se imprime un mensaje y luego se termina realmente dejando al usuario ir examinar su código fuente para averiguar lo que salió mal. También hay algunas veces que usted va a utilizar diferentes códigos de error. Aquí hemos usado uno para decir que fue un error, se produjo un error, se produjo un error. Programas más grandes, a menudo los programas que son llamados por otros programas, volverá algún tipo de códigos de error especiales en diferentes escenarios para comunicarse mediante programación qué otra manera sólo tiene que utilizar un mensaje agradable para Inglés. Cool. A medida que trabajamos hacia abajo, se puede ver que tirar la llave. Ponemos a prueba para ver si la llave encaja. Recibimos un mensaje del usuario. La razón por la que lo hacemos en este ciclo do while, y esto es algo que vamos a cubrir en poco poco, pero resulta que si escribe control D cuando usted consigue que GetString del sistema en el terminal lo que en realidad hace es que envía un carácter especial para el programa. Se llama la ELF o el carácter de fin de archivo. Y en ese caso, nuestra cadena de mensaje será nulo, así que no fue algo que nos registramos en el conjunto de problemas en sí. Pero a medida que avanzamos, ahora que hemos empezado a hablar de punteros y la asignación dinámica de memoria en el montón, comprobar la nula siempre que tenga una función que podría devolverá un valor nulo como valor es algo que usted desea conseguir en el hábito de hacerlo. Esto es aquí principalmente para ilustración. Pero cuando usted ve GetString en el futuro, por lo que desde el 4 de problemas, tendrá que tener esto en mente. Una vez más, esto no es un problema para cualquier problema 3, ya que no había cubierto todavía. Por último, llegamos a esta parte donde tenemos al bucle de cifrado principal, y hay un par de cosas que suceden aquí. En primer lugar, iterar sobre la cadena del mensaje completo en sí. Aquí hemos mantenido la llamada strlen en la condición, que algunos de ustedes han señalado, no es un gran camino por recorrer. Resulta que en este caso no lo es también grande, en parte porque estamos modificando el contenido del mensaje en sí mismo dentro del bucle for, por lo que si tenemos un mensaje que es 10 caracteres de longitud, la primera vez que empieces por bucle strlen volverá qué? 10. Pero si a continuación, modifique mensaje, digamos que modificar su carácter 5th, y que tiramos en un carácter \ 0 en la 5 ª posición, en una iteración posterior strlen (mensaje) no devolverá lo que hizo la primera vez que reiteró, pero en vez volverán 5 porque tiramos en ese terminador nulo, y longitud de la cadena se define por la posición de que \ 0. En este caso, esta es una gran manera de ir porque lo estamos modificando en su lugar. Pero te das cuenta de que en realidad es sorprendentemente sencilla para encriptar si usted puede conseguir la matemática correcta. Todo lo que se requiere es comprobar si la carta que usted está buscando en es mayúscula o minúscula. La razón por la que sólo tienes que comprobar eso y no tienen que buscar el caso es alfa es porque si un carácter está en mayúsculas o minúsculas si es entonces es definitivamente un carácter alfabético, porque no tenemos cifras mayúsculas y minúsculas. La otra cosa que hacer, y esto es un poco difícil- es que hemos modificado el estándar de cifrado César fórmula que dimos en la especificación de problemas. La diferencia aquí es que nos resta en la capital del caso en mayúsculas A, y luego añadimos mayúscula copia en al final. Sé que algunos de ustedes han hecho esto en el código. ¿Alguno de ustedes hacen esto en sus presentaciones? Tú hiciste esto. ¿Puede explicar lo que esto hace, Sahb? Restando a cabo, ya que hizo un mod derecha después de ella, hay que sacarlo, por lo que de esta manera se obtiene [tos] posición. Y luego añadiendo de nuevo más tarde cambiado con el que usted quería. Sí, exactamente. ¿Qué Sahb dijo fue que cuando queremos añadir nuestro mensaje y nuestra llave juntos y luego mod que, mod que por NUM_LETTERS, si no aumentamos nuestro mensaje en la correspondiente gama de 0 a 25 en primer lugar, entonces puede ser que termine encima de conseguir un número muy raro porque los valores que estamos mirando cuando miramos mensaje [i], cuando nos fijamos en el carácter i de nuestro mensaje de texto sin formato, es un valor dentro de este rango desde 65 hasta 122 sobre la base de los valores ASCII para mayúsculas A a través de minúsculas z. Y así, cuando lo mod por 26 o por NUM_LETTERS, ya que era nuestro # define arriba a la derecha aquí, que nos va a dar un valor que está en el rango de 0 a 25, y necesitamos una manera de escalar luego de que una copia de seguridad y conseguir que en el rango ASCII correspondiente. La forma más sencilla de hacerlo es a escala simplemente todo abajo en el rango de 0 a 25, para empezar, y luego cambiar todo de nuevo hasta el final. Otro error común que he visto personas se producen es que si no lo hacen realmente escalamiento inmediato y agrega mensaje y la clave juntos y se agregan, por ejemplo, en una variable char, el problema con el que es desde el mensaje [i] es un número relativamente grande para empezar con- recuerda que es por lo menos 65 años si se trata de un carácter en mayúscula- si usted tiene una llave grande, digamos, algo así como 100, y agrega los 2 juntos en un char firmado usted va a obtener un desbordamiento. Usted va a obtener un valor que es mayor que 127, que es el mayor valor que una variable de tipo char puede contener. Una vez más, es por eso que te gustaría hacer ese tipo de cosas, para empezar. Alguna gente tiene en torno a este caso, haciendo una cosa y si las pruebas para ver si se hubiera sobrepasado antes de hacerlo, pero de esta manera se pone alrededor de eso. Y luego, en esta solución que imprime toda la cadena en el último momento. Otras personas nos imprimió un carácter a la vez. Ambos son impresionantes. En este punto, es lo que ustedes tienen alguna pregunta, algún comentario acerca de esto? Cosas que te gustan, las cosas que no te gustan? Yo tenía una pregunta. Tal vez me lo perdí durante su explicación, pero ¿cómo funciona este programa omitir los espacios para la conexión de la llave de la longitud del texto? Esto es sólo César cifrado. >> Oh, lo siento, sí. Sí, vamos a ver eso. En el cifrado César nos dieron por que debido a que sólo volteado caracteres. Sólo les giró si estuvieran en mayúsculas o minúsculas. Ustedes sentir muy bien acerca de esto? Siéntase libre de copiar esta casa, lo toma, compararlo con lo que ustedes escribieron. Sin duda, no dude en enviar preguntas al respecto también. Y una vez más, se dan cuenta de que el objetivo en este caso con su problema establece no es hacer ustedes para escribir código perfecto para los conjuntos de problemas. Es una experiencia de aprendizaje. Si. Volver al do while, si es igual a null, tan nulo sólo significa nada, simplemente pulsa enter? Null es un valor de puntero especial, y usamos nulo cuando queremos decir tenemos una variable puntero que apunta a la nada. Y por lo que generalmente significa que esta variable, esta variable mensaje está vacío, y aquí, porque estamos utilizando el tipo CS50 cadena especial, ¿cuál es el tipo de serie CS50? ¿Has visto lo que es cuando David se retiró la capucha en la conferencia? Es un cobarde, es un puntero, ¿verdad? Bueno, sí. >> Es un char *. Y así realmente podemos reemplazar este aquí con el mensaje char *, y por lo que la función GetString, si no con éxito obtener una cadena del usuario, no se puede analizar una cadena y un caso en el que no se puede analizar una cadena es que si el usuario escribe el carácter de fin de archivo, el D control, que no es algo que suelen hacer, pero si eso sucede entonces la función devolverá el valor nulo como una forma de decir "Oye, no he tenido una cadena." ¿Qué pasaría si no ponemos mensaje = null, que es algo que no hemos estado haciendo ya? ¿Por qué sería eso un problema? Porque sé que hablamos un poco en la conferencia sobre pérdidas de memoria. Sí, vamos a hacer eso, y vamos a ver qué pasa. Basilio era cuestión ¿qué pasa si en realidad no tienen este mensaje = prueba nula? Vamos a desplazarse hasta la parte superior. Ustedes pueden comentar esto. En realidad, lo voy a guardar en una revisión. Esta será la Revisión 3. ¿Qué tienes que hacer para ejecutar este programa es que usted tiene que hacer clic en este icono se preparan aquí, y que tendrá que añadir un argumento a la misma. Vas a tener que darle el argumento clave, ya que queremos pasar en un argumento de línea de comandos. Aquí me voy a dar el número 3. Me gustan 3. Ahora el zoom de vuelta, la ejecución del programa. Se está ejecutando, la compilación, la construcción. Aquí vamos. Se espera que se indique. Si escribo en algo como hola-donde fue? Oh, mi programa tardó demasiado tiempo en ejecutarse. Me jawing durante demasiado tiempo. Aquí va. Ahora escribo en hola. Vemos que lo cifra adecuada. Ahora, ¿qué pasa si hacemos GetString del sistema para devolver nulo? Recuerda, dije que lo hicimos pulsando control D al mismo tiempo. Voy a desplazarse hasta aquí. Vamos a correr de nuevo. Construcción. Ahí va. Ahora bien, cuando llegué a control D Tengo esta línea que dice opt/sandbox50/bin/run.sh, fallo de segmentación. ¿Han visto eso antes? [Estudiante] ¿Por qué no->> Lo sentimos? [Estudiante] ¿Por qué no hay un volcado de memoria en este caso? El volcado de memoria es-la pregunta es ¿por qué no hay un volcado de memoria en esta lista? La cuestión es que no puede ser, pero el vaciado de memoria es un archivo que se almacena en el disco duro. En este caso hemos desactivado los volcados de memoria en el servidor de ejecución para que no haya personas seg fallas y la creación de toneladas de volcados de memoria. Pero usted puede conseguir uno. Los vaciados de memoria son el tipo de cosas que a menudo se puede deshabilitar, ya veces lo hace. El fallo de segmentación, para responder a su pregunta, Basil, es decir que tratamos de acceder a un puntero que no se ha configurado para que apunte a nada. Recuerde Binky en el video cuando intenta Binky ir acceder a un puntero que no está apuntando a algo? En este caso creo que, técnicamente, el puntero apunta a algo. Se apunta a null, lo que técnicamente es 0, pero que se define a estar en un segmento que no es accesible por su programa, por lo que obtener un fallo de segmentación porque no se está accediendo a la memoria que está en un segmento válido como el segmento de montón o el segmento de la pila o el segmento de datos. Cool. ¿Alguna pregunta más sobre César? Vamos a seguir adelante. Echemos un vistazo a la Revisión 2 muy rápido. Eso es Vigenère. Aquí en Vigenère vamos a caminar a través de éste con bastante rapidez, ya que, de nuevo, Vigenère y César son bastante similares. COMENTARIO DE CABECERA es antes, # Define es antes para evitar el uso de estos números mágicos. Lo bueno es decir que quería ir a un alfabeto diferente o algo por el estilo. En lugar de tener que ir a cambiar manualmente todos los 26 en el código podríamos cambiar esto a 27 o caer hacia abajo si estuviéramos usando alfabetos diferentes, lenguas diferentes. Una vez más, tenemos la comprobación del recuento de argumentos, y realmente casi se puede tomar esto como una plantilla. Casi todos los programas que usted escribe debe tener- si se toma argumentos de línea de comandos-alguna secuencia de líneas que dice así desde el principio. Esa es una de las pruebas de cordura primero que quiero hacer. Aquí lo que hicimos fue que se aseguró de que la palabra clave es válida, y que fue el segundo cheque que nos hizo. Note de nuevo que nos separamos esto desde argc y 2. Tenga en cuenta que en este caso una cosa que tenía que hacer era lugar de la utilización de un a i queríamos para validar la cadena completa, y con el fin de hacer que usted realmente tiene que ir carácter por carácter sobre la cadena. No hay una buena forma de llamar a algo en él porque incluso, por ejemplo, una i volverá a 0 si no se puede analizar un número entero, de modo que ni siquiera funciona. De nuevo, bonito mensaje indicando al usuario exactamente lo que sucedió. Entonces aquí, de nuevo, también se ocupan de los casos en el usuario escribe un carácter de control D aleatorio. Y entonces Charlotte tenía una pregunta anterior sobre la forma en que gestionamos para saltar espacios en nuestra cadena aquí. Esto fue un poco similar a lo que hicimos con el programa de Myspace que hicimos en la sección, y trabajó la forma en que este es que nos devolvió la cantidad de letras que habíamos visto. A medida que entramos en la cadena del mensaje, ya que caminamos sobre el carácter por carácter, nos devolvió el índice como parte de nuestro bucle for, y luego nos devolvió también el número de letras, por lo que no caracteres especiales, que no son números, no blanco el espacio que habíamos visto en la variable independiente. Y a continuación, esta solución modifica la clave para obtener un entero de clave real, y lo hace sobre la marcha, justo antes de que luego se vuelve a cifrar el carácter real del mensaje. Hay algunas soluciones que eran perfectamente geniales que modificaría la tecla de arriba cuando las pruebas de validez de la clave. Además de asegurarse de que el carácter y la palabra clave fue un carácter alfabético que también lo convirtió en un entero en el rango de 0 a 25 para saltar entonces tener que hacer que más adelante en este bucle. Una vez más, vemos aquí es realmente el mismo código que se utilizó en Caesar en este punto. Lo estás haciendo exactamente lo mismo, así que el verdadero truco es encontrar la cómo convertir la palabra clave en un número entero. Una cosa que hemos hecho aquí es un poco denso Es hemos repetido esta frase, supongo que se podría llamar, 3 veces por separado en las líneas 58, 59, y 61. ¿Puede alguien explicar qué es exactamente esta frase hace? Se accede a un personaje, como dijiste. Sí, es [inaudible] un personaje de la palabra clave, y lo que es el número de cartas visto porque sólo estás moviendo a lo largo de la palabra clave una vez que haya visto la carta, por lo que va a pasar con eficacia los espacios y cosas por el estilo. Sí, exactamente. Y luego, una vez que haya visto la palabra clave en blanco que acaba de mod por lo que regresar a su alrededor. Exactamente. Esa es una explicación perfecta. ¿Qué dijo Kevin es que queremos indizar en la palabra clave. Queremos obtener el carácter num_letters_seen, si se quiere, pero si num_letters_seen excede la longitud de la palabra clave, la forma de regresar al rango apropiado es que utilice el operador mod para envolver eficazmente alrededor. Por ejemplo, al igual que en el corto, nuestra palabra clave es tocino, y está a 5 letras. Pero hemos visto 6 cartas en nuestro texto plano en este momento y encriptada 6. Vamos a terminar el acceso a la num_letters_seen, que es 6, mod la longitud de la palabra clave, 5, y lo que vamos a conseguir 1, y así lo vamos a hacer es que vamos a acceder al interior del primer carácter de nuestra palabra clave en ese punto. Muy bien, cualquier pregunta sobre Vigenère antes de seguir adelante? Ustedes sentir muy bien acerca de esto? Genial, genial. Quiero para asegurarse de que ustedes están recibiendo la oportunidad de ver el código que creemos que se ve bien y tener la oportunidad de aprender de él. Esto va a ser la última vez que va a utilizar espacios para el momento, y vamos a la transición, y yo voy a ir a cs50.net/lectures para que podamos hacer un poco de revisión quiz. La mejor manera que creo que empezar a hacer test opinión que ha de venir a esta página Conferencias, cs50.net/lectures, y debajo de cada una de las partidas semana, así que si me veo aquí en la semana 0, Veo que tenemos una lista de temas que cubrimos en la semana 0. Si cualquiera de estos tópicos parecen poco familiares que sin duda querrá volver atrás y buscar en las notas de clase y, posiblemente, incluso leerlo a través de las conferencias, de ver de nuevo si desea para tener una idea de lo que está pasando con cada uno de estos temas. Diré, además, este año uno de los recursos frescos que tenemos Son estos pantalones cortos que hemos creado, y, si nos fijamos en la semana 0 no tenemos todos los temas tratados, pero tenemos un buen número de ellos, algunos de los más difíciles, así que ver estos cortos otra vez es una buena manera de ponerse al día. En particular, me voy a poner en un enchufe para el 3 en la parte inferior, desde que hice eso. Pero si usted está luchando con el binario, bits, hexadecimal, ese tipo de cosas, binario es un gran lugar para comenzar. ASCII es otro que es bueno para ver también. Incluso puedes mirarme a la velocidad de 1.5x si voy demasiado lento para usted. Desde su opinión, no dude en hacerlo. Sólo para empezar muy rápido, vamos a ir a través de un par de estos problemas concursos sólo para batir rápidamente a través de estos. Por ejemplo, echemos un vistazo a 16 problema que tengo aquí arriba en el tablero. Tenemos este cálculo siguiente en binario, y queremos mostrar cualquier trabajo. Bueno, yo voy a dar a este un tiro. Ustedes deberían seguir junto con el papel, y vamos a hacer esto muy rápidamente. Queremos realizar el siguiente cálculo en binario. Tengo 00110010. Y voy a añadir a 00110010. Para los cálculos genios siguiendo a lo largo en casa, este es efectivamente multiplicando por 2. Vamos a empezar. Vamos a seguir el mismo algoritmo de adición que hacemos cuando sumamos números decimales entre sí. Realmente la única diferencia aquí es que la vuelta de bucle una vez que tenemos 1 + 1 en lugar de una vez que lleguemos a 10. Si partimos de la derecha, muy rápido, ¿cuál es el primer dígito? [Estudiante] 0. >> [Nate H.] 0. Grande, el segundo dígito? [Estudiante] 1. [Nate H.] Se trata de un 1? 1 + 1 es? [Estudiante] 10. [Nate H.] Exactamente, ¿cuál es el dígito que escribo justo debajo de los 2 suman? [Estudiante] 1, 0, ó 0 y luego llevar a la 1. [Nate H.] 0 y llevar a 1, exactamente. El próximo uno, Basil, que estás haciendo. ¿Cuál es la tercera? >> [Basil] 1. [Nate H.] 1, perfecto. Kevin? [Kevin] 0. >> [Nate H.] 0, Charlotte? [Charlotte] 0. >> [Nate H.] Sí, y ¿qué hago? [Estudiante] El 1. [Nate H.] ¿Y qué voy a hacer? Y entonces me lleve el 1. Perfecto, Sahb? >> [Sahb] Ahora usted tiene 1. [Nate H.] Y ¿Puedo hacer algo aquí? [Sahb] Entonces, por un lado tiene 1 porque te lleva a más de 1. [Nate H.] Great, asi que aquí podemos terminar. Cool. [Estudiante] ¿Tiene 0 + 0 = 0? 0 + 0 = 0. 1 + 1, como usted ha dicho, es de 10, o 1, 0, mejor dicho. 10 es un nombre poco apropiado porque para mí 10 significa el número 10, y es la peculiaridad de la forma en que lo está representando cuando estamos escribiendo. Nos representan el número 2 por 1, 0, y el número 10 es ligeramente diferente. ¿Qué es una especie de agradable sobre binario es que realmente no son muchos casos, es necesario aprender. Hay 0 + 0 = 0, 0 + 1 = 1, 1 + 1 es 0, y luego llevar a un 1, y entonces usted puede ver aquí en la tercera columna de la derecha hemos tenido este 1, 1 y 1. Y 1 + 1 + 1 es un 1, y llevar a otro 1. Cuando usted está haciendo la suma binaria, bastante simple. Me gustaría hacer un par de ellos más a la cordura comprobar vosotros mismos antes de ir ya que es probablemente algo que vamos a ver en el cuestionario. Ahora vamos a hacer esto que viene. Vamos a hacer problema 17. Vamos a convertir el siguiente número binario a decimal. Tengo 10100111001. Recuerde que en el video que hice binario Caminé a través de un par de ejemplos, y me mostró cómo todo funciona cuando usted lo está haciendo en decimal. Cuando se trabaja en la representación decimal Creo que estamos en este momento de nuestras vidas tan fluido en lo que que es bastante fácil de pasar por alto la mecánica de cómo funciona realmente. Pero para hacer un resumen rápido, si tengo el número 137 esto significa realmente, y de nuevo, esto es en la representación decimal- el número 137 en decimal significa que tengo 1 x 100 + 3 x 10 + 7 x 1. Esto es todo permanecer en la pantalla. Y luego, si nos fijamos en los números aquí, 100, 10 y 1, se ve que en realidad son todas las potencias de 10. Tengo 10 ², 10 ¹, y 10 para el cero. Tenemos un tipo similar de cosas en binario, excepto que nuestra base, como lo llamamos, está a 2 en lugar de 10. Estos resultados entre los 10 que he escrito hasta aquí en la parte inferior, esta ² 10, 10 ¹, 10 para el cero, 10 es nuestra base, y el exponente, 0, 1, o 2, está implícito en la posición del dígito en el número que se escribe. 1, si nos fijamos en él, este 1 se encuentra en la 2 ª posición. El 3 está en la posición primera, y el 7 está en la posición 0 ª. Así es como se obtienen los exponentes que figuran a continuación para nuestras bases. A raíz de todo esto nos volveremos-en realidad, ¿sabes qué? Lo haremos-donde se fue mi botón de deshacer ir? Ahí va. Me encanta esta cosa deshacer. Después de esto creo que para mí al menos la forma más fácil de iniciar la conversión de un número binario o un número hexadecimal donde la base es 16 y no 10 o 2 es seguir adelante y escribir las bases y exponentes para todos los números en mi número binario en la parte superior. Si partimos de izquierda a derecha, de nuevo, que es un poco contradictorio, Voy a volver al negro aquí, tenemos la 2 a la posición 0 ª, y entonces tenemos 2 ¹, 2 ², y luego 2 a la 3, 2 a la 4, 2 a la 5, 6, 7, 8, 9, y 10. Estos números que he escrito fuera son todos los exponentes. Yo sólo escribí las bases aquí en los 3 primeros sólo por el espacio. En este punto, voy a seguir adelante y de hecho voy a borrar las cosas que hicimos en decimal, si te parece bien. Todos ustedes han entendí. Aquellos de ustedes viendo en línea Estoy seguro de que será capaz de rebobinar si me quieres. Cambio a la pluma. Ahora, ¿qué podemos hacer, si ustedes no están totalmente al día en sus potencias de 2, eso es totalmente cool. Sucede. Entiendo. Una vez tuve una entrevista de trabajo donde me dijeron que debo saber todas las potencias de 2 a través de 2 a la 30. No era un trabajo que tengo. De todos modos, ustedes pueden seguir adelante y hacer los cálculos aquí, pero con el binario que no tiene mucho sentido, y tampoco tiene sentido con decimal o hexadecimal o bien, para hacer los cálculos de dónde tiene ceros. Usted puede ver que tengo 0 aquí, un 0 aquí, aquí 0, 0 aquí, aquí 0, 0 aquí. ¿Por qué no podría tener sentido para hacer los cálculos real para calcular la potencia apropiada de 2 para esa posición? Exactamente como dijo Charlotte, será 0. Bien podría ahorrarse el tiempo si el cálculo de potencias de 2 no es su punto fuerte. En este caso, sólo tendrá que calcular por 2 a 0, que es el-? [Estudiante] 1. [Nate H.] 1, 2 a la 3 que es-? [Estudiante] 8. >> [Nate H.] 8. 2 a la 4? [Estudiante] 2. Lo siento, 1. [Nate H.] 2 a la 4 es 16, exactamente. 2 a la 5, Kevin? >> 32. [Nate H.] 32, 2 a la 8? [Estudiante] 32 x 8, 256. [Nate H.] Perfect. Y 2 a los 10? [Estudiante] 1024. [Nate H.] Sí, 1024. Una vez que tenemos estos números podemos resumirlas. Y aquí es donde es muy importante hacer un par de cosas. Una de ellas es ir lento y revisar su trabajo. Se puede decir que hay un 1 al final de este número, así que definitivamente debe obtener un número impar como mi resultado, porque todos los demás van a ser números pares dado que se trata de un número binario. La otra cosa a hacer es si se llega a este punto de la prueba y lo has escrito hasta aquí y que está acabando el tiempo mirar el número de puntos que este problema merece la pena. Este problema, como se puede ver, si le doy la vuelta a mi computadora portátil muy rápido- este problema vale 2 puntos, por lo que este no es el tipo de adición usted debe ir a través si usted está realmente presionado por el tiempo. Pero vamos a volver a la iPad, y vamos a ir a través de él muy rápidamente. Me gusta hacer los números pequeños primero porque me parece que sea más fácil. Me gusta 32 y 8 porque van de la mano con bastante facilidad, y obtenemos 50. 16 y 1 se 17. No tenemos 57 años, y entonces podemos hacer el resto de esto, así que podemos hacer 57, 156. Vamos. El hombre, bueno, vamos a ver. Tuvimos 57, 256 y 1024. En este punto, prefiero sólo tiene que ir a través. No tengo ni idea. Yo claramente que leer sobre esto. 7, 6 y 4, se obtiene 17. 1, 5, 5, 2, 13. Entonces tenemos 3, y entonces tenemos 1. 1337. Huevo de Pascua, a nadie? ¿Alguien reconoce este número? Chris reconoce el número. ¿Qué significa eso, Chris? [Chris] Leet. Leet, así que si usted mira esto, parece que leet. Hacker cosas. Cuidado con ese tipo de cosas en el mediano plazo o el concurso, mejor dicho. Si usted ve ese tipo de cosas y que se esté preguntando "¿Eh," que en realidad podría significar algo. No se. David le gusta ponerlo pulg Es una buena manera de cordura comprobarlo. Como bien, puedo ver lo que está pasando. Esa es la Semana 1 0/Week cosas. Si cambiamos de nuevo a nuestro ordenador portátil ahora, alejar la imagen, y un par de otras cosas. Hay ASCII, lo que hemos estado haciendo un montón de los boletines de problemas. Esta noción de capital A. ¿Qué es eso realmente? Sabiendo que es el entero decimal. 65 es lo que se asigna a la tabla ASCII, y eso es por lo tanto el equipo como lo escribe, y así es como hemos estado saliendo con la realidad escribiendo A la capital de carácter y el carácter a minúscula en algunas de estas soluciones y conjuntos de problemas que has estado haciendo. Un par de cosas más. Tenemos declaraciones, expresiones booleanas, condiciones, bucles, variables e hilos. Aquellos todo parece tener sentido en su mayor parte? Parte de esta terminología es un poco raro a veces. Me gusta pensar en un comunicado que para la mayor parte de algo que termina con un punto y coma. Declaraciones como x = 7, que establece una variable, presumiblemente llamado x = 7. Es de suponer que x es también un tipo que puede almacenar el número 7, por lo que es un int o un float o posiblemente un cortocircuito o una charla, algo por el estilo. Una expresión booleana es el uso de estos dos es igual a y la explosión igual a los iguales o no, menor que, mayor que, menos de o igual a, todo ese tipo de cosas. Las condiciones son, entonces, las declaraciones if else. Me gustaría recordar que no se puede tener una cosa sin la correspondiente if. Del mismo modo, no se puede tener una cosa sin la correspondiente si si. Loops, recordar los 3 tipos de lazos que hemos estado trabajando muy duro en ti desde hace un par de secciones y de los boletines de problemas. Usando hacer mientras que usted está recibiendo datos del usuario, Utilización de bucles while hasta que una determinada condición es verdadera, y luego usando los bucles for si necesita saber qué iteración del bucle Actualmente se encuentra en es como yo pienso. O si usted está haciendo una para cada carácter en una cadena que quiero hacer algo, para cada elemento de una matriz que quiero hacer algo a ese elemento. Temas y eventos. Estos no hemos cubierto en forma explícita en C, pero recuerda esto desde el principio. Esta es la idea de tener diferentes scripts. Esto también es esta noción de radiodifusión de un evento. Hay gente que no hizo uso de la radiodifusión en sus proyectos inicialmente, lo cual es totalmente cool, pero estas son dos maneras diferentes de manejar este problema más grande llamada la concurrencia, que es como se llega a ejecutar los programas de o aparentemente ejecutar al mismo tiempo? Diferentes tareas en ejecución mientras otras tareas también están en marcha. Así es como el sistema operativo parece que funciona. Esta es la razón, aunque, por ejemplo, Tengo mi navegador que se ejecuta, también puede convertirse en Spotify y reproducir una canción. Eso es más de una cosa conceptual de entender. Me gustaría echar un vistazo a los temas cortos si quieres aprender más sobre eso. Vamos a ver, creo que podría haber sido un problema en esta en uno de estos. Una vez más, creo que las discusiones y eventos que no son algo que vamos a cubrir en C sólo porque es mucho más difícil que en Scratch. Usted no debe preocuparse por ahí, pero sin duda a comprender los conceptos, entender lo que está pasando. Antes de seguir adelante, cualquier duda sobre la Semana 0 materiales? Todo el mundo siente bastante bien? Comprensión de las variables y lo que es una variable? Cambiando de tema. Semana 1. Un par de cosas aquí que no fueron cubiertos en particular en la revisión y prueba necesariamente también hay cosas más conceptuales para pensar. El primero es la noción de lo que el código fuente, compiladores y el código objeto son. ¿Alguien? Basil. Es de código objeto, quiero decir, el código fuente es lo que pone en clang, y el código objeto es lo que pone sonido metálico de manera que el ordenador puede leer el programa. Exactamente. El código fuente es el código C que en realidad se escribe arriba. El código objeto es lo que hay de sonido metálico. Es el 0 y 1 en que formato binario. Entonces lo que sucede es cuando usted tiene un montón de archivos de objetos, decir que se está compilando un proyecto o un programa que utiliza varios archivos de código fuente, que por convención se les da la extensión. c archivo. Es por eso que tenemos vigenère.c caesar.c,. Si va a escribir programas en Java se les da la extensión. Java. Programas Python tienen la extensión. Py frecuencia. Una vez que tenga los archivos c múltiples., De compilarlo. Clang escupe toda esta basura binaria. Entonces, ya que sólo quieren un programa tenéis el enlace enlazador todos estos ficheros objeto juntos en un archivo ejecutable. Esto es también lo que sucede cuando se utiliza la biblioteca CS50, por ejemplo. La biblioteca CS50 es a la vez que. Archivo de cabecera h que lea, que # includecs50.h. Y también es un archivo binario de la biblioteca especial que ha sido compilado que es 0s y 1s, y que-l, por lo que si nos remontamos a nuestros espacios y esperamos realmente rápido a lo que está pasando aquí cuando miramos a nuestro alcance clang, lo que tenemos es que este es nuestro archivo de código fuente aquí. Se trata de un montón de opciones del compilador. Y luego, al final, éstos-l enlace banderas en los archivos binarios reales de estas dos bibliotecas, la biblioteca del CS50 y luego la biblioteca matemática. Entender cada tipo de objeto files ' en el proceso de compilación es algo que usted quiere ser capaz de dar por lo menos un resumen de alto nivel de. Código fuente Código objeto entra sale. Archivos de código objeto unir, y se obtiene un archivo de hermoso, ejecutable. Cool. Aquí es también donde usted puede obtener errores en múltiples puntos en el proceso de compilación. Aquí es donde, por ejemplo, si usted toma esta bandera de unión, la bandera CS50, y lo omite en espacios o cuando se está ejecutando el código, aquí es donde usted obtendrá un error en la fase de vinculación, y el vinculador decir: "Oye, te llamó una función GetString que está en la biblioteca CS50 ". "Me dijiste que estaba en la biblioteca CS50, y no puedo encontrar el código para ello". Ahí es donde hay que relacionar, y eso es independiente de un error de compilación porque el compilador está mirando sintaxis y ese tipo de cosas. Es bueno saber lo que está pasando cuando. Otras cosas que debe saber. Yo diría que debe de echar un vistazo a la breve sobre encasillamiento realizado por Jordan para entender lo que son enteros bajo el capó, qué caracteres están bajo el capó. Cuando hablamos de ASCII y realmente se ven en la tabla ASCII, lo que está haciendo nos está dando una mirada bajo el capó la forma en que el equipo representa en realidad mayúscula y el dígito 7 y una coma y un signo de interrogación. La computadora también tiene maneras especiales para representar el número 7 como un número entero. Tiene una forma especial para representar el número 7 como un número de punto flotante, y los que son muy diferentes. Encasillamiento es la forma de decirle a la computadora "Hey, quiero que conviertas de una representación a otra representación. " ¿Por qué no echar un vistazo a eso. También me gustaría echar un vistazo a la breve sobre las bibliotecas y la corta en los compiladores. Los que hablan del proceso de compilación, qué es una biblioteca, y repasar algunas de las preguntas que puede que te pregunté. Preguntas sobre la Semana 1 material? ¿Hay temas que aquí parecen enormes proporciones que le gustaría cubrir? Estoy tratando de soplar a través de la mayoría de estos temas anteriores para que podamos llegar a punteros y hacer un poco de recursividad. Pensamientos? Cualquier cosa que cubrir? Tiempo para un poco de chocolate tal vez? Ustedes están trabajando a través de él. Yo voy a seguir bebiendo mi café. Semana 2. Buena idea, buena idea. En la semana 2 hablamos un poco más acerca de las funciones. En los boletines de problemas primeras que realmente no escribir ninguna función en absoluto excepto que la función? [Estudiante] Principal. >> Principal, exactamente. Y por lo que hemos visto los diferentes trajes que viste principal. No es el único en el que no toma ningún argumento, y acabamos de decir nula entre los paréntesis, y luego está el otro en el que quieren tomar los argumentos de línea de comandos, y como hemos visto, ahí es donde tienes int argc y argv matriz de cadenas o ahora que hemos estado realmente expuestos a ser la cadena char * que es vamos a empezar a escribir como char * argv y luego entre paréntesis. En Boletín de problemas 3, ustedes vieron un montón de funciones, y ha implementado un montón de funciones, dibujar, mirar hacia arriba, scramble. Los prototipos fueron escritos allí para usted. Lo que yo quería hablar aquí con funciones muy rápido es que hay 3 partes de ellos cada vez que escribes una función. Debe especificar el tipo de retorno de la función. Tiene que especificar un nombre para la función, y entonces usted tiene que especificar la lista de argumentos o la lista de parámetros. Por ejemplo, si yo tuviera que escribir una función para resumir un montón de números enteros y luego vuelve a mí la suma que sería mi tipo de retorno si quería sumar números enteros y luego devolver la suma? A continuación, el nombre de la función. Si sigo adelante y escribir en verde, esta parte es el tipo de retorno. Esta parte es el nombre. Y luego entre paréntesis es donde me dan los argumentos, a menudo abreviado como argumentos, a veces llamado params para los parámetros. Y si usted tiene uno, usted sólo tiene que especificar el elegido. Si tiene varios de separar cada uno con una coma. Y para cada argumento que le dan 2 cosas que son-Kevin? [Kevin] Hay que dar el tipo y luego el nombre. Y luego el nombre, y el nombre es el nombre que se va a utilizar para referirse a ese argumento dentro de la función suma, dentro de la función que se está escribiendo actualmente. Usted no tiene que, por ejemplo, si yo voy a resumir, por ejemplo, una matriz de enteros-nosotros hacemos array int, y me voy a dar algunas llaves no- luego cuando pasa una matriz a la función suma Lo paso en la primera posición de la lista de argumentos. Pero la matriz que pasar en no tiene que tener el nombre arr. Arr va a ser cómo se refieren a que el argumento dentro del cuerpo de la función. La otra cosa que hay que tener en cuenta, y esto es un poco diferente de funciones, pero creo que es un punto importante, es que en C cuando estoy escribiendo una función como esta ¿cómo puedo saber cuántos elementos hay en esta serie? Esto es algo de una pregunta capciosa. Hemos hablado de esto un poco en la sección de la semana pasada. ¿Cómo puedo saber el número de elementos dentro de un array en C? ¿Hay alguna manera? Resulta que no hay forma de saberlo. Usted tiene que pasar por separado. Hay un truco que puedes hacer si estás en la misma función en la que se ha declarado la matriz, y se trabaja con una amplia chimenea. Pero eso sólo funciona si usted está en la misma función. Una vez que se pasa una matriz a otra función o si se ha declarado un array y pones esa matriz en el montón, que ha utilizado malloc  y ese tipo de cosas, todas las apuestas están apagadas. Entonces usted realmente tiene que pasar alrededor de un argumento especial u otro parámetro que le dice qué tan grande es la matriz. En este caso, me gustaría utilizar una coma-lo siento, que va fuera de la pantalla aquí- y me gustaría pasar en otro argumento  y lo llaman int len ​​para la longitud. Una cosa que pudiera surgir en el examen Se le pedirá que escriba o implementar una función particular que se llama algo así. Si nosotros no le damos el prototipo, por lo que todo esto aquí, todo este lío se llama la declaración de la función o el prototipo de función, esta es una de las primeras cosas que usted querrá concretar si no se le da a usted de inmediato en el cuestionario. El otro truco que he aprendido es que dicen que te dan un prototipo para una función, y decimos: "Oye, tienes que escribir". Dentro de las llaves que tiene en el cuestionario si usted nota que hay un tipo de retorno y nota que el tipo de cambio es algo distinto de vacío, lo que significa que la función no devuelve nada, entonces una cosa que debe de hacer es escribir algún tipo de instrucción de retorno en el final de la función. Retorno, y en este caso, vamos a poner un espacio en blanco, porque queremos llenar el espacio en blanco. Pero esto pone a pensar en la manera correcta de cómo voy a abordar este problema? Y te recuerda que vas a tener que devolver un valor a la llamada de la función. Si. >> [Estudiante] ¿El estilo se aplican cuando estamos escribiendo código en el concurso? Tal como sangría y ese tipo de cosas? >> [Estudiante] Yeah. No, no como mucho. Creo que mucho de esto es algo que vamos a aclarar en la prueba en el día de, pero por lo general incluye preocuparse por # y ese tipo de cosas, es una especie de fuera. [Estudiante] ¿Es necesario comentar su código escrito a mano? ¿Es necesario comentar su código escrito a mano? Comentando siempre es bueno si usted está preocupado acerca del crédito parcial o desea comunicar su intención a la motoniveladora. Pero, de nuevo, se aclarará en el propio concurso y en el día de concurso, pero no creo que se le requiere para escribir comentarios, no. Normalmente no, pero sin duda es el tipo de cosas que puede comunicar su intención, como "Hey, aquí es donde me voy con él." Y a veces eso puede ayudar con crédito parcial. Cool. Basil. [Basil] ¿Cuál es la diferencia entre declarar, por ejemplo, int lang en los argumentos o parámetros de comparación que se declara una variable dentro de la función? Wow, café bajó la tráquea. [Basil] Al igual que las cosas que queremos poner en argumentos. Sí, esa es una gran pregunta. ¿Cómo se elige qué cosas quieres poner en los argumentos frente a las cosas que usted debe hacer dentro de la función? En este caso se incluyeron tanto de éstos como argumentos porque son algo que todo el que se va a utilizar la función de suma tiene que especificar esas cosas. La función de suma, como hemos hablado, no tiene manera de saber qué tan grande es la matriz que recibe de su interlocutor o de quien está utilizando la función suma. No tiene forma de saber qué tan grande es esa matriz. La razón por la que pasamos en esta longitud de aquí como un argumento es porque eso es algo que básicamente estamos diciendo al llamador de la función, quien se va a utilizar la función de suma, "Hey, no sólo usted tiene que darnos una matriz de enteros, usted también tiene que decirnos cuán grande es la matriz que usted nos ha dado es ". [Basil] Los dos estarán argumentos de línea de comandos? No, estos son argumentos reales que le pasan a la función. Permítanme hacer una nueva página aquí. [Basil] Al igual nombre pasaría- [Nate H.] Si tengo int main (void) y me voy a poner en mi retorno 0 hasta aquí en la parte inferior, y digo que quiero llamar a la función suma. Quiero decir int x = sum (); Para utilizar la función suma tengo que pasar tanto en la matriz que quiero resumir y la longitud de la matriz, por lo que aquí es donde suponiendo que tenía una serie de enteros, decir que tenía int numbaz [] = 1, 2, 3, tipo de uso que hackeado sintaxis allí mismo, entonces lo que quiero hacer es en resumen me gustaría pasar en tanto numbaz y el número 3 para decirle a la función sum "Bueno, aquí está la matriz Quiero que sumar." "Aquí está su tamaño". ¿Eso tiene sentido? ¿Responde eso a su pregunta? En muchos sentidos, lo hace paralelo lo que estamos haciendo con los principales cuando tenemos los argumentos de la línea de comandos. Un programa como el cifrado César, por ejemplo, que es necesario argumentos de línea de comandos no sería capaz de hacer cualquier cosa. No sabría cómo cifrar si no se lo dije a ella que tecla usar o si no se lo diga qué cadena que quería cifrar. Solicitud de una entrada, aquí es donde tenemos dos mecanismos diferentes para la toma de entrada desde el usuario, para tomar la información desde el usuario. Por problemas n 1 vimos este getInt, GetString, forma GetFloat de solicitud de una entrada, y que se llama mediante la secuencia de entrada estándar. Es un poco diferente. Es algo que se puede hacer de una sola vez en lugar de al invocar el programa, al iniciar el programa en ejecución. Los argumentos de línea de comandos todo se especifican cuando se inicia el funcionamiento del programa. Hemos estado mezclando los dos de ellos. Cuando usamos argumentos a una función, que es muy similar a los argumentos de línea de comandos al principal. Es cuando se invoca la función que hay que decir qué es exactamente lo que necesita para llevar a cabo sus tareas. Otra cosa agradable a la vista y te dejaré verlo en su tiempo libre, y fue cubierto en la prueba-fue la noción de alcance y las variables locales frente a las variables globales. Se presta atención a eso. Ahora que estamos llegando a estas otras cosas, en la semana 3 empezamos a hablar de búsqueda y ordenación. Búsqueda y clasificación, al menos en CS50, es en gran medida una introducción a algunas de las partes más teóricos de la informática. El problema de la búsqueda, el problema de la clasificación son problemas grandes y canónicas. ¿Cómo se puede encontrar un número concreto de una matriz de miles de millones de números enteros? ¿Cómo encontrar un nombre en particular dentro de una libreta de teléfonos que se almacena en su computadora portátil? Y, entonces, introducir la noción de tiempos de ejecución asintótica para cuantificar realmente cuánto tiempo, cuánto estos problemas son, el tiempo que tardan en resolver. En, creo, 2011 en el quiz de que hay un problema que creo que merece cubriendo muy rápidamente, lo que es este, problema 12. O no, es Omega. Aquí estamos hablando del tiempo de ejecución más rápida posible para un algoritmo particular y entonces el tiempo de ejecución más lenta posible. Esta Omega y O en realidad sólo son accesos directos. Son atajos de notación para decir la rapidez en el caso mejor será nuestro algoritmo de ejecución, y lo lento que en el peor caso posible que nuestro algoritmo de correr? Vamos a hacer un par de ellos, y éstos también fueron cubiertos en el corto en notación asintótica, que recomiendo encarecidamente. Jackson hizo un trabajo realmente bueno. Con la búsqueda binaria, hablamos de búsqueda binaria como un algoritmo, y solemos hablar de él en términos de su gran O. ¿Cuál es la gran O? ¿Cuál es el tiempo de ejecución más lenta posible de búsqueda binaria? [Estudiante] N ²? Close, supongo que similar a eso. Es mucho más rápido que eso. [Estudiante] Binary? >> Sí, la búsqueda binaria. [Estudiante] Es log n. Iniciar sesión n, así que lo que hace log n significa? Se reduce a la mitad cada iteración. Exactamente, en el caso más lento posible, decir si usted tiene una matriz ordenada de un millón de números enteros y el número que está buscando es o bien el primer elemento de la matriz o el elemento de último en la matriz. Recuerde, el algoritmo de búsqueda binaria funciona buscando en el elemento medio, ver si ese es el partido que usted está buscando. Si es así, entonces bien, lo encontraste. En el mejor caso posible, la velocidad binaria se ejecuta la búsqueda? [Los estudiantes] 1. 1, es la constante de tiempo, gran O de 1. Si. [Estudiante] Tengo una pregunta. Cuando dices iniciar de n, que quieres decir con respecto a la base 2, no? Sí, así es la cosa. Decimos n de registro, y supongo que cuando yo estaba en la secundaria Siempre asumí que era log base 10. Sí, eso si, log 2 base típicamente es lo que usamos. Una vez más, volver a la búsqueda binaria, si usted está buscando, ya sea para el elemento en el final o el elemento en el principio, porque empiezas en el centro y luego de desechar cualquier medio no cumple con los criterios que usted está buscando, y te vas a la siguiente mitad y la otra mitad al lado y la siguiente media. Si estoy buscando el elemento más grande de la matriz de enteros millones Me voy a reducir a la mitad, a lo sumo registro de 1 millón de veces antes de que finalmente probar y ver que el elemento que estoy buscando se encuentra en el más grande o en el más alto índice de la matriz, y que se llevará registro de n, iniciar de 1 millón de veces. Ordenamiento de burbuja. ¿Ustedes recuerdan el algoritmo de ordenamiento de burbuja? Kevin, ¿me puede dar un resumen rápido de lo que sucedió en el algoritmo de ordenamiento de burbuja? [Kevin] Básicamente se pasa a través de todo en la lista. Se ve en las dos primeras. Si el primero es mayor que el segundo les swaps. A continuación, se compara la segunda y tercera, la misma cosa, swaps, tercero y cuarto, todo el camino hacia abajo. Mayores números seguirán hasta el final. Y después de muchos ciclos sin embargo ya está. Exactamente, es lo que Kevin dijo es que vamos a ver grandes números burbuja hasta el final de la matriz. Por ejemplo, ¿te importa caminar a través de este ejemplo, si esta es nuestra matriz? [Kevin] Usted tomará 2 y 3. 3 es mayor que 2, por lo que intercambiarlas. [Nate H.] Derecho, por lo que cambiar esto, y por lo que tenemos 2, 3, 6, 4 y 9. [Kevin] A continuación, se comparan los 3 y 6. 3 es menor que 6, por lo que ellos van, y 6 y 4, que te cambiarlos porque 4 es menor que 6. [Nate H.] Derecho, por lo que me sale 2, 3, 4, 6, 9. [Kevin] y 9 es mayor que 6, por lo que salir de él. Y te gustaría volver a través de él de nuevo. [Nate H.] ¿Me he hecho a estas alturas? >> [Kevin] No. ¿Y por qué no se me hace en este momento? Porque parece que mi matriz está ordenada. Estoy mirando. [Kevin] Ir a través de él de nuevo y asegúrese de que no son los swaps no más antes de que usted puede parar por completo. Exactamente lo que necesita para seguir adelante a través y asegúrese de que no hay swaps que se puede hacer en este momento. En realidad sólo era afortunado, como usted ha dicho, que terminamos sólo tener que hacer un pase a través de nosotros y estamos ordenados. Pero para hacer esto en el caso general, que realmente tendrá que hacer esto una y otra vez. Y de hecho, este fue un ejemplo de la mejor caso posible, como vimos en el problema. Hemos visto que el mejor caso posible se n. Fuimos a través de la matriz 1 vez. ¿Cuál es el peor caso posible para este algoritmo? [Kevin] N ². ¿Y eso qué aspecto tiene? ¿Cuál sería una mirada amplia como eso llevaría tiempo ² n? [Kevin] [inaudible] ordenados. Exactamente, así que si tuviera la serie 9, 7, 6, 5, 2, primero el 9 sería burbuja todo el camino hacia arriba. Después de 1 repetición tendríamos 7, 6, 5, 2, 9. Entonces el 7 hasta burbujearía, 6, 5, 2, 7, 9, y así sucesivamente y así sucesivamente. Tendríamos que ir a través de toda la matriz n veces, y de hecho puedes conseguir un poco más preciso que este porque una vez que nos hemos movido el 9 hasta el final hasta en su última posición posible sabemos que nunca tenemos que comparar ese elemento nuevo. Una vez que empezamos burbujeando el 7 hasta sabemos que podemos parar una vez que el 7 es justo antes de las 9 pues ya hemos comparado la 9 a la misma. Si usted hace esto de una manera inteligente, no es verdad, supongo, que de mucho tiempo. No vas a comparar todas las posibles combinaciones de [inaudible] cada vez que usted va a través de cada iteración. Pero aún así, cuando hablamos de este límite superior se dice que usted está mirando ² n comparaciones hasta el final. Vamos a volver, y ya que estamos empezando a conseguir un poco corto de tiempo Yo diría que sin duda debe pasar por el resto de esta tabla, llenar todo. Piense en ejemplos. Piense en ejemplos concretos. Es muy práctico y útil que hacer. Dibuja a cabo. Este es el tipo de tabla que a medida que avanza a través de la informática que realmente debería empezar a conocer estas corazón. Estos son el tipo de preguntas que usted consigue en las entrevistas. Estas son las clases de cosas que son buenas saber, y pensar en esos casos extremos, realmente encontrar la manera de pensar sabiendo que para ordenar la matriz burbuja peor posible para ordenar con que es el que está en el orden inverso. Punteros. Vamos a hablar un poco acerca de los punteros. En los últimos minutos que tenemos aquí Sé que esto es algo así como el archivo de E / S que es bastante nuevo. Cuando hablamos acerca de los punteros de la razón por la que quiero hablar de punteros es porque, primero, cuando estamos trabajando en C estamos realmente en un nivel bastante bajo en comparación con los lenguajes de programación más modernos. Somos realmente capaces de manipular las variables en la memoria, averiguar dónde se encuentra realmente dentro de nuestra memoria RAM. Una vez que haya llegado a tomar clases de sistema operativo que usted verá que es, de nuevo, una especie de abstracción. Eso no es realmente el caso. Tenemos memoria virtual que está ocultando los detalles de nuestra parte. Pero por ahora se puede asumir que cuando se tiene un programa, por ejemplo, cuando se inicia el funcionamiento de su programa-cifrado César Voy a volver a mi iPad realmente rápido- que en sus inicios su programa, si tiene, por ejemplo, 4 gigabytes de RAM en su computadora portátil, te quedas a un lado este trozo, y vamos a llamar a este RAM. Y comienza en un lugar al que vamos a llamar a 0, y termina en un lugar que vamos a llamar a 4 gigabytes. Realmente no puedo escribir. El hombre, que es hackeado. Cuando se ejecuta el programa el sistema operativo esculpe la memoria RAM, y especifica los diferentes segmentos para diferentes partes de su programa para vivir Aquí abajo esta zona es una especie de tierra de nadie. Cuando se sube un poco más aquí que tienes en realidad el lugar donde el código de la vida de sus programas. Ese código binario real, que en realidad archivo ejecutable se carga en memoria cuando se ejecuta un programa, y ​​vive en el segmento de código. Y a medida que se ejecuta el programa el procesador se ve en este segmento de código para averiguar cuál es la siguiente instrucción? ¿Cuál es la siguiente línea de código que necesita para ejecutar? También hay un segmento de datos, y es aquí donde las constantes de cadena se almacenan de que usted ha estado utilizando. Y luego más arriba hay un lugar llamado el montón. Tenemos acceso a la memoria de allí usando malloc, y luego hacia la parte superior de su programa ahí está la pila, y ahí es donde hemos estado jugando durante casi todo el principio. Esto no es a escala o nada. Mucho de esto es muy dependiente de la máquina, depende del sistema operativo, pero esto es relativamente cómo las cosas se chunked arriba. Cuando se ejecuta un programa y se declara una variable llamada x- Voy a dibujar otra casilla de abajo, y esto va a ser una RAM también. Y voy a mirar. Vamos a dibujar líneas irregulares para indicar que esto es sólo una pequeña parte de RAM y no todos de la misma medida que nos acercamos a la cima. Si yo declaro una variable entera llamada x, entonces lo que realmente consigue es un mapeo que se almacena en la tabla de símbolos del programa de mi que conecta la x nombre a esta región de memoria que he dibujado aquí entre las barras verticales. Si tengo una línea de código en mi programa que dice que x = 7 el procesador sabe "Oh, está bien, yo sé que la vida de x en esta ubicación en la memoria." "Voy a seguir adelante y escribir un 7 allí." ¿Cómo sabe qué ubicación es en la memoria? Bueno, que todo se hace en tiempo de compilación. El compilador se encarga de asignar en cada una de las variables que se van a ir y creación de una asignación especial o en lugar de conectar los puntos entre un símbolo y dónde se va, el nombre de una variable y donde va a vivir en la memoria. Pero resulta que en realidad podemos acceder a él en nuestros programas también. Esto se hace importante cuando empezamos a hablar de algunas de las estructuras de datos, que es un concepto que vamos a presentar en el futuro. Pero por ahora, lo que podemos saber es que puedo crear un puntero a esta ubicación, x. Por ejemplo, puede crear una variable puntero. Cuando creamos una variable puntero se utiliza la notación estrella. En este caso, se dice que yo voy a crear un puntero a un int. Es un tipo como cualquier otro. Le damos una variable como y, y luego lo puso igual a la dirección, a una dirección. En este caso, podemos establecer y señalar x tomando la dirección de x, que hacemos con este signo, y luego ponemos y apuntar a la misma. Lo que esto hace es esencialmente si miramos a nuestro RAM esto crea una variable independiente. Se va a llamar y, y cuando esta línea de código se ejecuta en realidad va a crear un puntero poco que solemos llamar como una flecha, y fija y para apuntar a x. Sí. [Estudiante] x Si ya es un puntero, que usted acaba de hacer int * y = x en lugar de tener el signo? Sí. Si x es ya un indicador, entonces se puede establecer dos punteros iguales entre sí, en cuyo caso y no indican la x, pero sería apuntar a cualquier x está apuntando. Por desgracia, estamos fuera de tiempo. Lo que quiero decir en este punto, podemos hablar de esto fuera de línea, pero yo diría que empezar a trabajar a través de este problema, # 14. Usted puede ver que hay ya un poco lleno en aquí por ti. Se puede ver que cuando declaramos 2 punteros, int * x e y *, y observe que señalar con el * al lado de la variable fue algo que se hizo el año pasado. Resulta que esto es similar a lo que estamos haciendo este año. No importa donde se escribe el * cuando usted está declarando el puntero. Pero hemos escrito la * junto al tipo de porque eso hace que sea muy claro que usted está declarando una variable puntero. Se puede ver que la declaración de los 2 punteros nos da 2 cajas. Aquí cuando nos pusimos x igual a malloc Lo que esto dice es dejar de lado la memoria en el montón. Esta pequeña caja aquí, este círculo, se encuentra en el montón. X está apuntando a la misma. Tenga en cuenta que y todavía no apunta a nada. Para conseguir la memoria-para almacenar el número 42 en x usaremos la notación qué? [Estudiante] * x = 42. Exactamente, x = 42. Eso significa seguir la flecha y tirar 42 en ese país. Aquí donde nos pusimos yyx tenemos y que apunta a x. De nuevo, esto es lo mismo que lo que Kevin dijo que nos propusimos y igual a x. Y no apunta a x. Más bien, está apuntando a lo que x está señalando así. Y, finalmente, en esta última caja hay 2 posibles cosas que podríamos hacer. Una de ellas es que podríamos decir * x = 13. La otra cosa es que podríamos decir-Alex, ¿sabes lo que podríamos hacer aquí? Se podría decir * x = 13 or- [Estudiante] Se puede decir cualquier cosa int. [Nate H.] Si esto se conoce como una variable int que podíamos hacer eso. También podríamos decir * y = 13 porque los dos están apuntando al mismo lugar, para poder utilizar cualquiera de ellas para llegar allí. Si. >> [Estudiante] ¿Qué aspecto tendría si nos limitamos a decir x int es de 13? Eso sería declarar una nueva variable llamada x, que no iba a funcionar. Tendríamos una colisión porque declaró que x sea un puntero hasta aquí. [Estudiante] Si acaba de tener esa declaración por sí mismo lo que se vería en términos del círculo? Si tuviéramos que x = 13 entonces tendríamos una caja, y en lugar de tener una flecha que sale de la caja que había empate como un 13. [Estudiante] En la caja. Bien. ¡Gracias por mirar y buena suerte en el concurso 0. [CS50.TV]