1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Artículo 4] [Menos Cómodo] 2 00:00:02,000 --> 00:00:04,000 [Nate Hardison] [Harvard University] 3 00:00:04,000 --> 00:00:07,000 [Esta es CS50.] [CS50.TV] 4 00:00:07,000 --> 00:00:10,000 >> Muy bien, bienvenidos de nuevo a la sección. 5 00:00:10,000 --> 00:00:13,000 En la sección de esta semana vamos a hacer un par de cosas. 6 00:00:13,000 --> 00:00:17,000 Vamos a la primera serie de problemas recapitulación 2, 7 00:00:17,000 --> 00:00:20,000 que es el conjunto de problemas César y Vigenère. 8 00:00:20,000 --> 00:00:23,000 Y luego vamos a bucear en Concurso 0 opinión 9 00:00:23,000 --> 00:00:26,000 y pasar un poco de tiempo volver a tapar lo que hemos hablado 10 00:00:26,000 --> 00:00:30,000 en cada una de las clases hasta el momento, y vamos a hacer unos cuantos problemas 11 00:00:30,000 --> 00:00:32,000 de concursos del año anterior. 12 00:00:32,000 --> 00:00:36,000 Así que ustedes tienen una buena manera de prepararse para eso. 13 00:00:36,000 --> 00:00:40,000 >> Para empezar, he arrancado un par de buenas soluciones 14 00:00:40,000 --> 00:00:45,000 para el conjunto de problema anterior, problema Set 2, en este espacio. 15 00:00:45,000 --> 00:00:48,000 Si ustedes todos los afectados en este enlace, 16 00:00:48,000 --> 00:00:53,000 y si hace clic en mi nombre y haga clic en mi primera revisión 17 00:00:53,000 --> 00:00:56,000 verás caesar.c, que es exactamente lo que estoy buscando. 18 00:00:56,000 --> 00:01:00,000 Vamos a hablar de esto muy rápidamente. 19 00:01:00,000 --> 00:01:02,000 Esto es sólo una solución de muestra. 20 00:01:02,000 --> 00:01:05,000 Esto no es necesariamente la solución perfecta. 21 00:01:05,000 --> 00:01:08,000 Hay muchas maneras diferentes de escribir esto, 22 00:01:08,000 --> 00:01:10,000 pero hay algunas cosas que yo quería destacar 23 00:01:10,000 --> 00:01:13,000 que vi cuando estaba clasificación, los errores más comunes que creo que 24 00:01:13,000 --> 00:01:18,000 esta solución hace un trabajo muy bueno de la dirección. 25 00:01:18,000 --> 00:01:22,000 >> La primera es tener algún tipo de comentario encabezado en la parte superior. 26 00:01:22,000 --> 00:01:25,000 En las líneas 1 a 7 se ven los detalles, 27 00:01:25,000 --> 00:01:28,000 ¿qué es exactamente este programa está haciendo. 28 00:01:28,000 --> 00:01:32,000 Una buena práctica estándar cuando estás escribiendo código C 29 00:01:32,000 --> 00:01:35,000 sin tener en cuenta si su programa está contenido en un solo archivo o 30 00:01:35,000 --> 00:01:38,000 si está dividido en varios archivos es tener algún tipo de 31 00:01:38,000 --> 00:01:40,000 orientar comentario en la cima. 32 00:01:40,000 --> 00:01:43,000 Esto es también para las personas que salen y escribir código en el mundo real. 33 00:01:43,000 --> 00:01:47,000 Aquí es donde van a poner la información de derechos de autor. 34 00:01:47,000 --> 00:01:50,000 A continuación se incluye el #. 35 00:01:50,000 --> 00:01:55,000 En la línea 16 no es esto # define, que vamos a volver en un poco. 36 00:01:55,000 --> 00:01:59,000 Y luego, una vez que la función se inicia, una vez que se inicia principales, 37 00:01:59,000 --> 00:02:03,000 ya que este programa ha sido todo contenido en una sola función 38 00:02:03,000 --> 00:02:09,000 la primera cosa que sucede-y esto es muy idiomático y típico de un programa en C 39 00:02:09,000 --> 00:02:14,000 que acoge los argumentos de línea de comandos-es que se comprueba inmediatamente 40 00:02:14,000 --> 00:02:18,000 >> para el recuento de argumentos, argc. 41 00:02:18,000 --> 00:02:24,000 Aquí vemos que este programa está a la espera 2 argumentos exactamente. 42 00:02:24,000 --> 00:02:27,000 Recuerde que hay que el primer argumento es el especial 43 00:02:27,000 --> 00:02:29,000 que siempre es el nombre del programa que está siendo ejecutado, 44 00:02:29,000 --> 00:02:31,000 el nombre del archivo ejecutable. 45 00:02:31,000 --> 00:02:36,000 Y lo que esto hace es que evita que el usuario ejecute el programa 46 00:02:36,000 --> 00:02:42,000 con argumentos más o menos. 47 00:02:42,000 --> 00:02:44,000 La razón por la que desea comprobar esto de inmediato se debe a que 48 00:02:44,000 --> 00:02:52,000 en realidad no podemos acceder a esta matriz argv aquí fiable 49 00:02:52,000 --> 00:02:55,000 hasta que hayamos comprobado para ver lo grande que es. 50 00:02:55,000 --> 00:02:58,000 >> Uno de los errores comunes que vi fue la gente inmediatamente iría en 51 00:02:58,000 --> 00:03:01,000 y apropiación de argv [1]. 52 00:03:01,000 --> 00:03:06,000 Habían agarrar el argumento clave de la matriz y se la a a i comprobar en ella, 53 00:03:06,000 --> 00:03:11,000 y luego se haría la prueba para argc, así como la prueba siguiente, 54 00:03:11,000 --> 00:03:16,000 si el primer argumento era de hecho un número entero, al mismo tiempo, 55 00:03:16,000 --> 00:03:20,000 y eso no funciona, porque en el caso de que no haya argumentos proporcionados 56 00:03:20,000 --> 00:03:26,000 te agarrar un argumento que no está allí o tratar de agarrar uno que no está allí. 57 00:03:26,000 --> 00:03:29,000 >> La otra cosa importante que se debe notar es que 58 00:03:29,000 --> 00:03:32,000 uno siempre quiere imprimir algún tipo de mensaje de error útil 59 00:03:32,000 --> 00:03:34,000 para el usuario para orientarlos. 60 00:03:34,000 --> 00:03:37,000 Estoy seguro de que tengo todos los programas de ejecución que de repente se bloquea, 61 00:03:37,000 --> 00:03:41,000 y se obtiene poco ridículo este cuadro de diálogo que aparece y dice 62 00:03:41,000 --> 00:03:44,000 algo terriblemente críptico y tal vez te da un código de error o algo por el estilo 63 00:03:44,000 --> 00:03:47,000 que no tiene sentido. 64 00:03:47,000 --> 00:03:50,000 Aquí es donde usted realmente quiere ofrecer algo útil 65 00:03:50,000 --> 00:03:54,000 y orientadas al usuario para que cuando se ejecute van "Oh," cara de palma. 66 00:03:54,000 --> 00:03:58,000 "Sé exactamente qué hacer. Sé cómo solucionar este problema." 67 00:03:58,000 --> 00:04:01,000 >> Si no se imprime un mensaje y luego se termina realmente 68 00:04:01,000 --> 00:04:04,000 dejando al usuario ir examinar su código fuente 69 00:04:04,000 --> 00:04:07,000 para averiguar lo que salió mal. 70 00:04:07,000 --> 00:04:11,000 También hay algunas veces que usted va a utilizar diferentes códigos de error. 71 00:04:11,000 --> 00:04:14,000 Aquí hemos usado uno para decir que fue un error, 72 00:04:14,000 --> 00:04:16,000 se produjo un error, se produjo un error. 73 00:04:16,000 --> 00:04:20,000 Programas más grandes, a menudo los programas que son llamados por otros programas, 74 00:04:20,000 --> 00:04:25,000 volverá algún tipo de códigos de error especiales en diferentes escenarios 75 00:04:25,000 --> 00:04:28,000 para comunicarse mediante programación qué otra manera 76 00:04:28,000 --> 00:04:32,000 sólo tiene que utilizar un mensaje agradable para Inglés. 77 00:04:32,000 --> 00:04:35,000 Cool. 78 00:04:35,000 --> 00:04:37,000 A medida que trabajamos hacia abajo, se puede ver que tirar la llave. 79 00:04:37,000 --> 00:04:40,000 Ponemos a prueba para ver si la llave encaja. 80 00:04:40,000 --> 00:04:42,000 Recibimos un mensaje del usuario. 81 00:04:42,000 --> 00:04:46,000 La razón por la que lo hacemos en este ciclo do while, y esto es algo que vamos a cubrir 82 00:04:46,000 --> 00:04:50,000 en poco poco, pero resulta que si escribe control D 83 00:04:50,000 --> 00:04:54,000 cuando usted consigue que GetString del sistema en el terminal 84 00:04:54,000 --> 00:04:59,000 lo que en realidad hace es que envía un carácter especial 85 00:04:59,000 --> 00:05:01,000 para el programa. 86 00:05:01,000 --> 00:05:05,000 Se llama la ELF o el carácter de fin de archivo. 87 00:05:05,000 --> 00:05:08,000 Y en ese caso, nuestra cadena de mensaje será nulo, 88 00:05:08,000 --> 00:05:14,000 así que no fue algo que nos registramos en el conjunto de problemas en sí. 89 00:05:14,000 --> 00:05:17,000 >> Pero a medida que avanzamos, ahora que hemos empezado a hablar de punteros 90 00:05:17,000 --> 00:05:21,000 y la asignación dinámica de memoria en el montón, 91 00:05:21,000 --> 00:05:25,000 comprobar la nula siempre que tenga una función que podría 92 00:05:25,000 --> 00:05:30,000 devolverá un valor nulo como valor es algo que usted desea conseguir en el hábito de hacerlo. 93 00:05:30,000 --> 00:05:33,000 Esto es aquí principalmente para ilustración. 94 00:05:33,000 --> 00:05:36,000 Pero cuando usted ve GetString en el futuro, 95 00:05:36,000 --> 00:05:41,000 por lo que desde el 4 de problemas, tendrá que tener esto en mente. 96 00:05:41,000 --> 00:05:44,000 Una vez más, esto no es un problema para cualquier problema 3, ya que no había cubierto todavía. 97 00:05:44,000 --> 00:05:53,000 Por último, llegamos a esta parte donde tenemos al bucle de cifrado principal, 98 00:05:53,000 --> 00:05:57,000 y hay un par de cosas que suceden aquí. 99 00:05:57,000 --> 00:06:02,000 En primer lugar, iterar sobre la cadena del mensaje completo en sí. 100 00:06:02,000 --> 00:06:07,000 Aquí hemos mantenido la llamada strlen en la condición, 101 00:06:07,000 --> 00:06:12,000 que algunos de ustedes han señalado, no es un gran camino por recorrer. 102 00:06:12,000 --> 00:06:15,000 Resulta que en este caso no lo es también grande, 103 00:06:15,000 --> 00:06:20,000 en parte porque estamos modificando el contenido del mensaje en sí mismo 104 00:06:20,000 --> 00:06:27,000 dentro del bucle for, por lo que si tenemos un mensaje que es 10 caracteres de longitud, 105 00:06:27,000 --> 00:06:32,000 la primera vez que empieces por bucle strlen volverá qué? 106 00:06:32,000 --> 00:06:35,000 10. 107 00:06:35,000 --> 00:06:40,000 >> Pero si a continuación, modifique mensaje, digamos que modificar su carácter 5th, 108 00:06:40,000 --> 00:06:46,000 y que tiramos en un carácter \ 0 en la 5 ª posición, 109 00:06:46,000 --> 00:06:49,000 en una iteración posterior strlen (mensaje) no devolverá lo que hizo 110 00:06:49,000 --> 00:06:52,000 la primera vez que reiteró, 111 00:06:52,000 --> 00:06:56,000 pero en vez volverán 5 porque tiramos en ese terminador nulo, 112 00:06:56,000 --> 00:06:59,000 y longitud de la cadena se define 113 00:06:59,000 --> 00:07:03,000 por la posición de que \ 0. 114 00:07:03,000 --> 00:07:09,000 En este caso, esta es una gran manera de ir porque lo estamos modificando en su lugar. 115 00:07:09,000 --> 00:07:13,000 Pero te das cuenta de que en realidad es sorprendentemente sencilla para encriptar 116 00:07:13,000 --> 00:07:16,000 si usted puede conseguir la matemática correcta. 117 00:07:16,000 --> 00:07:19,000 Todo lo que se requiere es comprobar si la carta que usted está buscando en 118 00:07:19,000 --> 00:07:21,000 es mayúscula o minúscula. 119 00:07:21,000 --> 00:07:24,000 >> La razón por la que sólo tienes que comprobar eso y no tienen que buscar 120 00:07:24,000 --> 00:07:27,000 el caso es alfa es porque 121 00:07:27,000 --> 00:07:30,000 si un carácter está en mayúsculas o minúsculas si es 122 00:07:30,000 --> 00:07:33,000 entonces es definitivamente un carácter alfabético, 123 00:07:33,000 --> 00:07:38,000 porque no tenemos cifras mayúsculas y minúsculas. 124 00:07:38,000 --> 00:07:41,000 La otra cosa que hacer, y esto es un poco difícil- 125 00:07:41,000 --> 00:07:45,000 es que hemos modificado el estándar de cifrado César fórmula 126 00:07:45,000 --> 00:07:49,000 que dimos en la especificación de problemas. 127 00:07:49,000 --> 00:07:52,000 La diferencia aquí es que nos resta 128 00:07:52,000 --> 00:07:58,000 en la capital del caso en mayúsculas A, y luego añadimos mayúscula 129 00:07:58,000 --> 00:08:02,000 copia en al final. 130 00:08:02,000 --> 00:08:05,000 >> Sé que algunos de ustedes han hecho esto en el código. 131 00:08:05,000 --> 00:08:09,000 ¿Alguno de ustedes hacen esto en sus presentaciones? 132 00:08:09,000 --> 00:08:13,000 Tú hiciste esto. ¿Puede explicar lo que esto hace, Sahb? 133 00:08:13,000 --> 00:08:18,000 Restando a cabo, ya que hizo un mod derecha después de ella, 134 00:08:18,000 --> 00:08:21,000 hay que sacarlo, por lo que de esta manera se obtiene [tos] posición. 135 00:08:21,000 --> 00:08:25,000 Y luego añadiendo de nuevo más tarde cambiado con el que usted quería. 136 00:08:25,000 --> 00:08:27,000 Sí, exactamente. 137 00:08:27,000 --> 00:08:32,000 ¿Qué Sahb dijo fue que cuando queremos añadir 138 00:08:32,000 --> 00:08:36,000 nuestro mensaje y nuestra llave juntos 139 00:08:36,000 --> 00:08:42,000 y luego mod que, mod que por NUM_LETTERS, 140 00:08:42,000 --> 00:08:50,000 si no aumentamos nuestro mensaje en la correspondiente gama de 0 a 25 en primer lugar, 141 00:08:50,000 --> 00:08:54,000 entonces puede ser que termine encima de conseguir un número muy raro 142 00:08:54,000 --> 00:08:59,000 porque los valores que estamos mirando cuando miramos mensaje [i], 143 00:08:59,000 --> 00:09:03,000 cuando nos fijamos en el carácter i de nuestro mensaje de texto sin formato, 144 00:09:03,000 --> 00:09:08,000 es un valor dentro de este rango desde 65 hasta 122 145 00:09:08,000 --> 00:09:13,000 sobre la base de los valores ASCII para mayúsculas A a través de minúsculas z. 146 00:09:13,000 --> 00:09:18,000 Y así, cuando lo mod por 26 o por NUM_LETTERS, 147 00:09:18,000 --> 00:09:23,000 ya que era nuestro # define arriba a la derecha aquí, 148 00:09:23,000 --> 00:09:28,000 que nos va a dar un valor que está en el rango de 0 a 25, 149 00:09:28,000 --> 00:09:30,000 y necesitamos una manera de escalar luego de que una copia de seguridad 150 00:09:30,000 --> 00:09:32,000 y conseguir que en el rango ASCII correspondiente. 151 00:09:32,000 --> 00:09:36,000 La forma más sencilla de hacerlo es a escala simplemente todo abajo 152 00:09:36,000 --> 00:09:39,000 en el rango de 0 a 25, para empezar, 153 00:09:39,000 --> 00:09:43,000 y luego cambiar todo de nuevo hasta el final. 154 00:09:43,000 --> 00:09:46,000 >> Otro error común que he visto personas se producen es que 155 00:09:46,000 --> 00:09:50,000 si no lo hacen realmente escalamiento inmediato 156 00:09:50,000 --> 00:09:53,000 y agrega mensaje y la clave juntos y se agregan, por ejemplo, 157 00:09:53,000 --> 00:09:58,000 en una variable char, el problema con el que 158 00:09:58,000 --> 00:10:01,000 es desde el mensaje [i] es un número relativamente grande para empezar con- 159 00:10:01,000 --> 00:10:05,000 recuerda que es por lo menos 65 años si se trata de un carácter en mayúscula- 160 00:10:05,000 --> 00:10:09,000 si usted tiene una llave grande, digamos, algo así como 100, 161 00:10:09,000 --> 00:10:13,000 y agrega los 2 juntos en un char firmado usted va a obtener un desbordamiento. 162 00:10:13,000 --> 00:10:17,000 Usted va a obtener un valor que es mayor que 127, 163 00:10:17,000 --> 00:10:22,000 que es el mayor valor que una variable de tipo char puede contener. 164 00:10:22,000 --> 00:10:26,000 Una vez más, es por eso que te gustaría hacer ese tipo de cosas, para empezar. 165 00:10:26,000 --> 00:10:29,000 Alguna gente tiene en torno a este caso, haciendo una cosa y si las pruebas 166 00:10:29,000 --> 00:10:33,000 para ver si se hubiera sobrepasado antes de hacerlo, 167 00:10:33,000 --> 00:10:36,000 pero de esta manera se pone alrededor de eso. 168 00:10:36,000 --> 00:10:40,000 Y luego, en esta solución que imprime toda la cadena en el último momento. 169 00:10:40,000 --> 00:10:45,000 Otras personas nos imprimió un carácter a la vez. Ambos son impresionantes. 170 00:10:45,000 --> 00:10:51,000 En este punto, es lo que ustedes tienen alguna pregunta, algún comentario acerca de esto? 171 00:10:51,000 --> 00:10:56,000 Cosas que te gustan, las cosas que no te gustan? 172 00:10:56,000 --> 00:10:58,000 >> Yo tenía una pregunta. 173 00:10:58,000 --> 00:11:01,000 Tal vez me lo perdí durante su explicación, pero ¿cómo funciona este programa 174 00:11:01,000 --> 00:11:07,000 omitir los espacios para la conexión de la llave de la longitud del texto? 175 00:11:07,000 --> 00:11:10,000 Esto es sólo César cifrado. >> Oh, lo siento, sí. 176 00:11:10,000 --> 00:11:13,000 Sí, vamos a ver eso. 177 00:11:13,000 --> 00:11:16,000 En el cifrado César nos dieron por que debido a que 178 00:11:16,000 --> 00:11:18,000 sólo volteado caracteres. 179 00:11:18,000 --> 00:11:27,000 Sólo les giró si estuvieran en mayúsculas o minúsculas. 180 00:11:27,000 --> 00:11:32,000 Ustedes sentir muy bien acerca de esto? 181 00:11:32,000 --> 00:11:34,000 Siéntase libre de copiar esta casa, lo toma, 182 00:11:34,000 --> 00:11:37,000 compararlo con lo que ustedes escribieron. 183 00:11:37,000 --> 00:11:42,000 Sin duda, no dude en enviar preguntas al respecto también. 184 00:11:42,000 --> 00:11:46,000 Y una vez más, se dan cuenta de que el objetivo en este caso con su problema establece 185 00:11:46,000 --> 00:11:50,000 no es hacer ustedes para escribir código perfecto para los conjuntos de problemas. 186 00:11:50,000 --> 00:11:57,000 Es una experiencia de aprendizaje. Si. 187 00:11:57,000 --> 00:12:01,000 >> Volver al do while, si es igual a null, 188 00:12:01,000 --> 00:12:06,000 tan nulo sólo significa nada, simplemente pulsa enter? 189 00:12:06,000 --> 00:12:12,000 Null es un valor de puntero especial, 190 00:12:12,000 --> 00:12:17,000 y usamos nulo cuando queremos decir 191 00:12:17,000 --> 00:12:23,000 tenemos una variable puntero que apunta a la nada. 192 00:12:23,000 --> 00:12:28,000 Y por lo que generalmente significa que esta variable, esta variable mensaje 193 00:12:28,000 --> 00:12:35,000 está vacío, y aquí, porque estamos utilizando el tipo CS50 cadena especial, 194 00:12:35,000 --> 00:12:37,000 ¿cuál es el tipo de serie CS50? 195 00:12:37,000 --> 00:12:42,000 ¿Has visto lo que es cuando David se retiró la capucha en la conferencia? 196 00:12:42,000 --> 00:12:44,000 Es un cobarde, es un puntero, ¿verdad? 197 00:12:44,000 --> 00:12:48,000 Bueno, sí. >> Es un char *. 198 00:12:48,000 --> 00:12:52,000 Y así realmente podemos reemplazar este 199 00:12:52,000 --> 00:12:56,000 aquí con el mensaje char *, 200 00:12:56,000 --> 00:13:04,000 y por lo que la función GetString, si no con éxito obtener una cadena del usuario, 201 00:13:04,000 --> 00:13:08,000 no se puede analizar una cadena y un caso en el que no se puede analizar una cadena 202 00:13:08,000 --> 00:13:11,000 es que si el usuario escribe el carácter de fin de archivo, el D control, 203 00:13:11,000 --> 00:13:17,000 que no es algo que suelen hacer, pero si eso sucede 204 00:13:17,000 --> 00:13:20,000 entonces la función devolverá el valor nulo como una forma de decir 205 00:13:20,000 --> 00:13:23,000 "Oye, no he tenido una cadena." 206 00:13:23,000 --> 00:13:27,000 ¿Qué pasaría si no ponemos mensaje = null, 207 00:13:27,000 --> 00:13:30,000 que es algo que no hemos estado haciendo ya? 208 00:13:30,000 --> 00:13:32,000 ¿Por qué sería eso un problema? 209 00:13:32,000 --> 00:13:38,000 Porque sé que hablamos un poco en la conferencia sobre pérdidas de memoria. 210 00:13:38,000 --> 00:13:42,000 Sí, vamos a hacer eso, y vamos a ver qué pasa. 211 00:13:42,000 --> 00:13:44,000 >> Basilio era cuestión ¿qué pasa si en realidad no tienen 212 00:13:44,000 --> 00:13:48,000 este mensaje = prueba nula? 213 00:13:48,000 --> 00:13:51,000 Vamos a desplazarse hasta la parte superior. 214 00:13:51,000 --> 00:13:53,000 Ustedes pueden comentar esto. 215 00:13:53,000 --> 00:13:55,000 En realidad, lo voy a guardar en una revisión. 216 00:13:55,000 --> 00:13:58,000 Esta será la Revisión 3. 217 00:13:58,000 --> 00:14:02,000 ¿Qué tienes que hacer para ejecutar este programa es que usted tiene que hacer clic en este icono se preparan aquí, 218 00:14:02,000 --> 00:14:04,000 y que tendrá que añadir un argumento a la misma. 219 00:14:04,000 --> 00:14:10,000 Vas a tener que darle el argumento clave, ya que queremos pasar en un argumento de línea de comandos. 220 00:14:10,000 --> 00:14:13,000 Aquí me voy a dar el número 3. Me gustan 3. 221 00:14:13,000 --> 00:14:19,000 Ahora el zoom de vuelta, la ejecución del programa. 222 00:14:19,000 --> 00:14:24,000 Se está ejecutando, la compilación, la construcción. 223 00:14:24,000 --> 00:14:27,000 Aquí vamos. Se espera que se indique. 224 00:14:27,000 --> 00:14:33,000 Si escribo en algo como hola-donde fue? 225 00:14:33,000 --> 00:14:38,000 Oh, mi programa tardó demasiado tiempo en ejecutarse. Me jawing durante demasiado tiempo. 226 00:14:38,000 --> 00:14:40,000 Aquí va. 227 00:14:40,000 --> 00:14:43,000 Ahora escribo en hola. 228 00:14:43,000 --> 00:14:46,000 Vemos que lo cifra adecuada. 229 00:14:46,000 --> 00:14:52,000 Ahora, ¿qué pasa si hacemos GetString del sistema para devolver nulo? 230 00:14:52,000 --> 00:14:57,000 Recuerda, dije que lo hicimos pulsando control D al mismo tiempo. 231 00:14:57,000 --> 00:14:59,000 Voy a desplazarse hasta aquí. Vamos a correr de nuevo. 232 00:14:59,000 --> 00:15:01,000 Construcción. Ahí va. 233 00:15:01,000 --> 00:15:04,000 Ahora bien, cuando llegué a control D 234 00:15:04,000 --> 00:15:12,000 Tengo esta línea que dice opt/sandbox50/bin/run.sh, fallo de segmentación. 235 00:15:12,000 --> 00:15:15,000 ¿Han visto eso antes? 236 00:15:15,000 --> 00:15:17,000 >> [Estudiante] ¿Por qué no->> Lo sentimos? 237 00:15:17,000 --> 00:15:20,000 [Estudiante] ¿Por qué no hay un volcado de memoria en este caso? 238 00:15:20,000 --> 00:15:26,000 El volcado de memoria es-la pregunta es ¿por qué no hay un volcado de memoria en esta lista? 239 00:15:26,000 --> 00:15:29,000 La cuestión es que no puede ser, pero el vaciado de memoria es un archivo 240 00:15:29,000 --> 00:15:31,000 que se almacena en el disco duro. 241 00:15:31,000 --> 00:15:34,000 En este caso hemos desactivado los volcados de memoria 242 00:15:34,000 --> 00:15:37,000 en el servidor de ejecución para que no haya personas seg fallas 243 00:15:37,000 --> 00:15:40,000 y la creación de toneladas de volcados de memoria. 244 00:15:40,000 --> 00:15:46,000 Pero usted puede conseguir uno. 245 00:15:46,000 --> 00:15:48,000 Los vaciados de memoria son el tipo de cosas que a menudo se puede deshabilitar, 246 00:15:48,000 --> 00:15:52,000 ya veces lo hace. 247 00:15:52,000 --> 00:15:55,000 El fallo de segmentación, para responder a su pregunta, Basil, 248 00:15:55,000 --> 00:16:00,000 es decir que tratamos de acceder a un puntero 249 00:16:00,000 --> 00:16:05,000 que no se ha configurado para que apunte a nada. 250 00:16:05,000 --> 00:16:09,000 Recuerde Binky en el video cuando intenta Binky 251 00:16:09,000 --> 00:16:12,000 ir acceder a un puntero que no está apuntando a algo? 252 00:16:12,000 --> 00:16:16,000 En este caso creo que, técnicamente, el puntero apunta a algo. 253 00:16:16,000 --> 00:16:20,000 Se apunta a null, lo que técnicamente es 0, 254 00:16:20,000 --> 00:16:25,000 pero que se define a estar en un segmento que no es accesible 255 00:16:25,000 --> 00:16:28,000 por su programa, por lo que obtener un fallo de segmentación 256 00:16:28,000 --> 00:16:31,000 porque no se está accediendo a la memoria que está en un segmento válido 257 00:16:31,000 --> 00:16:38,000 como el segmento de montón o el segmento de la pila o el segmento de datos. 258 00:16:38,000 --> 00:16:40,000 Cool. 259 00:16:40,000 --> 00:16:48,000 ¿Alguna pregunta más sobre César? 260 00:16:48,000 --> 00:16:51,000 >> Vamos a seguir adelante. Echemos un vistazo a la Revisión 2 muy rápido. 261 00:16:51,000 --> 00:17:00,000 Eso es Vigenère. 262 00:17:00,000 --> 00:17:04,000 Aquí en Vigenère 263 00:17:04,000 --> 00:17:06,000 vamos a caminar a través de éste con bastante rapidez, ya que, de nuevo, 264 00:17:06,000 --> 00:17:10,000 Vigenère y César son bastante similares. 265 00:17:10,000 --> 00:17:12,000 COMENTARIO DE CABECERA es antes, 266 00:17:12,000 --> 00:17:17,000 # Define es antes para evitar el uso de estos números mágicos. 267 00:17:17,000 --> 00:17:21,000 Lo bueno es decir que quería ir a 268 00:17:21,000 --> 00:17:23,000 un alfabeto diferente o algo por el estilo. 269 00:17:23,000 --> 00:17:26,000 En lugar de tener que ir a cambiar manualmente todos los 26 en el código 270 00:17:26,000 --> 00:17:30,000 podríamos cambiar esto a 27 o caer hacia abajo 271 00:17:30,000 --> 00:17:34,000 si estuviéramos usando alfabetos diferentes, lenguas diferentes. 272 00:17:34,000 --> 00:17:38,000 Una vez más, tenemos la comprobación del recuento de argumentos, 273 00:17:38,000 --> 00:17:42,000 y realmente casi se puede tomar esto como una plantilla. 274 00:17:42,000 --> 00:17:46,000 Casi todos los programas que usted escribe debe tener- 275 00:17:46,000 --> 00:17:50,000 si se toma argumentos de línea de comandos-alguna secuencia de líneas 276 00:17:50,000 --> 00:17:55,000 que dice así desde el principio. 277 00:17:55,000 --> 00:17:59,000 Esa es una de las pruebas de cordura primero que quiero hacer. 278 00:17:59,000 --> 00:18:03,000 >> Aquí lo que hicimos fue que se aseguró de que 279 00:18:03,000 --> 00:18:06,000 la palabra clave es válida, y que fue el segundo cheque que nos hizo. 280 00:18:06,000 --> 00:18:11,000 Note de nuevo que nos separamos esto desde argc y 2. 281 00:18:11,000 --> 00:18:14,000 Tenga en cuenta que en este caso una cosa que tenía que hacer era lugar 282 00:18:14,000 --> 00:18:18,000 de la utilización de un a i queríamos para validar la cadena completa, 283 00:18:18,000 --> 00:18:21,000 y con el fin de hacer que usted realmente tiene que ir carácter por carácter 284 00:18:21,000 --> 00:18:23,000 sobre la cadena. 285 00:18:23,000 --> 00:18:29,000 No hay una buena forma de llamar a algo en él 286 00:18:29,000 --> 00:18:31,000 porque incluso, por ejemplo, una i volverá a 0 287 00:18:31,000 --> 00:18:37,000 si no se puede analizar un número entero, de modo que ni siquiera funciona. 288 00:18:37,000 --> 00:18:42,000 De nuevo, bonito mensaje indicando al usuario exactamente lo que sucedió. 289 00:18:42,000 --> 00:18:45,000 Entonces aquí, de nuevo, también se ocupan de los casos en 290 00:18:45,000 --> 00:18:50,000 el usuario escribe un carácter de control D aleatorio. 291 00:18:50,000 --> 00:18:54,000 >> Y entonces Charlotte tenía una pregunta anterior sobre la forma en que gestionamos para saltar espacios 292 00:18:54,000 --> 00:18:57,000 en nuestra cadena aquí. 293 00:18:57,000 --> 00:19:00,000 Esto fue un poco similar a lo que hicimos con el programa de Myspace 294 00:19:00,000 --> 00:19:04,000 que hicimos en la sección, y trabajó la forma en que este 295 00:19:04,000 --> 00:19:08,000 es que nos devolvió la cantidad de letras que habíamos visto. 296 00:19:08,000 --> 00:19:13,000 A medida que entramos en la cadena del mensaje, ya que caminamos sobre el carácter por carácter, 297 00:19:13,000 --> 00:19:16,000 nos devolvió el índice como parte de nuestro bucle for, y luego nos devolvió también 298 00:19:16,000 --> 00:19:21,000 el número de letras, por lo que no caracteres especiales, que no son números, no blanco el espacio 299 00:19:21,000 --> 00:19:27,000 que habíamos visto en la variable independiente. 300 00:19:27,000 --> 00:19:33,000 Y a continuación, esta solución modifica la clave 301 00:19:33,000 --> 00:19:41,000 para obtener un entero de clave real, y lo hace sobre la marcha, 302 00:19:41,000 --> 00:19:47,000 justo antes de que luego se vuelve a cifrar el carácter real del mensaje. 303 00:19:47,000 --> 00:19:50,000 Hay algunas soluciones que eran perfectamente geniales 304 00:19:50,000 --> 00:19:58,000 que modificaría la tecla de arriba cuando las pruebas de validez de la clave. 305 00:19:58,000 --> 00:20:01,000 Además de asegurarse de que el carácter y la palabra clave 306 00:20:01,000 --> 00:20:05,000 fue un carácter alfabético que también lo convirtió en un entero 307 00:20:05,000 --> 00:20:13,000 en el rango de 0 a 25 para saltar entonces tener que hacer que más adelante en este bucle. 308 00:20:13,000 --> 00:20:18,000 Una vez más, vemos aquí es realmente el mismo código 309 00:20:18,000 --> 00:20:22,000 que se utilizó en Caesar en este punto. 310 00:20:22,000 --> 00:20:25,000 Lo estás haciendo exactamente lo mismo, así que el verdadero truco es encontrar la 311 00:20:25,000 --> 00:20:30,000 cómo convertir la palabra clave en un número entero. 312 00:20:30,000 --> 00:20:35,000 >> Una cosa que hemos hecho aquí es un poco denso 313 00:20:35,000 --> 00:20:39,000 Es hemos repetido esta frase, supongo que se podría llamar, 314 00:20:39,000 --> 00:20:45,000 3 veces por separado en las líneas 58, 59, y 61. 315 00:20:45,000 --> 00:20:52,000 ¿Puede alguien explicar qué es exactamente esta frase hace? 316 00:20:52,000 --> 00:20:55,000 Se accede a un personaje, como dijiste. 317 00:20:55,000 --> 00:20:59,000 Sí, es [inaudible] un personaje de la palabra clave, 318 00:20:59,000 --> 00:21:04,000 y lo que es el número de cartas visto porque sólo estás moviendo a lo largo de 319 00:21:04,000 --> 00:21:06,000 la palabra clave una vez que haya visto la carta, 320 00:21:06,000 --> 00:21:10,000 por lo que va a pasar con eficacia los espacios y cosas por el estilo. 321 00:21:10,000 --> 00:21:12,000 Sí, exactamente. 322 00:21:12,000 --> 00:21:16,000 Y luego, una vez que haya visto la palabra clave en blanco que acaba de mod por lo que regresar a su alrededor. 323 00:21:16,000 --> 00:21:18,000 Exactamente. Esa es una explicación perfecta. 324 00:21:18,000 --> 00:21:23,000 ¿Qué dijo Kevin es que queremos indizar en la palabra clave. 325 00:21:23,000 --> 00:21:28,000 Queremos obtener el carácter num_letters_seen, si se quiere, 326 00:21:28,000 --> 00:21:32,000 pero si num_letters_seen excede la longitud de la palabra clave, 327 00:21:32,000 --> 00:21:37,000 la forma de regresar al rango apropiado es que utilice el operador mod 328 00:21:37,000 --> 00:21:40,000 para envolver eficazmente alrededor. 329 00:21:40,000 --> 00:21:43,000 Por ejemplo, al igual que en el corto, nuestra palabra clave es tocino, 330 00:21:43,000 --> 00:21:46,000 y está a 5 letras. 331 00:21:46,000 --> 00:21:50,000 Pero hemos visto 6 cartas en nuestro texto plano en este momento 332 00:21:50,000 --> 00:21:52,000 y encriptada 6. 333 00:21:52,000 --> 00:21:57,000 Vamos a terminar el acceso a la num_letters_seen, 334 00:21:57,000 --> 00:22:00,000 que es 6, mod la longitud de la palabra clave, 5, 335 00:22:00,000 --> 00:22:04,000 y lo que vamos a conseguir 1, y así lo vamos a hacer es que vamos a 336 00:22:04,000 --> 00:22:14,000 acceder al interior del primer carácter de nuestra palabra clave en ese punto. 337 00:22:14,000 --> 00:22:21,000 >> Muy bien, cualquier pregunta sobre Vigenère 338 00:22:21,000 --> 00:22:26,000 antes de seguir adelante? 339 00:22:26,000 --> 00:22:31,000 Ustedes sentir muy bien acerca de esto? 340 00:22:31,000 --> 00:22:35,000 Genial, genial. 341 00:22:35,000 --> 00:22:38,000 Quiero para asegurarse de que ustedes están recibiendo la oportunidad de ver el código 342 00:22:38,000 --> 00:22:48,000 que creemos que se ve bien y tener la oportunidad de aprender de él. 343 00:22:48,000 --> 00:22:53,000 Esto va a ser la última vez que va a utilizar espacios para el momento, 344 00:22:53,000 --> 00:22:59,000 y vamos a la transición, y yo voy a ir a cs50.net/lectures 345 00:22:59,000 --> 00:23:06,000 para que podamos hacer un poco de revisión quiz. 346 00:23:06,000 --> 00:23:10,000 La mejor manera que creo que empezar a hacer test opinión 347 00:23:10,000 --> 00:23:15,000 que ha de venir a esta página Conferencias, cs50.net/lectures, 348 00:23:15,000 --> 00:23:20,000 y debajo de cada una de las partidas semana, así que si me veo aquí en la semana 0, 349 00:23:20,000 --> 00:23:27,000 Veo que tenemos una lista de temas que cubrimos en la semana 0. 350 00:23:27,000 --> 00:23:31,000 >> Si cualquiera de estos tópicos parecen poco familiares 351 00:23:31,000 --> 00:23:34,000 que sin duda querrá volver atrás y buscar en las notas de clase y, posiblemente, 352 00:23:34,000 --> 00:23:39,000 incluso leerlo a través de las conferencias, de ver de nuevo si desea 353 00:23:39,000 --> 00:23:44,000 para tener una idea de lo que está pasando con cada uno de estos temas. 354 00:23:44,000 --> 00:23:49,000 Diré, además, este año uno de los recursos frescos que tenemos 355 00:23:49,000 --> 00:23:55,000 Son estos pantalones cortos que hemos creado, y, si nos fijamos en la semana 0 356 00:23:55,000 --> 00:24:00,000 no tenemos todos los temas tratados, pero tenemos un buen número de ellos, 357 00:24:00,000 --> 00:24:03,000 algunos de los más difíciles, así que ver estos cortos otra vez 358 00:24:03,000 --> 00:24:08,000 es una buena manera de ponerse al día. 359 00:24:08,000 --> 00:24:15,000 En particular, me voy a poner en un enchufe para el 3 en la parte inferior, desde que hice eso. 360 00:24:15,000 --> 00:24:20,000 Pero si usted está luchando con el binario, bits, hexadecimal, ese tipo de cosas, 361 00:24:20,000 --> 00:24:22,000 binario es un gran lugar para comenzar. 362 00:24:22,000 --> 00:24:25,000 ASCII es otro que es bueno para ver también. 363 00:24:25,000 --> 00:24:31,000 Incluso puedes mirarme a la velocidad de 1.5x si voy demasiado lento para usted. 364 00:24:31,000 --> 00:24:35,000 Desde su opinión, no dude en hacerlo. 365 00:24:35,000 --> 00:24:40,000 >> Sólo para empezar muy rápido, vamos a ir a través de un par de estos problemas concursos 366 00:24:40,000 --> 00:24:44,000 sólo para batir rápidamente a través de estos. 367 00:24:44,000 --> 00:24:50,000 Por ejemplo, echemos un vistazo a 16 problema que tengo aquí arriba en el tablero. 368 00:24:50,000 --> 00:24:54,000 Tenemos este cálculo siguiente en binario, 369 00:24:54,000 --> 00:24:56,000 y queremos mostrar cualquier trabajo. 370 00:24:56,000 --> 00:24:59,000 Bueno, yo voy a dar a este un tiro. 371 00:24:59,000 --> 00:25:01,000 Ustedes deberían seguir junto con el papel, 372 00:25:01,000 --> 00:25:04,000 y vamos a hacer esto muy rápidamente. 373 00:25:04,000 --> 00:25:06,000 Queremos realizar el siguiente cálculo en binario. 374 00:25:06,000 --> 00:25:16,000 Tengo 00110010. 375 00:25:16,000 --> 00:25:27,000 Y voy a añadir a 00110010. 376 00:25:27,000 --> 00:25:30,000 Para los cálculos genios siguiendo a lo largo en casa, 377 00:25:30,000 --> 00:25:35,000 este es efectivamente multiplicando por 2. 378 00:25:35,000 --> 00:25:37,000 Vamos a empezar. 379 00:25:37,000 --> 00:25:39,000 Vamos a seguir el mismo algoritmo de adición que hacemos 380 00:25:39,000 --> 00:25:43,000 cuando sumamos números decimales entre sí. 381 00:25:43,000 --> 00:25:46,000 Realmente la única diferencia aquí es que la vuelta de bucle 382 00:25:46,000 --> 00:25:51,000 una vez que tenemos 1 + 1 en lugar de una vez que lleguemos a 10. 383 00:25:51,000 --> 00:25:53,000 >> Si partimos de la derecha, muy rápido, ¿cuál es el primer dígito? 384 00:25:53,000 --> 00:25:55,000 [Estudiante] 0. >> [Nate H.] 0. 385 00:25:55,000 --> 00:25:58,000 Grande, el segundo dígito? 386 00:25:58,000 --> 00:26:00,000 [Estudiante] 1. 387 00:26:00,000 --> 00:26:02,000 [Nate H.] Se trata de un 1? 1 + 1 es? 388 00:26:02,000 --> 00:26:04,000 [Estudiante] 10. 389 00:26:04,000 --> 00:26:08,000 [Nate H.] Exactamente, ¿cuál es el dígito que escribo justo debajo de los 2 suman? 390 00:26:08,000 --> 00:26:11,000 [Estudiante] 1, 0, ó 0 y luego llevar a la 1. 391 00:26:11,000 --> 00:26:15,000 [Nate H.] 0 y llevar a 1, exactamente. 392 00:26:15,000 --> 00:26:18,000 El próximo uno, Basil, que estás haciendo. 393 00:26:18,000 --> 00:26:20,000 ¿Cuál es la tercera? >> [Basil] 1. 394 00:26:20,000 --> 00:26:23,000 [Nate H.] 1, perfecto. Kevin? 395 00:26:23,000 --> 00:26:27,000 [Kevin] 0. >> [Nate H.] 0, Charlotte? 396 00:26:27,000 --> 00:26:30,000 [Charlotte] 0. >> [Nate H.] Sí, y ¿qué hago? 397 00:26:30,000 --> 00:26:32,000 [Estudiante] El 1. 398 00:26:32,000 --> 00:26:34,000 [Nate H.] ¿Y qué voy a hacer? Y entonces me lleve el 1. 399 00:26:34,000 --> 00:26:36,000 Perfecto, Sahb? >> [Sahb] Ahora usted tiene 1. 400 00:26:36,000 --> 00:26:40,000 [Nate H.] Y ¿Puedo hacer algo aquí? 401 00:26:40,000 --> 00:26:43,000 [Sahb] Entonces, por un lado tiene 1 porque te lleva a más de 1. 402 00:26:43,000 --> 00:26:49,000 [Nate H.] Great, asi que aquí podemos terminar. 403 00:26:49,000 --> 00:26:51,000 Cool. 404 00:26:51,000 --> 00:26:54,000 [Estudiante] ¿Tiene 0 + 0 = 0? 405 00:26:54,000 --> 00:26:56,000 0 + 0 = 0. 406 00:26:56,000 --> 00:27:01,000 1 + 1, como usted ha dicho, es de 10, o 1, 0, mejor dicho. 407 00:27:01,000 --> 00:27:07,000 10 es un nombre poco apropiado porque para mí 10 significa el número 10, 408 00:27:07,000 --> 00:27:12,000 y es la peculiaridad de la forma en que lo está representando cuando estamos escribiendo. 409 00:27:12,000 --> 00:27:20,000 Nos representan el número 2 por 1, 0, y el número 10 es ligeramente diferente. 410 00:27:20,000 --> 00:27:23,000 >> ¿Qué es una especie de agradable sobre binario es que realmente no son muchos 411 00:27:23,000 --> 00:27:25,000 casos, es necesario aprender. 412 00:27:25,000 --> 00:27:30,000 Hay 0 + 0 = 0, 0 + 1 = 1, 413 00:27:30,000 --> 00:27:34,000 1 + 1 es 0, y luego llevar a un 1, 414 00:27:34,000 --> 00:27:37,000 y entonces usted puede ver aquí en la tercera columna de la derecha 415 00:27:37,000 --> 00:27:40,000 hemos tenido este 1, 1 y 1. 416 00:27:40,000 --> 00:27:43,000 Y 1 + 1 + 1 es un 1, 417 00:27:43,000 --> 00:27:45,000 y llevar a otro 1. 418 00:27:45,000 --> 00:27:48,000 Cuando usted está haciendo la suma binaria, bastante simple. 419 00:27:48,000 --> 00:27:51,000 Me gustaría hacer un par de ellos más a la cordura comprobar vosotros mismos 420 00:27:51,000 --> 00:27:54,000 antes de ir ya que es 421 00:27:54,000 --> 00:28:00,000 probablemente algo que vamos a ver en el cuestionario. 422 00:28:00,000 --> 00:28:03,000 Ahora vamos a hacer esto que viene. 423 00:28:03,000 --> 00:28:06,000 Vamos a hacer problema 17. 424 00:28:06,000 --> 00:28:12,000 Vamos a convertir el siguiente número binario a decimal. 425 00:28:12,000 --> 00:28:28,000 Tengo 10100111001. 426 00:28:28,000 --> 00:28:33,000 Recuerde que en el video que hice binario 427 00:28:33,000 --> 00:28:36,000 Caminé a través de un par de ejemplos, y me mostró cómo 428 00:28:36,000 --> 00:28:41,000 todo funciona cuando usted lo está haciendo en decimal. 429 00:28:41,000 --> 00:28:45,000 Cuando se trabaja en la representación decimal Creo que estamos 430 00:28:45,000 --> 00:28:48,000 en este momento de nuestras vidas tan fluido en lo que 431 00:28:48,000 --> 00:28:53,000 que es bastante fácil de pasar por alto la mecánica de cómo funciona realmente. 432 00:28:53,000 --> 00:28:59,000 >> Pero para hacer un resumen rápido, si tengo el número 137 433 00:28:59,000 --> 00:29:06,000 esto significa realmente, y de nuevo, esto es en la representación decimal- 434 00:29:06,000 --> 00:29:19,000 el número 137 en decimal significa que tengo 1 x 100 + 3 x 10 + 7 x 1. 435 00:29:19,000 --> 00:29:22,000 Esto es todo permanecer en la pantalla. 436 00:29:22,000 --> 00:29:29,000 Y luego, si nos fijamos en los números aquí, 437 00:29:29,000 --> 00:29:34,000 100, 10 y 1, se ve que en realidad son todas las potencias de 10. 438 00:29:34,000 --> 00:29:43,000 Tengo 10 ², 10 ¹, y 10 para el cero. 439 00:29:43,000 --> 00:29:48,000 Tenemos un tipo similar de cosas en binario, 440 00:29:48,000 --> 00:29:55,000 excepto que nuestra base, como lo llamamos, está a 2 en lugar de 10. 441 00:29:55,000 --> 00:29:58,000 Estos resultados entre los 10 que he escrito hasta aquí en la parte inferior, 442 00:29:58,000 --> 00:30:02,000 esta ² 10, 10 ¹, 10 para el cero, 10 es nuestra base, 443 00:30:02,000 --> 00:30:08,000 y el exponente, 0, 1, o 2, 444 00:30:08,000 --> 00:30:14,000 está implícito en la posición del dígito en el número que se escribe. 445 00:30:14,000 --> 00:30:21,000 1, si nos fijamos en él, este 1 se encuentra en la 2 ª posición. 446 00:30:21,000 --> 00:30:27,000 El 3 está en la posición primera, y el 7 está en la posición 0 ª. 447 00:30:27,000 --> 00:30:35,000 Así es como se obtienen los exponentes que figuran a continuación para nuestras bases. 448 00:30:35,000 --> 00:30:40,000 >> A raíz de todo esto nos volveremos-en realidad, ¿sabes qué? 449 00:30:40,000 --> 00:30:43,000 Lo haremos-donde se fue mi botón de deshacer ir? 450 00:30:43,000 --> 00:30:45,000 Ahí va. 451 00:30:45,000 --> 00:30:47,000 Me encanta esta cosa deshacer. 452 00:30:47,000 --> 00:30:51,000 Después de esto creo que para mí al menos 453 00:30:51,000 --> 00:30:54,000 la forma más fácil de iniciar la conversión de un número binario 454 00:30:54,000 --> 00:30:57,000 o un número hexadecimal donde la base es 16 455 00:30:57,000 --> 00:31:02,000 y no 10 o 2 es seguir adelante y escribir 456 00:31:02,000 --> 00:31:09,000 las bases y exponentes para todos los números en mi número binario en la parte superior. 457 00:31:09,000 --> 00:31:14,000 Si partimos de izquierda a derecha, de nuevo, 458 00:31:14,000 --> 00:31:17,000 que es un poco contradictorio, 459 00:31:17,000 --> 00:31:23,000 Voy a volver al negro aquí, tenemos la 2 a la posición 0 ª, 460 00:31:23,000 --> 00:31:27,000 y entonces tenemos 2 ¹, 2 ², 461 00:31:27,000 --> 00:31:33,000 y luego 2 a la 3, 2 a la 4, 2 a la 5, 6, 462 00:31:33,000 --> 00:31:39,000 7, 8, 9, y 10. 463 00:31:39,000 --> 00:31:41,000 Estos números que he escrito fuera son todos los exponentes. 464 00:31:41,000 --> 00:31:48,000 Yo sólo escribí las bases aquí en los 3 primeros sólo por el espacio. 465 00:31:48,000 --> 00:31:50,000 >> En este punto, voy a seguir adelante y de hecho voy a borrar 466 00:31:50,000 --> 00:31:53,000 las cosas que hicimos en decimal, si te parece bien. 467 00:31:53,000 --> 00:31:57,000 Todos ustedes han entendí. 468 00:31:57,000 --> 00:32:05,000 Aquellos de ustedes viendo en línea Estoy seguro de que será capaz de rebobinar si me quieres. 469 00:32:05,000 --> 00:32:07,000 Cambio a la pluma. 470 00:32:07,000 --> 00:32:12,000 Ahora, ¿qué podemos hacer, si ustedes no están totalmente al día en sus potencias de 2, 471 00:32:12,000 --> 00:32:15,000 eso es totalmente cool. 472 00:32:15,000 --> 00:32:18,000 Sucede. Entiendo. 473 00:32:18,000 --> 00:32:23,000 Una vez tuve una entrevista de trabajo donde me dijeron que debo saber todas las potencias de 2 474 00:32:23,000 --> 00:32:26,000 a través de 2 a la 30. 475 00:32:26,000 --> 00:32:29,000 No era un trabajo que tengo. 476 00:32:29,000 --> 00:32:32,000 De todos modos, ustedes pueden seguir adelante y hacer los cálculos aquí, 477 00:32:32,000 --> 00:32:35,000 pero con el binario que no tiene mucho sentido, 478 00:32:35,000 --> 00:32:38,000 y tampoco tiene sentido con decimal o hexadecimal o bien, 479 00:32:38,000 --> 00:32:43,000 para hacer los cálculos de dónde tiene ceros. 480 00:32:43,000 --> 00:32:49,000 Usted puede ver que tengo 0 aquí, un 0 aquí, aquí 0, 0 aquí, aquí 0, 0 aquí. 481 00:32:49,000 --> 00:32:52,000 ¿Por qué no podría tener sentido para hacer los cálculos real 482 00:32:52,000 --> 00:32:56,000 para calcular la potencia apropiada de 2 para esa posición? 483 00:32:56,000 --> 00:32:59,000 Exactamente como dijo Charlotte, será 0. 484 00:32:59,000 --> 00:33:05,000 Bien podría ahorrarse el tiempo si el cálculo de potencias de 2 no es su punto fuerte. 485 00:33:05,000 --> 00:33:10,000 En este caso, sólo tendrá que calcular por 2 a 0, que es el-? 486 00:33:10,000 --> 00:33:12,000 [Estudiante] 1. 487 00:33:12,000 --> 00:33:14,000 [Nate H.] 1, 2 a la 3 que es-? 488 00:33:14,000 --> 00:33:16,000 [Estudiante] 8. >> [Nate H.] 8. 489 00:33:16,000 --> 00:33:18,000 2 a la 4? 490 00:33:18,000 --> 00:33:21,000 [Estudiante] 2. Lo siento, 1. 491 00:33:21,000 --> 00:33:26,000 [Nate H.] 2 a la 4 es 16, exactamente. 492 00:33:26,000 --> 00:33:28,000 2 a la 5, Kevin? >> 32. 493 00:33:28,000 --> 00:33:32,000 [Nate H.] 32, 2 a la 8? 494 00:33:32,000 --> 00:33:38,000 [Estudiante] 32 x 8, 256. 495 00:33:38,000 --> 00:33:41,000 [Nate H.] Perfect. 496 00:33:41,000 --> 00:33:43,000 Y 2 a los 10? 497 00:33:43,000 --> 00:33:45,000 [Estudiante] 1024. 498 00:33:45,000 --> 00:33:49,000 [Nate H.] Sí, 1024. 499 00:33:49,000 --> 00:33:57,000 >> Una vez que tenemos estos números podemos resumirlas. 500 00:33:57,000 --> 00:34:01,000 Y aquí es donde es muy importante hacer un par de cosas. 501 00:34:01,000 --> 00:34:07,000 Una de ellas es ir lento y revisar su trabajo. 502 00:34:07,000 --> 00:34:10,000 Se puede decir que hay un 1 al final de este número, 503 00:34:10,000 --> 00:34:15,000 así que definitivamente debe obtener un número impar como mi resultado, 504 00:34:15,000 --> 00:34:18,000 porque todos los demás van a ser números pares 505 00:34:18,000 --> 00:34:21,000 dado que se trata de un número binario. 506 00:34:21,000 --> 00:34:24,000 La otra cosa a hacer es si se llega a este punto de la prueba 507 00:34:24,000 --> 00:34:27,000 y lo has escrito hasta aquí 508 00:34:27,000 --> 00:34:30,000 y que está acabando el tiempo 509 00:34:30,000 --> 00:34:33,000 mirar el número de puntos que este problema merece la pena. 510 00:34:33,000 --> 00:34:40,000 Este problema, como se puede ver, si le doy la vuelta a mi computadora portátil muy rápido- 511 00:34:40,000 --> 00:34:44,000 este problema vale 2 puntos, por lo que este no es el tipo de adición 512 00:34:44,000 --> 00:34:47,000 usted debe ir a través si usted está realmente presionado por el tiempo. 513 00:34:47,000 --> 00:34:52,000 Pero vamos a volver a la iPad, y vamos a ir a través de él muy rápidamente. 514 00:34:52,000 --> 00:34:54,000 >> Me gusta hacer los números pequeños primero 515 00:34:54,000 --> 00:34:56,000 porque me parece que sea más fácil. 516 00:34:56,000 --> 00:35:00,000 Me gusta 32 y 8 porque van de la mano con bastante facilidad, y obtenemos 50. 517 00:35:00,000 --> 00:35:03,000 16 y 1 se 17. 518 00:35:03,000 --> 00:35:05,000 No tenemos 57 años, 519 00:35:05,000 --> 00:35:14,000 y entonces podemos hacer el resto de esto, así que podemos hacer 57, 156. 520 00:35:14,000 --> 00:35:16,000 Vamos. 521 00:35:16,000 --> 00:35:19,000 El hombre, bueno, vamos a ver. 522 00:35:19,000 --> 00:35:27,000 Tuvimos 57, 256 y 1024. 523 00:35:27,000 --> 00:35:31,000 En este punto, prefiero sólo tiene que ir a través. 524 00:35:31,000 --> 00:35:35,000 No tengo ni idea. Yo claramente que leer sobre esto. 525 00:35:35,000 --> 00:35:40,000 7, 6 y 4, se obtiene 17. 526 00:35:40,000 --> 00:35:42,000 1, 5, 5, 2, 13. 527 00:35:42,000 --> 00:35:45,000 Entonces tenemos 3, y entonces tenemos 1. 528 00:35:45,000 --> 00:35:52,000 1337. 529 00:35:52,000 --> 00:35:55,000 Huevo de Pascua, a nadie? 530 00:35:55,000 --> 00:35:59,000 ¿Alguien reconoce este número? 531 00:35:59,000 --> 00:36:02,000 Chris reconoce el número. ¿Qué significa eso, Chris? 532 00:36:02,000 --> 00:36:04,000 [Chris] Leet. 533 00:36:04,000 --> 00:36:11,000 Leet, así que si usted mira esto, parece que leet. 534 00:36:11,000 --> 00:36:15,000 Hacker cosas. Cuidado con ese tipo de cosas en el mediano plazo o el concurso, mejor dicho. 535 00:36:15,000 --> 00:36:19,000 Si usted ve ese tipo de cosas y que se esté preguntando "¿Eh," 536 00:36:19,000 --> 00:36:22,000 que en realidad podría significar algo. 537 00:36:22,000 --> 00:36:24,000 No se. David le gusta ponerlo pulg 538 00:36:24,000 --> 00:36:26,000 Es una buena manera de cordura comprobarlo. 539 00:36:26,000 --> 00:36:30,000 Como bien, puedo ver lo que está pasando. 540 00:36:30,000 --> 00:36:34,000 >> Esa es la Semana 1 0/Week cosas. 541 00:36:34,000 --> 00:36:39,000 Si cambiamos de nuevo a nuestro ordenador portátil ahora, 542 00:36:39,000 --> 00:36:46,000 alejar la imagen, y un par de otras cosas. 543 00:36:46,000 --> 00:36:50,000 Hay ASCII, lo que hemos estado haciendo un montón de los boletines de problemas. 544 00:36:50,000 --> 00:36:55,000 Esta noción de capital A. ¿Qué es eso realmente? 545 00:36:55,000 --> 00:36:57,000 Sabiendo que es el entero decimal. 546 00:36:57,000 --> 00:37:00,000 65 es lo que se asigna a la tabla ASCII, 547 00:37:00,000 --> 00:37:03,000 y eso es por lo tanto el equipo como lo escribe, 548 00:37:03,000 --> 00:37:06,000 y así es como hemos estado saliendo con la realidad escribiendo 549 00:37:06,000 --> 00:37:09,000 A la capital de carácter y el carácter a minúscula 550 00:37:09,000 --> 00:37:14,000 en algunas de estas soluciones y conjuntos de problemas que has estado haciendo. 551 00:37:14,000 --> 00:37:16,000 Un par de cosas más. 552 00:37:16,000 --> 00:37:25,000 Tenemos declaraciones, expresiones booleanas, condiciones, bucles, variables e hilos. 553 00:37:25,000 --> 00:37:29,000 >> Aquellos todo parece tener sentido en su mayor parte? 554 00:37:29,000 --> 00:37:35,000 Parte de esta terminología es un poco raro a veces. 555 00:37:35,000 --> 00:37:46,000 Me gusta pensar en un comunicado que para la mayor parte de algo que termina con un punto y coma. 556 00:37:46,000 --> 00:37:51,000 Declaraciones como x = 7, que establece una variable, 557 00:37:51,000 --> 00:37:54,000 presumiblemente llamado x = 7. 558 00:37:54,000 --> 00:38:01,000 Es de suponer que x es también un tipo que puede almacenar el número 7, 559 00:38:01,000 --> 00:38:05,000 por lo que es un int o un float o posiblemente un cortocircuito o una charla, 560 00:38:05,000 --> 00:38:07,000 algo por el estilo. 561 00:38:07,000 --> 00:38:12,000 Una expresión booleana es el uso de estos dos es igual a 562 00:38:12,000 --> 00:38:17,000 y la explosión igual a los iguales o no, menor que, mayor que, 563 00:38:17,000 --> 00:38:22,000 menos de o igual a, todo ese tipo de cosas. 564 00:38:22,000 --> 00:38:28,000 Las condiciones son, entonces, las declaraciones if else. 565 00:38:28,000 --> 00:38:32,000 Me gustaría recordar que no se puede tener una cosa sin la correspondiente if. 566 00:38:32,000 --> 00:38:37,000 Del mismo modo, no se puede tener una cosa sin la correspondiente si si. 567 00:38:37,000 --> 00:38:40,000 Loops, recordar los 3 tipos de lazos que hemos estado trabajando muy duro en ti 568 00:38:40,000 --> 00:38:43,000 desde hace un par de secciones y de los boletines de problemas. 569 00:38:43,000 --> 00:38:46,000 Usando hacer mientras que usted está recibiendo datos del usuario, 570 00:38:46,000 --> 00:38:51,000 Utilización de bucles while hasta que una determinada condición es verdadera, 571 00:38:51,000 --> 00:38:56,000 y luego usando los bucles for si necesita 572 00:38:56,000 --> 00:39:01,000 saber qué iteración del bucle Actualmente se encuentra en es como yo pienso. 573 00:39:01,000 --> 00:39:07,000 O si usted está haciendo una para cada carácter en una cadena que quiero hacer algo, 574 00:39:07,000 --> 00:39:15,000 para cada elemento de una matriz que quiero hacer algo a ese elemento. 575 00:39:15,000 --> 00:39:18,000 >> Temas y eventos. 576 00:39:18,000 --> 00:39:21,000 Estos no hemos cubierto en forma explícita en C, 577 00:39:21,000 --> 00:39:23,000 pero recuerda esto desde el principio. 578 00:39:23,000 --> 00:39:26,000 Esta es la idea de tener diferentes scripts. 579 00:39:26,000 --> 00:39:32,000 Esto también es esta noción de radiodifusión de un evento. 580 00:39:32,000 --> 00:39:37,000 Hay gente que no hizo uso de la radiodifusión en sus proyectos inicialmente, 581 00:39:37,000 --> 00:39:40,000 lo cual es totalmente cool, 582 00:39:40,000 --> 00:39:46,000 pero estas son dos maneras diferentes de manejar este problema más grande llamada la concurrencia, 583 00:39:46,000 --> 00:39:49,000 que es como se llega a ejecutar los programas de 584 00:39:49,000 --> 00:39:54,000 o aparentemente ejecutar al mismo tiempo? 585 00:39:54,000 --> 00:39:59,000 Diferentes tareas en ejecución mientras otras tareas también están en marcha. 586 00:39:59,000 --> 00:40:01,000 Así es como el sistema operativo parece que funciona. 587 00:40:01,000 --> 00:40:04,000 Esta es la razón, aunque, por ejemplo, 588 00:40:04,000 --> 00:40:10,000 Tengo mi navegador que se ejecuta, también puede convertirse en Spotify y reproducir una canción. 589 00:40:10,000 --> 00:40:14,000 Eso es más de una cosa conceptual de entender. 590 00:40:14,000 --> 00:40:17,000 Me gustaría echar un vistazo a los temas cortos 591 00:40:17,000 --> 00:40:21,000 si quieres aprender más sobre eso. 592 00:40:21,000 --> 00:40:26,000 >> Vamos a ver, creo que podría haber sido 593 00:40:26,000 --> 00:40:31,000 un problema en esta en uno de estos. 594 00:40:31,000 --> 00:40:35,000 Una vez más, creo que las discusiones y eventos que no son algo que vamos a cubrir en C 595 00:40:35,000 --> 00:40:41,000 sólo porque es mucho más difícil que en Scratch. 596 00:40:41,000 --> 00:40:44,000 Usted no debe preocuparse por ahí, pero sin duda a comprender los conceptos, 597 00:40:44,000 --> 00:40:47,000 entender lo que está pasando. 598 00:40:47,000 --> 00:40:52,000 Antes de seguir adelante, cualquier duda sobre la Semana 0 materiales? 599 00:40:52,000 --> 00:40:55,000 Todo el mundo siente bastante bien? 600 00:40:55,000 --> 00:41:03,000 Comprensión de las variables y lo que es una variable? 601 00:41:03,000 --> 00:41:08,000 >> Cambiando de tema. Semana 1. 602 00:41:08,000 --> 00:41:12,000 Un par de cosas aquí que no fueron cubiertos en particular 603 00:41:12,000 --> 00:41:21,000 en la revisión y prueba necesariamente también hay cosas más conceptuales para pensar. 604 00:41:21,000 --> 00:41:30,000 El primero es la noción de lo que el código fuente, compiladores y el código objeto son. 605 00:41:30,000 --> 00:41:32,000 ¿Alguien? Basil. 606 00:41:32,000 --> 00:41:37,000 Es de código objeto, quiero decir, el código fuente es lo que pone en clang, 607 00:41:37,000 --> 00:41:42,000 y el código objeto es lo que pone sonido metálico de manera que el ordenador puede leer el programa. 608 00:41:42,000 --> 00:41:44,000 Exactamente. 609 00:41:44,000 --> 00:41:47,000 El código fuente es el código C que en realidad se escribe arriba. 610 00:41:47,000 --> 00:41:50,000 El código objeto es lo que hay de sonido metálico. 611 00:41:50,000 --> 00:41:54,000 Es el 0 y 1 en que formato binario. 612 00:41:54,000 --> 00:41:59,000 Entonces lo que sucede es cuando usted tiene un montón de archivos de objetos, 613 00:41:59,000 --> 00:42:04,000 decir que se está compilando un proyecto o un programa que utiliza varios archivos de código fuente, 614 00:42:04,000 --> 00:42:09,000 que por convención se les da la extensión. c archivo. 615 00:42:09,000 --> 00:42:13,000 Es por eso que tenemos vigenère.c caesar.c,. 616 00:42:13,000 --> 00:42:18,000 Si va a escribir programas en Java se les da la extensión. Java. 617 00:42:18,000 --> 00:42:24,000 Programas Python tienen la extensión. Py frecuencia. 618 00:42:24,000 --> 00:42:26,000 >> Una vez que tenga los archivos c múltiples., De compilarlo. 619 00:42:26,000 --> 00:42:29,000 Clang escupe toda esta basura binaria. 620 00:42:29,000 --> 00:42:33,000 Entonces, ya que sólo quieren un programa 621 00:42:33,000 --> 00:42:37,000 tenéis el enlace enlazador todos estos ficheros objeto juntos 622 00:42:37,000 --> 00:42:40,000 en un archivo ejecutable. 623 00:42:40,000 --> 00:42:45,000 Esto es también lo que sucede cuando se utiliza la biblioteca CS50, por ejemplo. 624 00:42:45,000 --> 00:42:50,000 La biblioteca CS50 es a la vez que. Archivo de cabecera h 625 00:42:50,000 --> 00:42:53,000 que lea, que # includecs50.h. 626 00:42:53,000 --> 00:42:58,000 Y también es un archivo binario de la biblioteca especial 627 00:42:58,000 --> 00:43:02,000 que ha sido compilado que es 0s y 1s, 628 00:43:02,000 --> 00:43:08,000 y que-l, por lo que si nos remontamos a nuestros espacios y esperamos realmente rápido 629 00:43:08,000 --> 00:43:11,000 a lo que está pasando aquí cuando miramos a nuestro alcance clang, 630 00:43:11,000 --> 00:43:15,000 lo que tenemos es que este es nuestro archivo de código fuente aquí. 631 00:43:15,000 --> 00:43:18,000 Se trata de un montón de opciones del compilador. 632 00:43:18,000 --> 00:43:22,000 Y luego, al final, éstos-l enlace banderas en 633 00:43:22,000 --> 00:43:30,000 los archivos binarios reales de estas dos bibliotecas, la biblioteca del CS50 y luego la biblioteca matemática. 634 00:43:30,000 --> 00:43:35,000 >> Entender cada tipo de objeto files ' 635 00:43:35,000 --> 00:43:38,000 en el proceso de compilación es algo que usted quiere ser capaz de 636 00:43:38,000 --> 00:43:43,000 dar por lo menos un resumen de alto nivel de. 637 00:43:43,000 --> 00:43:46,000 Código fuente Código objeto entra sale. 638 00:43:46,000 --> 00:43:53,000 Archivos de código objeto unir, y se obtiene un archivo de hermoso, ejecutable. 639 00:43:53,000 --> 00:43:55,000 Cool. 640 00:43:55,000 --> 00:43:58,000 Aquí es también donde usted puede obtener errores en múltiples puntos 641 00:43:58,000 --> 00:44:00,000 en el proceso de compilación. 642 00:44:00,000 --> 00:44:04,000 Aquí es donde, por ejemplo, si usted toma esta bandera de unión, 643 00:44:04,000 --> 00:44:10,000 la bandera CS50, y lo omite en espacios o cuando se está ejecutando el código, 644 00:44:10,000 --> 00:44:13,000 aquí es donde usted obtendrá un error en la fase de vinculación, 645 00:44:13,000 --> 00:44:18,000 y el vinculador decir: "Oye, te llamó una función GetString 646 00:44:18,000 --> 00:44:20,000 que está en la biblioteca CS50 ". 647 00:44:20,000 --> 00:44:25,000 "Me dijiste que estaba en la biblioteca CS50, y no puedo encontrar el código para ello". 648 00:44:25,000 --> 00:44:28,000 Ahí es donde hay que relacionar, y eso es independiente 649 00:44:28,000 --> 00:44:33,000 de un error de compilación porque el compilador está mirando sintaxis y ese tipo de cosas. 650 00:44:33,000 --> 00:44:38,000 Es bueno saber lo que está pasando cuando. 651 00:44:38,000 --> 00:44:42,000 >> Otras cosas que debe saber. 652 00:44:42,000 --> 00:44:49,000 Yo diría que debe de echar un vistazo a la breve sobre encasillamiento realizado por Jordan 653 00:44:49,000 --> 00:44:55,000 para entender lo que son enteros bajo el capó, 654 00:44:55,000 --> 00:44:58,000 qué caracteres están bajo el capó. 655 00:44:58,000 --> 00:45:02,000 Cuando hablamos de ASCII y realmente se ven en la tabla ASCII, 656 00:45:02,000 --> 00:45:07,000 lo que está haciendo nos está dando una mirada bajo el capó 657 00:45:07,000 --> 00:45:13,000 la forma en que el equipo representa en realidad mayúscula y el dígito 7 658 00:45:13,000 --> 00:45:17,000 y una coma y un signo de interrogación. 659 00:45:17,000 --> 00:45:20,000 La computadora también tiene maneras especiales para representar 660 00:45:20,000 --> 00:45:23,000 el número 7 como un número entero. 661 00:45:23,000 --> 00:45:27,000 Tiene una forma especial para representar el número 7 como un número de punto flotante, 662 00:45:27,000 --> 00:45:29,000 y los que son muy diferentes. 663 00:45:29,000 --> 00:45:32,000 Encasillamiento es la forma de decirle a la computadora "Hey, quiero que conviertas 664 00:45:32,000 --> 00:45:37,000 de una representación a otra representación. " 665 00:45:37,000 --> 00:45:40,000 ¿Por qué no echar un vistazo a eso. 666 00:45:40,000 --> 00:45:44,000 >> También me gustaría echar un vistazo a la breve sobre las bibliotecas y la corta en los compiladores. 667 00:45:44,000 --> 00:45:47,000 Los que hablan del proceso de compilación, 668 00:45:47,000 --> 00:45:53,000 qué es una biblioteca, y repasar algunas de las preguntas que puede que te pregunté. 669 00:45:53,000 --> 00:45:55,000 Preguntas sobre la Semana 1 material? 670 00:45:55,000 --> 00:46:03,000 ¿Hay temas que aquí parecen enormes proporciones que le gustaría cubrir? 671 00:46:03,000 --> 00:46:07,000 Estoy tratando de soplar a través de la mayoría de estos temas anteriores para que podamos llegar a 672 00:46:07,000 --> 00:46:13,000 punteros y hacer un poco de recursividad. 673 00:46:13,000 --> 00:46:15,000 Pensamientos? 674 00:46:15,000 --> 00:46:19,000 Cualquier cosa que cubrir? 675 00:46:19,000 --> 00:46:21,000 Tiempo para un poco de chocolate tal vez? 676 00:46:21,000 --> 00:46:23,000 Ustedes están trabajando a través de él. 677 00:46:23,000 --> 00:46:26,000 Yo voy a seguir bebiendo mi café. 678 00:46:26,000 --> 00:46:31,000 Semana 2. 679 00:46:31,000 --> 00:46:34,000 Buena idea, buena idea. 680 00:46:34,000 --> 00:46:38,000 En la semana 2 hablamos un poco más acerca de las funciones. 681 00:46:38,000 --> 00:46:43,000 >> En los boletines de problemas primeras que realmente no escribir ninguna función en absoluto 682 00:46:43,000 --> 00:46:45,000 excepto que la función? 683 00:46:45,000 --> 00:46:47,000 [Estudiante] Principal. >> Principal, exactamente. 684 00:46:47,000 --> 00:46:51,000 Y por lo que hemos visto los diferentes trajes que viste principal. 685 00:46:51,000 --> 00:46:54,000 No es el único en el que no toma ningún argumento, 686 00:46:54,000 --> 00:46:58,000 y acabamos de decir nula entre los paréntesis, 687 00:46:58,000 --> 00:47:01,000 y luego está el otro en el que quieren tomar los argumentos de línea de comandos, 688 00:47:01,000 --> 00:47:08,000 y como hemos visto, ahí es donde tienes int argc y argv matriz de cadenas 689 00:47:08,000 --> 00:47:13,000 o ahora que hemos estado realmente expuestos a ser la cadena char * que es 690 00:47:13,000 --> 00:47:20,000 vamos a empezar a escribir como char * argv y luego entre paréntesis. 691 00:47:20,000 --> 00:47:22,000 En Boletín de problemas 3, ustedes vieron un montón de funciones, 692 00:47:22,000 --> 00:47:27,000 y ha implementado un montón de funciones, dibujar, mirar hacia arriba, scramble. 693 00:47:27,000 --> 00:47:31,000 Los prototipos fueron escritos allí para usted. 694 00:47:31,000 --> 00:47:33,000 >> Lo que yo quería hablar aquí con funciones muy rápido 695 00:47:33,000 --> 00:47:38,000 es que hay 3 partes de ellos cada vez que escribes una función. 696 00:47:38,000 --> 00:47:43,000 Debe especificar el tipo de retorno de la función. 697 00:47:43,000 --> 00:47:46,000 Tiene que especificar un nombre para la función, y entonces usted tiene que especificar 698 00:47:46,000 --> 00:47:51,000 la lista de argumentos o la lista de parámetros. 699 00:47:51,000 --> 00:47:57,000 Por ejemplo, si yo tuviera que escribir una función para resumir un montón de números enteros 700 00:47:57,000 --> 00:48:03,000 y luego vuelve a mí la suma que sería mi tipo de retorno 701 00:48:03,000 --> 00:48:06,000 si quería sumar números enteros y luego devolver la suma? 702 00:48:06,000 --> 00:48:12,000 A continuación, el nombre de la función. 703 00:48:12,000 --> 00:48:27,000 Si sigo adelante y escribir en verde, esta parte es el tipo de retorno. 704 00:48:27,000 --> 00:48:34,000 Esta parte es el nombre. 705 00:48:34,000 --> 00:48:40,000 Y luego entre paréntesis 706 00:48:40,000 --> 00:48:46,000 es donde me dan los argumentos, 707 00:48:46,000 --> 00:48:56,000 a menudo abreviado como argumentos, a veces llamado params para los parámetros. 708 00:48:56,000 --> 00:49:00,000 Y si usted tiene uno, usted sólo tiene que especificar el elegido. 709 00:49:00,000 --> 00:49:06,000 Si tiene varios de separar cada uno con una coma. 710 00:49:06,000 --> 00:49:13,000 Y para cada argumento que le dan 2 cosas que son-Kevin? 711 00:49:13,000 --> 00:49:18,000 [Kevin] Hay que dar el tipo y luego el nombre. 712 00:49:18,000 --> 00:49:21,000 Y luego el nombre, y el nombre es el nombre que se va a utilizar 713 00:49:21,000 --> 00:49:25,000 para referirse a ese argumento dentro de la función suma, 714 00:49:25,000 --> 00:49:27,000 dentro de la función que se está escribiendo actualmente. 715 00:49:27,000 --> 00:49:32,000 >> Usted no tiene que, por ejemplo, si yo voy a resumir, 716 00:49:32,000 --> 00:49:41,000 por ejemplo, una matriz de enteros-nosotros hacemos array int, 717 00:49:41,000 --> 00:49:46,000 y me voy a dar algunas llaves no- 718 00:49:46,000 --> 00:49:51,000 luego cuando pasa una matriz a la función suma 719 00:49:51,000 --> 00:49:55,000 Lo paso en la primera posición de la lista de argumentos. 720 00:49:55,000 --> 00:49:59,000 Pero la matriz que pasar en no tiene que tener el nombre arr. 721 00:49:59,000 --> 00:50:07,000 Arr va a ser cómo se refieren a que el argumento dentro del cuerpo de la función. 722 00:50:07,000 --> 00:50:10,000 La otra cosa que hay que tener en cuenta, 723 00:50:10,000 --> 00:50:14,000 y esto es un poco diferente de funciones, pero creo que es un punto importante, 724 00:50:14,000 --> 00:50:20,000 es que en C cuando estoy escribiendo una función como esta 725 00:50:20,000 --> 00:50:29,000 ¿cómo puedo saber cuántos elementos hay en esta serie? 726 00:50:29,000 --> 00:50:31,000 Esto es algo de una pregunta capciosa. 727 00:50:31,000 --> 00:50:35,000 Hemos hablado de esto un poco en la sección de la semana pasada. 728 00:50:35,000 --> 00:50:40,000 ¿Cómo puedo saber el número de elementos dentro de un array en C? 729 00:50:40,000 --> 00:50:44,000 ¿Hay alguna manera? 730 00:50:44,000 --> 00:50:49,000 >> Resulta que no hay forma de saberlo. 731 00:50:49,000 --> 00:50:52,000 Usted tiene que pasar por separado. 732 00:50:52,000 --> 00:50:55,000 Hay un truco que puedes hacer 733 00:50:55,000 --> 00:51:00,000 si estás en la misma función en la que se ha declarado la matriz, 734 00:51:00,000 --> 00:51:04,000 y se trabaja con una amplia chimenea. 735 00:51:04,000 --> 00:51:06,000 Pero eso sólo funciona si usted está en la misma función. 736 00:51:06,000 --> 00:51:09,000 Una vez que se pasa una matriz a otra función o si se ha declarado un array 737 00:51:09,000 --> 00:51:12,000 y pones esa matriz en el montón, que ha utilizado malloc 738 00:51:12,000 --> 00:51:15,000  y ese tipo de cosas, todas las apuestas están apagadas. 739 00:51:15,000 --> 00:51:18,000 Entonces usted realmente tiene que pasar alrededor de 740 00:51:18,000 --> 00:51:21,000 un argumento especial u otro parámetro 741 00:51:21,000 --> 00:51:23,000 que le dice qué tan grande es la matriz. 742 00:51:23,000 --> 00:51:28,000 En este caso, me gustaría utilizar una coma-lo siento, que va fuera de la pantalla aquí- 743 00:51:28,000 --> 00:51:32,000 y me gustaría pasar en otro argumento 744 00:51:32,000 --> 00:51:40,000  y lo llaman int len ​​para la longitud. 745 00:51:40,000 --> 00:51:44,000 >> Una cosa que pudiera surgir en el examen 746 00:51:44,000 --> 00:51:49,000 Se le pedirá que escriba o implementar una función particular que se llama algo así. 747 00:51:49,000 --> 00:51:54,000 Si nosotros no le damos el prototipo, por lo que todo esto aquí, 748 00:51:54,000 --> 00:51:58,000 todo este lío se llama la declaración de la función o el prototipo de función, 749 00:51:58,000 --> 00:52:01,000 esta es una de las primeras cosas que usted querrá concretar si no se le da 750 00:52:01,000 --> 00:52:03,000 a usted de inmediato en el cuestionario. 751 00:52:03,000 --> 00:52:06,000 El otro truco que he aprendido es que 752 00:52:06,000 --> 00:52:11,000 dicen que te dan un prototipo para una función, y decimos: "Oye, tienes que escribir". 753 00:52:11,000 --> 00:52:16,000 Dentro de las llaves que tiene en el cuestionario 754 00:52:16,000 --> 00:52:20,000 si usted nota que hay un tipo de retorno y nota que el tipo de cambio 755 00:52:20,000 --> 00:52:25,000 es algo distinto de vacío, lo que significa que la función no devuelve nada, 756 00:52:25,000 --> 00:52:28,000 entonces una cosa que debe de hacer es escribir 757 00:52:28,000 --> 00:52:33,000 algún tipo de instrucción de retorno en el final de la función. 758 00:52:33,000 --> 00:52:40,000 Retorno, y en este caso, vamos a poner un espacio en blanco, porque queremos llenar el espacio en blanco. 759 00:52:40,000 --> 00:52:44,000 Pero esto pone a pensar en la manera correcta de cómo voy a abordar este problema? 760 00:52:44,000 --> 00:52:49,000 Y te recuerda que vas a tener que devolver un valor 761 00:52:49,000 --> 00:52:51,000 a la llamada de la función. 762 00:52:51,000 --> 00:52:54,000 >> Si. >> [Estudiante] ¿El estilo se aplican cuando estamos escribiendo código en el concurso? 763 00:52:54,000 --> 00:52:58,000 Tal como sangría y ese tipo de cosas? >> [Estudiante] Yeah. 764 00:52:58,000 --> 00:53:00,000 No, no como mucho. 765 00:53:00,000 --> 00:53:09,000 Creo que mucho de esto es algo que vamos a aclarar en la prueba en el día de, 766 00:53:09,000 --> 00:53:15,000 pero por lo general incluye preocuparse por # y ese tipo de cosas, es una especie de fuera. 767 00:53:15,000 --> 00:53:17,000 [Estudiante] ¿Es necesario comentar su código escrito a mano? 768 00:53:17,000 --> 00:53:19,000 ¿Es necesario comentar su código escrito a mano? 769 00:53:19,000 --> 00:53:24,000 Comentando siempre es bueno si usted está preocupado acerca del crédito parcial 770 00:53:24,000 --> 00:53:29,000 o desea comunicar su intención a la motoniveladora. 771 00:53:29,000 --> 00:53:33,000 Pero, de nuevo, se aclarará en el propio concurso y en el día de concurso, 772 00:53:33,000 --> 00:53:39,000 pero no creo que se le requiere para escribir comentarios, no. 773 00:53:39,000 --> 00:53:42,000 Normalmente no, pero sin duda es el tipo de cosas que 774 00:53:42,000 --> 00:53:45,000 puede comunicar su intención, como "Hey, aquí es donde me voy con él." 775 00:53:45,000 --> 00:53:49,000 Y a veces eso puede ayudar con crédito parcial. 776 00:53:49,000 --> 00:53:51,000 Cool. 777 00:53:51,000 --> 00:53:53,000 >> Basil. 778 00:53:53,000 --> 00:53:56,000 [Basil] ¿Cuál es la diferencia entre declarar, por ejemplo, int lang 779 00:53:56,000 --> 00:54:03,000 en los argumentos o parámetros de comparación que se declara una variable dentro de la función? 780 00:54:03,000 --> 00:54:05,000 Wow, café bajó la tráquea. 781 00:54:05,000 --> 00:54:07,000 [Basil] Al igual que las cosas que queremos poner en argumentos. 782 00:54:07,000 --> 00:54:09,000 Sí, esa es una gran pregunta. 783 00:54:09,000 --> 00:54:11,000 ¿Cómo se elige qué cosas quieres poner en los argumentos 784 00:54:11,000 --> 00:54:17,000 frente a las cosas que usted debe hacer dentro de la función? 785 00:54:17,000 --> 00:54:24,000 En este caso se incluyeron tanto de éstos como argumentos 786 00:54:24,000 --> 00:54:29,000 porque son algo que todo el que se va a utilizar la función de suma 787 00:54:29,000 --> 00:54:32,000 tiene que especificar esas cosas. 788 00:54:32,000 --> 00:54:35,000 >> La función de suma, como hemos hablado, no tiene manera de saber 789 00:54:35,000 --> 00:54:40,000 qué tan grande es la matriz que recibe de su interlocutor o de quien está utilizando la función suma. 790 00:54:40,000 --> 00:54:44,000 No tiene forma de saber qué tan grande es esa matriz. 791 00:54:44,000 --> 00:54:48,000 La razón por la que pasamos en esta longitud de aquí como un argumento 792 00:54:48,000 --> 00:54:51,000 es porque eso es algo que básicamente estamos diciendo al llamador de la función, 793 00:54:51,000 --> 00:54:55,000 quien se va a utilizar la función de suma, "Hey, no sólo usted tiene que darnos una matriz 794 00:54:55,000 --> 00:54:59,000 de enteros, usted también tiene que decirnos cuán grande es la matriz que usted nos ha dado es ". 795 00:54:59,000 --> 00:55:03,000 [Basil] Los dos estarán argumentos de línea de comandos? 796 00:55:03,000 --> 00:55:06,000 No, estos son argumentos reales que le pasan a la función. 797 00:55:06,000 --> 00:55:10,000 >> Permítanme hacer una nueva página aquí. 798 00:55:10,000 --> 00:55:13,000 [Basil] Al igual nombre pasaría- 799 00:55:13,000 --> 00:55:24,000 [Nate H.] Si tengo int main (void) 800 00:55:24,000 --> 00:55:27,000 y me voy a poner en mi retorno 0 hasta aquí en la parte inferior, 801 00:55:27,000 --> 00:55:31,000 y digo que quiero llamar a la función suma. 802 00:55:31,000 --> 00:55:42,000 Quiero decir int x = sum (); 803 00:55:42,000 --> 00:55:46,000 Para utilizar la función suma tengo que pasar tanto en la matriz que quiero resumir 804 00:55:46,000 --> 00:55:51,000 y la longitud de la matriz, por lo que aquí es donde 805 00:55:51,000 --> 00:55:54,000 suponiendo que tenía una serie de enteros, 806 00:55:54,000 --> 00:56:12,000 decir que tenía int numbaz [] = 1, 2, 3, 807 00:56:12,000 --> 00:56:16,000 tipo de uso que hackeado sintaxis allí mismo, 808 00:56:16,000 --> 00:56:21,000 entonces lo que quiero hacer es en resumen me gustaría pasar en 809 00:56:21,000 --> 00:56:27,000 tanto numbaz y el número 3 810 00:56:27,000 --> 00:56:30,000 para decirle a la función sum "Bueno, aquí está la matriz Quiero que sumar." 811 00:56:30,000 --> 00:56:34,000 "Aquí está su tamaño". 812 00:56:34,000 --> 00:56:39,000 ¿Eso tiene sentido? ¿Responde eso a su pregunta? 813 00:56:39,000 --> 00:56:42,000 >> En muchos sentidos, lo hace paralelo lo que estamos haciendo con los principales 814 00:56:42,000 --> 00:56:44,000 cuando tenemos los argumentos de la línea de comandos. 815 00:56:44,000 --> 00:56:47,000 Un programa como el cifrado César, por ejemplo, que es necesario 816 00:56:47,000 --> 00:56:53,000 argumentos de línea de comandos no sería capaz de hacer cualquier cosa. 817 00:56:53,000 --> 00:56:57,000 No sabría cómo cifrar si no se lo dije a ella que tecla usar 818 00:56:57,000 --> 00:57:03,000 o si no se lo diga qué cadena que quería cifrar. 819 00:57:03,000 --> 00:57:08,000 Solicitud de una entrada, aquí es donde tenemos dos mecanismos diferentes 820 00:57:08,000 --> 00:57:14,000 para la toma de entrada desde el usuario, para tomar la información desde el usuario. 821 00:57:14,000 --> 00:57:19,000 Por problemas n 1 vimos este getInt, GetString, forma GetFloat 822 00:57:19,000 --> 00:57:26,000 de solicitud de una entrada, y que se llama mediante la secuencia de entrada estándar. 823 00:57:26,000 --> 00:57:28,000 Es un poco diferente. 824 00:57:28,000 --> 00:57:31,000 Es algo que se puede hacer de una sola vez en lugar de 825 00:57:31,000 --> 00:57:35,000 al invocar el programa, al iniciar el programa en ejecución. 826 00:57:35,000 --> 00:57:41,000 Los argumentos de línea de comandos todo se especifican cuando se inicia el funcionamiento del programa. 827 00:57:41,000 --> 00:57:47,000 Hemos estado mezclando los dos de ellos. 828 00:57:47,000 --> 00:57:52,000 Cuando usamos argumentos a una función, que es muy similar a los argumentos de línea de comandos al principal. 829 00:57:52,000 --> 00:57:56,000 Es cuando se invoca la función que hay que decir 830 00:57:56,000 --> 00:58:05,000 qué es exactamente lo que necesita para llevar a cabo sus tareas. 831 00:58:05,000 --> 00:58:08,000 Otra cosa agradable a la vista y te dejaré verlo en su tiempo libre, 832 00:58:08,000 --> 00:58:11,000 y fue cubierto en la prueba-fue la noción de alcance 833 00:58:11,000 --> 00:58:15,000 y las variables locales frente a las variables globales. 834 00:58:15,000 --> 00:58:18,000 Se presta atención a eso. 835 00:58:18,000 --> 00:58:23,000 >> Ahora que estamos llegando a estas otras cosas, 836 00:58:23,000 --> 00:58:27,000 en la semana 3 empezamos a hablar de búsqueda y ordenación. 837 00:58:27,000 --> 00:58:32,000 Búsqueda y clasificación, al menos en CS50, 838 00:58:32,000 --> 00:58:39,000 es en gran medida una introducción a algunas de las partes más teóricos de la informática. 839 00:58:39,000 --> 00:58:42,000 El problema de la búsqueda, el problema de la clasificación 840 00:58:42,000 --> 00:58:46,000 son problemas grandes y canónicas. 841 00:58:46,000 --> 00:58:52,000 ¿Cómo se puede encontrar un número concreto de una matriz de miles de millones de números enteros? 842 00:58:52,000 --> 00:58:55,000 ¿Cómo encontrar un nombre en particular dentro de una libreta de teléfonos 843 00:58:55,000 --> 00:58:59,000 que se almacena en su computadora portátil? 844 00:58:59,000 --> 00:59:04,000 Y, entonces, introducir la noción de tiempos de ejecución asintótica 845 00:59:04,000 --> 00:59:11,000 para cuantificar realmente cuánto tiempo, cuánto estos problemas son, 846 00:59:11,000 --> 00:59:14,000 el tiempo que tardan en resolver. 847 00:59:14,000 --> 00:59:20,000 En, creo, 2011 en el quiz de que hay un problema que creo que merece 848 00:59:20,000 --> 00:59:27,000 cubriendo muy rápidamente, lo que es este, problema 12. 849 00:59:27,000 --> 00:59:32,000 O no, es Omega. 850 00:59:32,000 --> 00:59:41,000 >> Aquí estamos hablando del tiempo de ejecución más rápida posible 851 00:59:41,000 --> 00:59:46,000 para un algoritmo particular y entonces el tiempo de ejecución más lenta posible. 852 00:59:46,000 --> 00:59:52,000 Esta Omega y O en realidad sólo son accesos directos. 853 00:59:52,000 --> 00:59:55,000 Son atajos de notación para decir 854 00:59:55,000 --> 00:59:59,000 la rapidez en el caso mejor será nuestro algoritmo de ejecución, 855 00:59:59,000 --> 01:00:06,000 y lo lento que en el peor caso posible que nuestro algoritmo de correr? 856 01:00:06,000 --> 01:00:10,000 Vamos a hacer un par de ellos, y éstos también fueron cubiertos 857 01:00:10,000 --> 01:00:13,000 en el corto en notación asintótica, que recomiendo encarecidamente. 858 01:00:13,000 --> 01:00:17,000 Jackson hizo un trabajo realmente bueno. 859 01:00:17,000 --> 01:00:23,000 Con la búsqueda binaria, hablamos de búsqueda binaria como un algoritmo, 860 01:00:23,000 --> 01:00:28,000 y solemos hablar de él en términos de su gran O. 861 01:00:28,000 --> 01:00:30,000 ¿Cuál es la gran O? 862 01:00:30,000 --> 01:00:34,000 ¿Cuál es el tiempo de ejecución más lenta posible de búsqueda binaria? 863 01:00:34,000 --> 01:00:36,000 [Estudiante] N ²? 864 01:00:36,000 --> 01:00:41,000 Close, supongo que similar a eso. 865 01:00:41,000 --> 01:00:43,000 Es mucho más rápido que eso. 866 01:00:43,000 --> 01:00:45,000 [Estudiante] Binary? >> Sí, la búsqueda binaria. 867 01:00:45,000 --> 01:00:47,000 [Estudiante] Es log n. 868 01:00:47,000 --> 01:00:49,000 Iniciar sesión n, así que lo que hace log n significa? 869 01:00:49,000 --> 01:00:51,000 Se reduce a la mitad cada iteración. 870 01:00:51,000 --> 01:00:56,000 Exactamente, en el caso más lento posible, 871 01:00:56,000 --> 01:01:00,000 decir si usted tiene una matriz ordenada 872 01:01:00,000 --> 01:01:08,000 de un millón de números enteros y el número que está buscando 873 01:01:08,000 --> 01:01:14,000 es o bien el primer elemento de la matriz o el elemento de último en la matriz. 874 01:01:14,000 --> 01:01:18,000 Recuerde, el algoritmo de búsqueda binaria funciona buscando en el elemento medio, 875 01:01:18,000 --> 01:01:21,000 ver si ese es el partido que usted está buscando. 876 01:01:21,000 --> 01:01:23,000 Si es así, entonces bien, lo encontraste. 877 01:01:23,000 --> 01:01:27,000 >> En el mejor caso posible, la velocidad binaria se ejecuta la búsqueda? 878 01:01:27,000 --> 01:01:29,000 [Los estudiantes] 1. 879 01:01:29,000 --> 01:01:32,000 1, es la constante de tiempo, gran O de 1. Si. 880 01:01:32,000 --> 01:01:36,000 [Estudiante] Tengo una pregunta. Cuando dices iniciar de n, que quieres decir con respecto a la base 2, no? 881 01:01:36,000 --> 01:01:40,000 Sí, así es la cosa. 882 01:01:40,000 --> 01:01:44,000 Decimos n de registro, y supongo que cuando yo estaba en la secundaria 883 01:01:44,000 --> 01:01:48,000 Siempre asumí que era log base 10. 884 01:01:48,000 --> 01:01:57,000 Sí, eso si, log 2 base típicamente es lo que usamos. 885 01:01:57,000 --> 01:02:02,000 Una vez más, volver a la búsqueda binaria, si usted está buscando, ya sea para 886 01:02:02,000 --> 01:02:05,000 el elemento en el final o el elemento en el principio, 887 01:02:05,000 --> 01:02:08,000 porque empiezas en el centro y luego de desechar 888 01:02:08,000 --> 01:02:13,000 cualquier medio no cumple con los criterios que usted está buscando, 889 01:02:13,000 --> 01:02:15,000 y te vas a la siguiente mitad y la otra mitad al lado y la siguiente media. 890 01:02:15,000 --> 01:02:19,000 Si estoy buscando el elemento más grande de la matriz de enteros millones 891 01:02:19,000 --> 01:02:25,000 Me voy a reducir a la mitad, a lo sumo registro de 1 millón de veces 892 01:02:25,000 --> 01:02:28,000 antes de que finalmente probar y ver que el elemento que estoy buscando 893 01:02:28,000 --> 01:02:33,000 se encuentra en el más grande o en el más alto índice de la matriz, 894 01:02:33,000 --> 01:02:38,000 y que se llevará registro de n, iniciar de 1 millón de veces. 895 01:02:38,000 --> 01:02:40,000 >> Ordenamiento de burbuja. 896 01:02:40,000 --> 01:02:43,000 ¿Ustedes recuerdan el algoritmo de ordenamiento de burbuja? 897 01:02:43,000 --> 01:02:47,000 Kevin, ¿me puede dar un resumen rápido de lo que sucedió en el algoritmo de ordenamiento de burbuja? 898 01:02:47,000 --> 01:02:50,000 [Kevin] Básicamente se pasa a través de todo en la lista. 899 01:02:50,000 --> 01:02:52,000 Se ve en las dos primeras. 900 01:02:52,000 --> 01:02:55,000 Si el primero es mayor que el segundo les swaps. 901 01:02:55,000 --> 01:02:58,000 A continuación, se compara la segunda y tercera, la misma cosa, swaps, 902 01:02:58,000 --> 01:03:00,000 tercero y cuarto, todo el camino hacia abajo. 903 01:03:00,000 --> 01:03:03,000 Mayores números seguirán hasta el final. 904 01:03:03,000 --> 01:03:07,000 Y después de muchos ciclos sin embargo ya está. 905 01:03:07,000 --> 01:03:11,000 Exactamente, es lo que Kevin dijo es que vamos a ver grandes números 906 01:03:11,000 --> 01:03:15,000 burbuja hasta el final de la matriz. 907 01:03:15,000 --> 01:03:19,000 Por ejemplo, ¿te importa caminar a través de este ejemplo, si esta es nuestra matriz? 908 01:03:19,000 --> 01:03:21,000 [Kevin] Usted tomará 2 y 3. 909 01:03:21,000 --> 01:03:23,000 3 es mayor que 2, por lo que intercambiarlas. 910 01:03:23,000 --> 01:03:29,000 [Nate H.] Derecho, por lo que cambiar esto, y por lo que tenemos 2, 3, 6, 4 y 9. 911 01:03:29,000 --> 01:03:31,000 [Kevin] A continuación, se comparan los 3 y 6. 912 01:03:31,000 --> 01:03:33,000 3 es menor que 6, por lo que ellos van, 913 01:03:33,000 --> 01:03:37,000 y 6 y 4, que te cambiarlos porque 4 es menor que 6. 914 01:03:37,000 --> 01:03:42,000 [Nate H.] Derecho, por lo que me sale 2, 3, 4, 6, 9. 915 01:03:42,000 --> 01:03:46,000 [Kevin] y 9 es mayor que 6, por lo que salir de él. 916 01:03:46,000 --> 01:03:48,000 Y te gustaría volver a través de él de nuevo. 917 01:03:48,000 --> 01:03:50,000 >> [Nate H.] ¿Me he hecho a estas alturas? >> [Kevin] No. 918 01:03:50,000 --> 01:03:52,000 ¿Y por qué no se me hace en este momento? 919 01:03:52,000 --> 01:03:54,000 Porque parece que mi matriz está ordenada. Estoy mirando. 920 01:03:54,000 --> 01:03:57,000 [Kevin] Ir a través de él de nuevo y asegúrese de que no son los swaps no más 921 01:03:57,000 --> 01:04:00,000 antes de que usted puede parar por completo. 922 01:04:00,000 --> 01:04:04,000 Exactamente lo que necesita para seguir adelante a través y asegúrese de que no hay swaps 923 01:04:04,000 --> 01:04:06,000 que se puede hacer en este momento. 924 01:04:06,000 --> 01:04:08,000 En realidad sólo era afortunado, como usted ha dicho, que terminamos 925 01:04:08,000 --> 01:04:12,000 sólo tener que hacer un pase a través de nosotros y estamos ordenados. 926 01:04:12,000 --> 01:04:16,000 Pero para hacer esto en el caso general, que realmente tendrá que hacer esto una y otra vez. 927 01:04:16,000 --> 01:04:20,000 Y de hecho, este fue un ejemplo de la mejor caso posible, 928 01:04:20,000 --> 01:04:24,000 como vimos en el problema. 929 01:04:24,000 --> 01:04:28,000 Hemos visto que el mejor caso posible se n. 930 01:04:28,000 --> 01:04:32,000 Fuimos a través de la matriz 1 vez. 931 01:04:32,000 --> 01:04:35,000 ¿Cuál es el peor caso posible para este algoritmo? 932 01:04:35,000 --> 01:04:37,000 [Kevin] N ². 933 01:04:37,000 --> 01:04:41,000 ¿Y eso qué aspecto tiene? ¿Cuál sería una mirada amplia como eso llevaría tiempo ² n? 934 01:04:41,000 --> 01:04:43,000 [Kevin] [inaudible] ordenados. 935 01:04:43,000 --> 01:04:51,000 Exactamente, así que si tuviera la serie 9, 7, 6, 5, 2, 936 01:04:51,000 --> 01:04:54,000 primero el 9 sería burbuja todo el camino hacia arriba. 937 01:04:54,000 --> 01:04:59,000 Después de 1 repetición tendríamos 7, 6, 5, 2, 9. 938 01:04:59,000 --> 01:05:07,000 Entonces el 7 hasta burbujearía, 6, 5, 2, 7, 9, y así sucesivamente y así sucesivamente. 939 01:05:07,000 --> 01:05:13,000 >> Tendríamos que ir a través de toda la matriz n veces, 940 01:05:13,000 --> 01:05:16,000 y de hecho puedes conseguir un poco más preciso que este 941 01:05:16,000 --> 01:05:23,000 porque una vez que nos hemos movido el 9 hasta el final hasta en su última posición posible 942 01:05:23,000 --> 01:05:26,000 sabemos que nunca tenemos que comparar ese elemento nuevo. 943 01:05:26,000 --> 01:05:29,000 Una vez que empezamos burbujeando el 7 hasta 944 01:05:29,000 --> 01:05:35,000 sabemos que podemos parar una vez que el 7 es justo antes de las 9 945 01:05:35,000 --> 01:05:37,000 pues ya hemos comparado la 9 a la misma. 946 01:05:37,000 --> 01:05:46,000 Si usted hace esto de una manera inteligente, no es verdad, supongo, que de mucho tiempo. 947 01:05:46,000 --> 01:05:49,000 No vas a comparar todas las posibles combinaciones de [inaudible] 948 01:05:49,000 --> 01:05:55,000 cada vez que usted va a través de cada iteración. 949 01:05:55,000 --> 01:05:59,000 Pero aún así, cuando hablamos de este límite superior se dice que 950 01:05:59,000 --> 01:06:04,000 usted está mirando ² n comparaciones hasta el final. 951 01:06:04,000 --> 01:06:12,000 >> Vamos a volver, y ya que estamos empezando a conseguir un poco corto de tiempo 952 01:06:12,000 --> 01:06:15,000 Yo diría que sin duda debe pasar por el resto de esta tabla, 953 01:06:15,000 --> 01:06:17,000 llenar todo. 954 01:06:17,000 --> 01:06:20,000 Piense en ejemplos. Piense en ejemplos concretos. 955 01:06:20,000 --> 01:06:22,000 Es muy práctico y útil que hacer. 956 01:06:22,000 --> 01:06:25,000 Dibuja a cabo. 957 01:06:25,000 --> 01:06:28,000 Este es el tipo de tabla que a medida que avanza a través de la informática 958 01:06:28,000 --> 01:06:32,000 que realmente debería empezar a conocer estas corazón. 959 01:06:32,000 --> 01:06:34,000 Estos son el tipo de preguntas que usted consigue en las entrevistas. 960 01:06:34,000 --> 01:06:36,000 Estas son las clases de cosas que son buenas saber, 961 01:06:36,000 --> 01:06:41,000 y pensar en esos casos extremos, realmente encontrar la manera de pensar 962 01:06:41,000 --> 01:06:45,000 sabiendo que para ordenar la matriz burbuja peor posible 963 01:06:45,000 --> 01:06:52,000 para ordenar con que es el que está en el orden inverso. 964 01:06:52,000 --> 01:06:58,000 >> Punteros. Vamos a hablar un poco acerca de los punteros. 965 01:06:58,000 --> 01:07:03,000 En los últimos minutos que tenemos aquí 966 01:07:03,000 --> 01:07:11,000 Sé que esto es algo así como el archivo de E / S que es bastante nuevo. 967 01:07:11,000 --> 01:07:19,000 Cuando hablamos acerca de los punteros de la razón por la que quiero hablar de punteros 968 01:07:19,000 --> 01:07:24,000 es porque, primero, cuando estamos trabajando en C 969 01:07:24,000 --> 01:07:33,000 estamos realmente en un nivel bastante bajo en comparación con los lenguajes de programación más modernos. 970 01:07:33,000 --> 01:07:38,000 Somos realmente capaces de manipular las variables en la memoria, 971 01:07:38,000 --> 01:07:43,000 averiguar dónde se encuentra realmente dentro de nuestra memoria RAM. 972 01:07:43,000 --> 01:07:46,000 Una vez que haya llegado a tomar clases de sistema operativo que usted verá 973 01:07:46,000 --> 01:07:48,000 que es, de nuevo, una especie de abstracción. 974 01:07:48,000 --> 01:07:50,000 Eso no es realmente el caso. 975 01:07:50,000 --> 01:07:52,000 Tenemos memoria virtual que está ocultando los detalles de nuestra parte. 976 01:07:52,000 --> 01:07:58,000 >> Pero por ahora se puede asumir que cuando se tiene un programa, 977 01:07:58,000 --> 01:08:02,000 por ejemplo, cuando se inicia el funcionamiento de su programa-cifrado César 978 01:08:02,000 --> 01:08:06,000 Voy a volver a mi iPad realmente rápido- 979 01:08:06,000 --> 01:08:12,000 que en sus inicios su programa, si tiene, por ejemplo, 980 01:08:12,000 --> 01:08:15,000 4 gigabytes de RAM en su computadora portátil, 981 01:08:15,000 --> 01:08:21,000 te quedas a un lado este trozo, y vamos a llamar a este RAM. 982 01:08:21,000 --> 01:08:25,000 Y comienza en un lugar al que vamos a llamar a 0, 983 01:08:25,000 --> 01:08:30,000 y termina en un lugar que vamos a llamar a 4 gigabytes. 984 01:08:30,000 --> 01:08:37,000 Realmente no puedo escribir. El hombre, que es hackeado. 985 01:08:37,000 --> 01:08:40,000 Cuando se ejecuta el programa 986 01:08:40,000 --> 01:08:44,000 el sistema operativo esculpe la memoria RAM, 987 01:08:44,000 --> 01:08:51,000 y especifica los diferentes segmentos para diferentes partes de su programa para vivir 988 01:08:51,000 --> 01:08:58,000 Aquí abajo esta zona es una especie de tierra de nadie. 989 01:08:58,000 --> 01:09:02,000 Cuando se sube un poco más aquí 990 01:09:02,000 --> 01:09:05,000 que tienes en realidad el lugar donde 991 01:09:05,000 --> 01:09:09,000 el código de la vida de sus programas. 992 01:09:09,000 --> 01:09:13,000 Ese código binario real, que en realidad archivo ejecutable se carga en memoria 993 01:09:13,000 --> 01:09:17,000 cuando se ejecuta un programa, y ​​vive en el segmento de código. 994 01:09:17,000 --> 01:09:22,000 Y a medida que se ejecuta el programa el procesador se ve en este segmento de código 995 01:09:22,000 --> 01:09:24,000 para averiguar cuál es la siguiente instrucción? 996 01:09:24,000 --> 01:09:27,000 ¿Cuál es la siguiente línea de código que necesita para ejecutar? 997 01:09:27,000 --> 01:09:31,000 >> También hay un segmento de datos, y es aquí donde las constantes de cadena 998 01:09:31,000 --> 01:09:34,000 se almacenan de que usted ha estado utilizando. 999 01:09:34,000 --> 01:09:42,000 Y luego más arriba hay un lugar llamado el montón. 1000 01:09:42,000 --> 01:09:46,000 Tenemos acceso a la memoria de allí usando malloc, 1001 01:09:46,000 --> 01:09:49,000 y luego hacia la parte superior de su programa 1002 01:09:49,000 --> 01:09:52,000 ahí está la pila, 1003 01:09:52,000 --> 01:09:57,000 y ahí es donde hemos estado jugando durante casi todo el principio. 1004 01:09:57,000 --> 01:09:59,000 Esto no es a escala o nada. 1005 01:09:59,000 --> 01:10:03,000 Mucho de esto es muy dependiente de la máquina, 1006 01:10:03,000 --> 01:10:10,000 depende del sistema operativo, pero esto es relativamente cómo las cosas se chunked arriba. 1007 01:10:10,000 --> 01:10:17,000 Cuando se ejecuta un programa y se declara una variable llamada x- 1008 01:10:17,000 --> 01:10:27,000 Voy a dibujar otra casilla de abajo, y esto va a ser una RAM también. 1009 01:10:27,000 --> 01:10:29,000 Y voy a mirar. 1010 01:10:29,000 --> 01:10:34,000 Vamos a dibujar líneas irregulares para indicar que esto es sólo una pequeña parte de RAM 1011 01:10:34,000 --> 01:10:38,000 y no todos de la misma medida que nos acercamos a la cima. 1012 01:10:38,000 --> 01:10:43,000 >> Si yo declaro una variable entera llamada x, 1013 01:10:43,000 --> 01:10:49,000 entonces lo que realmente consigue es un mapeo 1014 01:10:49,000 --> 01:10:54,000 que se almacena en la tabla de símbolos del programa de mi 1015 01:10:54,000 --> 01:11:00,000 que conecta la x nombre a esta región de memoria que he dibujado 1016 01:11:00,000 --> 01:11:03,000 aquí entre las barras verticales. 1017 01:11:03,000 --> 01:11:08,000 Si tengo una línea de código en mi programa que dice que x = 7 1018 01:11:08,000 --> 01:11:15,000 el procesador sabe "Oh, está bien, yo sé que la vida de x en esta ubicación en la memoria." 1019 01:11:15,000 --> 01:11:25,000 "Voy a seguir adelante y escribir un 7 allí." 1020 01:11:25,000 --> 01:11:28,000 ¿Cómo sabe qué ubicación es en la memoria? 1021 01:11:28,000 --> 01:11:30,000 Bueno, que todo se hace en tiempo de compilación. 1022 01:11:30,000 --> 01:11:34,000 El compilador se encarga de asignar en cada una de las variables que se van a ir 1023 01:11:34,000 --> 01:11:40,000 y creación de una asignación especial o en lugar de conectar los puntos 1024 01:11:40,000 --> 01:11:43,000 entre un símbolo y dónde se va, el nombre de una variable 1025 01:11:43,000 --> 01:11:46,000 y donde va a vivir en la memoria. 1026 01:11:46,000 --> 01:11:50,000 Pero resulta que en realidad podemos acceder a él en nuestros programas también. 1027 01:11:50,000 --> 01:11:55,000 Esto se hace importante cuando empezamos a hablar de algunas de las estructuras de datos, 1028 01:11:55,000 --> 01:11:58,000 que es un concepto que vamos a presentar en el futuro. 1029 01:11:58,000 --> 01:12:09,000 >> Pero por ahora, lo que podemos saber es que puedo crear un puntero a esta ubicación, x. 1030 01:12:09,000 --> 01:12:12,000 Por ejemplo, puede crear una variable puntero. 1031 01:12:12,000 --> 01:12:16,000 Cuando creamos una variable puntero se utiliza la notación estrella. 1032 01:12:16,000 --> 01:12:21,000 En este caso, se dice que yo voy a crear un puntero a un int. 1033 01:12:21,000 --> 01:12:24,000 Es un tipo como cualquier otro. 1034 01:12:24,000 --> 01:12:27,000 Le damos una variable como y, 1035 01:12:27,000 --> 01:12:32,000 y luego lo puso igual a la dirección, a una dirección. 1036 01:12:32,000 --> 01:12:38,000 En este caso, podemos establecer y señalar x 1037 01:12:38,000 --> 01:12:43,000 tomando la dirección de x, que hacemos con este signo, 1038 01:12:43,000 --> 01:12:55,000 y luego ponemos y apuntar a la misma. 1039 01:12:55,000 --> 01:12:59,000 Lo que esto hace es esencialmente si miramos a nuestro RAM 1040 01:12:59,000 --> 01:13:02,000 esto crea una variable independiente. 1041 01:13:02,000 --> 01:13:04,000 Se va a llamar y, 1042 01:13:04,000 --> 01:13:06,000 y cuando esta línea de código se ejecuta 1043 01:13:06,000 --> 01:13:13,000 en realidad va a crear un puntero poco que solemos llamar como una flecha, 1044 01:13:13,000 --> 01:13:15,000 y fija y para apuntar a x. 1045 01:13:15,000 --> 01:13:17,000 Sí. 1046 01:13:17,000 --> 01:13:19,000 [Estudiante] x Si ya es un puntero, que usted acaba de hacer 1047 01:13:19,000 --> 01:13:22,000 int * y = x en lugar de tener el signo? 1048 01:13:22,000 --> 01:13:24,000 Sí. 1049 01:13:24,000 --> 01:13:27,000 Si x es ya un indicador, entonces se puede establecer dos punteros iguales entre sí, 1050 01:13:27,000 --> 01:13:30,000 en cuyo caso y no indican la x, 1051 01:13:30,000 --> 01:13:34,000 pero sería apuntar a cualquier x está apuntando. 1052 01:13:34,000 --> 01:13:37,000 Por desgracia, estamos fuera de tiempo. 1053 01:13:37,000 --> 01:13:44,000 >> Lo que quiero decir en este punto, podemos hablar de esto fuera de línea, 1054 01:13:44,000 --> 01:13:49,000 pero yo diría que empezar a trabajar a través de este problema, # 14. 1055 01:13:49,000 --> 01:13:53,000 Usted puede ver que hay ya un poco lleno en aquí por ti. 1056 01:13:53,000 --> 01:13:57,000 Se puede ver que cuando declaramos 2 punteros, int * x e y *, 1057 01:13:57,000 --> 01:14:01,000 y observe que señalar con el * al lado de la variable fue algo que se hizo el año pasado. 1058 01:14:01,000 --> 01:14:05,000 Resulta que esto es similar a lo que estamos haciendo este año. 1059 01:14:05,000 --> 01:14:11,000 No importa donde se escribe el * cuando usted está declarando el puntero. 1060 01:14:11,000 --> 01:14:17,000 Pero hemos escrito la * junto al tipo de 1061 01:14:17,000 --> 01:14:24,000 porque eso hace que sea muy claro que usted está declarando una variable puntero. 1062 01:14:24,000 --> 01:14:27,000 Se puede ver que la declaración de los 2 punteros nos da 2 cajas. 1063 01:14:27,000 --> 01:14:31,000 Aquí cuando nos pusimos x igual a malloc 1064 01:14:31,000 --> 01:14:34,000 Lo que esto dice es dejar de lado la memoria en el montón. 1065 01:14:34,000 --> 01:14:41,000 Esta pequeña caja aquí, este círculo, se encuentra en el montón. 1066 01:14:41,000 --> 01:14:43,000 X está apuntando a la misma. 1067 01:14:43,000 --> 01:14:46,000 Tenga en cuenta que y todavía no apunta a nada. 1068 01:14:46,000 --> 01:14:50,000 Para conseguir la memoria-para almacenar el número 42 en x 1069 01:14:50,000 --> 01:14:55,000 usaremos la notación qué? 1070 01:14:55,000 --> 01:14:59,000 [Estudiante] * x = 42. 1071 01:14:59,000 --> 01:15:01,000 Exactamente, x = 42. 1072 01:15:01,000 --> 01:15:06,000 Eso significa seguir la flecha y tirar 42 en ese país. 1073 01:15:06,000 --> 01:15:09,000 Aquí donde nos pusimos yyx tenemos y que apunta a x. 1074 01:15:09,000 --> 01:15:13,000 De nuevo, esto es lo mismo que lo que Kevin dijo que nos propusimos y igual a x. 1075 01:15:13,000 --> 01:15:15,000 Y no apunta a x. 1076 01:15:15,000 --> 01:15:19,000 Más bien, está apuntando a lo que x está señalando así. 1077 01:15:19,000 --> 01:15:24,000 >> Y, finalmente, en esta última caja hay 2 posibles cosas que podríamos hacer. 1078 01:15:24,000 --> 01:15:28,000 Una de ellas es que podríamos decir * x = 13. 1079 01:15:28,000 --> 01:15:33,000 La otra cosa es que podríamos decir-Alex, ¿sabes lo que podríamos hacer aquí? 1080 01:15:33,000 --> 01:15:37,000 Se podría decir * x = 13 or- 1081 01:15:37,000 --> 01:15:41,000 [Estudiante] Se puede decir cualquier cosa int. 1082 01:15:41,000 --> 01:15:45,000 [Nate H.] Si esto se conoce como una variable int que podíamos hacer eso. 1083 01:15:45,000 --> 01:15:49,000 También podríamos decir * y = 13 porque los dos están apuntando al mismo lugar, 1084 01:15:49,000 --> 01:15:51,000 para poder utilizar cualquiera de ellas para llegar allí. 1085 01:15:51,000 --> 01:15:56,000 Si. >> [Estudiante] ¿Qué aspecto tendría si nos limitamos a decir x int es de 13? 1086 01:15:56,000 --> 01:16:00,000 Eso sería declarar una nueva variable llamada x, que no iba a funcionar. 1087 01:16:00,000 --> 01:16:04,000 Tendríamos una colisión porque declaró que x sea un puntero hasta aquí. 1088 01:16:04,000 --> 01:16:10,000 [Estudiante] Si acaba de tener esa declaración por sí mismo lo que se vería en términos del círculo? 1089 01:16:10,000 --> 01:16:14,000 Si tuviéramos que x = 13 entonces tendríamos una caja, y en lugar de tener una flecha 1090 01:16:14,000 --> 01:16:16,000 que sale de la caja que había empate como un 13. 1091 01:16:16,000 --> 01:16:19,000 [Estudiante] En la caja. Bien. 1092 01:16:19,000 --> 01:16:24,000 >> ¡Gracias por mirar y buena suerte en el concurso 0. 1093 01:16:24,000 --> 01:16:28,000 [CS50.TV]