[Powered by Google Translate] [Tutorial - Set Problema 2]
[Zamyla Chan - Harvard University]
[Esta es CS50. CS50.TV]
Está bien. Hola a todos y bienvenidos a Tutorial 2.
En primer lugar, quiero felicitar a usted por terminar conjunto de procesadores 1.
Sé que podría haber sido un poco difícil para algunos de ustedes,
podría haber sido su primer programa de ordenador que usted escribió,
pero recuerda que al final de esto, cuando uno mira hacia atrás al final del semestre,
podrás ver pset 1 y que va a decir, "Hey, yo podría haber hecho que en 5 minutos".
Así que conoce y confía en que a finales de este siempre encontrarás un conjunto de procesadores muy simples.
Pero por ahora es un gran logro, y felicidades por conseguir que se hagan.
Ahora, también una nota rápida antes de entrar en la carne del tutorial.
Sólo quiero hacer una nota rápida que a veces no tienen tiempo suficiente
durante las visitas guiadas para ir a través de todas las formas posibles de hacer el conjunto de problemas
y en vez sólo tal vez centrarse en 1 o 2 tipos de implementaciones,
maneras que usted puede hacer esto.
Pero eso no quiere decir que está prohibido hacer de otra manera.
A menudo, como ocurre con la informática, muchas maneras de hacer las cosas,
y por lo que definitivamente no dude en utilizar un tipo diferente de solución de lo que pudo haber presentado.
[Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net]
[Pset2 - 0. Una sección de preguntas - 1. César - 2. Vigenére]
Está bien. Así problema 2: Crypto es una diversión.
Una vez más, con cada conjunto de procesadores usted comenzará con una sección de preguntas
que va a llevar a cabo en sus secciones con su compañero de enseñanza asignado.
No vamos a ir a través de estos sobre el tutorial,
pero sin duda le ayudará a completar el conjunto de procesadores.
Así que la primera parte del conjunto problema es César.
Y así, en César alguien le pase una tecla con un número entero,
y usted cifrar una cadena de texto que le proporcionan
y devolverles algo encriptado.
Si alguien vio una historia de Navidad, hay un ejemplo de eso allí.
Entonces la segunda parte del conjunto de problemas es Vigenére,
que es una técnica de codificación más avanzada.
Así que vamos a cifrar un texto,
excepto que en lugar de sólo un único entero, estamos realmente va a codificar
con una palabra clave que el usuario nos proporcionará.
Bien, la primera herramienta en la caja de herramientas de hoy es en realidad va a estar actualizando el aparato.
En el panel de discusión veríamos cosas como: "¿Por qué no funciona?"
"¿Por qué no se somete 50 trabajo?"
y muchas veces la solución es realmente sólo para actualizar el dispositivo.
Así que si usted acaba de ejecutar en una ventana de terminal en su aparato sudo yum-y -
eso es una bandera diciendo que sí, actualizar todo - actualización,
a continuación, el aparato se actualizará si es necesario.
Y no está de más si ya están en la versión más reciente del dispositivo.
A continuación, se acaba de decir no hay actualizaciones nuevas disponibles y usted puede seguir trabajando a lo largo.
Pero esto es bueno para ejecutar incluso cada vez que abra el aparato
porque estamos todavía muy -
a veces, si entramos en un error - repararlo en el aparato.
Así que asegúrate de que tienes la versión más reciente del dispositivo
actualizar y ejecutar que hay.
Está bien. Así que ya que estamos tratando con letras y cambiante, cifrado cosas,
vamos a querer realmente a convertirse en el mejor amigo de nuestra tabla ASCII.
Los hay numerosos en línea, si usted encuentra. Tal vez incluso hacer su propio.
Básicamente, con cada letra y cada número y el carácter de cada
hay un número asociado con ellos,
y lo que es bueno para ver a sus valores ASCII junto con la carta actual.
Que sin duda le ayudará en el conjunto de problemas.
Una cosa que realmente me ayudó en este conjunto de problemas era realmente imprimirlo,
y como yo estaba pasando, en realidad se basaría en ella,
escribir: "Si esto tiene que ir para allá, entonces ..."
Tipo de dibujar sobre ella y marcar para arriba, se convierten en mejores amigos con su tabla ASCII.
Entonces tenemos alguna herramienta más a nuestra disposición.
Esta vez, en lugar de realmente preguntar al usuario por todos sus aportes
vamos a hacer una combinación.
Nosotros vamos a solicitar alguna entrada,
pero también vamos a utilizar sólo los argumentos de línea de comandos.
Así que cuando se ejecute su programa, por lo general le dicen. / Hola, por ejemplo,
si su programa era hello.c.
Pero esta vez, en vez de decir eso, se puede poner en palabras, argumentos después.
Así que vamos a usar todo lo que pase a nosotros como sus aportaciones, así,
así que ir más allá de simplemente preguntarle por entero, sino también con argumentos de línea de comandos.
Y luego vamos a entrar en arrays y cadenas, que vamos a estar usando mucho también.
Esto es sólo un ejemplo de una tabla ASCII mini.
Como ya he dicho, cada letra corresponde a un número,
y así familiarizarse con eso. Esto será muy útil.
Y después, cuando empezamos a hacer algunas ASCIIMath trata de los números -
sumar, restar ellos - entonces definitivamente bueno para referirse a esta tabla.
Así que aquí está un ejemplo de un cifrado César - algo que usted pudo haber jugado.
Es sólo una rueda. Esencialmente, existe un alfabeto exterior y entonces hay un alfabeto interior.
Así que aquí es un ejemplo de la cifra de César, pero con una tecla de 0.
Esencialmente, A está alineado con A, B está alineado con B, todo el camino hasta Z.
Pero luego dicen que queríamos una llave de 3, por ejemplo.
Luego se gira la rueda interior de modo que ahora se alinea con una D, etc
Y esto es básicamente lo que vamos a hacer.
No tenemos una rueda, pero lo que vamos a hacer es hacer que nuestro programa
Este tipo de cambio del alfabeto junto con nosotros una cierta cantidad de números.
Así que como he dicho antes, vamos a estar tratando con argumentos de línea de comandos
así como conseguir un número entero.
Así que la forma de que el usuario ejecute el programa de César es diciendo. / Caesar
y después de introducir un número después de eso.
Y ese número representa la clave, el cambio,
¿cuántas veces vas a estar girando la rueda interior de su sistema de cifrado César.
Y por lo que veo aquí un ejemplo.
Si entramos en las letras de la A a la L en nuestro sistema de cifrado César,
entonces lo haría a través de la entrada D O porque es cada letra desplazado más de 3 veces,
al igual que el ejemplo de la rueda que te mostré.
Así que si has introducido, por ejemplo, trata CS50!
entonces también sería mover todas las cartas.
Y eso es una cosa importante en tanto César y Vigenére
es que vamos a pasar por alto las cartas no lo son.
Así que todos los espacios, personajes, etc, números, vamos a mantenerlos igual.
Sólo vamos a cambiar las letras en este caso.
Así que como ves en la rueda, sólo tenemos las cartas de que disponemos,
por lo que sólo quiere cambiar las letras y cifrar las letras.
Así que lo primero que debe hacer, hemos visto que el uso de César en el problema 2
César es ejecutar y escriba un número cuando se ejecuta en el terminal.
Así que lo que tenemos que hacer es conseguir de algún modo que la clave y acceder a ella.
Y por lo que queremos ver de alguna manera va a ser el argumento de línea de comandos segunda.
La primera de ellas va a ser. / César, y la próxima va a ser el número clave.
Así que antes de tener int main (void) para iniciar nuestros programas en C.
Vamos a pelar una capa un poco
y ver realmente que en vez de pasar en vacío a nuestra función principal
en realidad estamos tratando con dos parámetros.
Tenemos un int argc llamada y luego una matriz de cadenas llamado argv.
Así argc es un número entero,
y representa el número de argumentos pasados ​​a tu programa.
Y entonces argv es en realidad la lista de los argumentos pasados.
Todos los argumentos son cadenas, y así argv representa una matriz, una lista de cadenas.
Vamos a hablar acerca de las matrices un poco.
Las matrices son esencialmente una estructura de datos nueva.
Tenemos enteros, hemos dobles, contamos con cuerdas, y ahora tenemos las matrices.
Las matrices son estructuras de datos que pueden almacenar varios valores del mismo tipo,
tan esencialmente, una lista de cualquier tipo que desee.
Básicamente, si usted quiere una lista de números enteros, todo en una variable,
a continuación, debe crear una nueva variable que es de tipo array int.
Así que las matrices son cero indizada, lo que significa que el primer elemento de la matriz está en el índice 0.
Si la matriz es de longitud 4, como en este ejemplo, entonces su último elemento sería en el índice 3,
que es 4 - 1.
Así que para crear la matriz, usted haría algo como esto.
Digamos que usted quería una doble hilera.
Esto se aplica a cualquier tipo de tipo de datos, sin embargo.
Así que dices que quieres una doble hilera. Digamos que usted quiere llamarlo buzón.
Al igual que usted podría inicializar cualquier otra doble,
te diría doble y luego el nombre, pero esta vez ponemos los corchetes,
y luego el número no será la longitud de la matriz.
Tenga en cuenta que en las matrices nunca podemos cambiar la longitud,
por lo que siempre hay que definir y elegir cuántas cajas,
cuántos valores de la matriz se va a celebrar.
Así que para establecer diferentes valores en la matriz, usted va a utilizar esta sintaxis siguiente,
como se ve en la diapositiva.
Tiene 0 Índice de buzón se establece en 1,2,
Índice de buzón 1 set a 2,4, etc
Así que ahora que hemos revisado arrays un poco, vamos a volver a argc y argv.
Sabemos que argv es ahora una matriz de cadenas.
Así, cuando un usuario pasa - dicen que están ejecutando un programa -
que dicen. / hola David Malan,
lo que el programa va a hacer por usted ya es en realidad llegar a lo argc y argv son.
Así que usted no tiene que preocuparse por eso.
Argc en este caso sería de 3 ya que considera tres palabras distintas separadas por espacios.
Y así, entonces la matriz, en este caso, el primer índice sería. / Hello,
la siguiente David, la siguiente Malan.
¿Alguien ve enseguida cuál es la relación entre argv,
la matriz y argc es?
Si. Vamos a llegar a eso en un ejemplo en args.c.
Vamos a ver si podemos sacar provecho de la relación entre la 2.
Aquí usted puede encontrar que en el aparato la aplicación por defecto
para abrir archivos. c es a veces Emacs.
Pero queremos tratar con gedit, así que lo que usted puede hacer es hacer clic derecho sobre el archivo de C,
vaya a Propiedades, Abrir con y, a continuación, elija gedit, en Establecer como predeterminado,
y ahora su programa debe abrir gedit en lugar de Emacs.
Perfecto.
Así que aquí tengo un programa que quiero imprimir cada argumento de la línea de comandos.
Así que lo que el usuario introduce, quiero esencialmente devolverlo de nuevo a ellos en una nueva línea.
Entonces, ¿qué es una estructura que podemos usar para iterar sobre algo -
algo que probablemente usado en su conjunto de procesadores 1?
Si quieres ir a través de un número establecido de las cosas? >> [Estudiante] Para bucle.
Para bucle. Exactamente. Así que vamos a empezar con el bucle for.
Tenemos para int i = 0. Vamos a empezar con una variable de inicialización estándar.
Voy a salir de la condición de un conjunto y luego decir i + +, vamos a hacer las cosas allí.
Está bien.
Así que pensando en volver a argv, si argv es la lista de argumentos pasados ​​al programa
y argc es el número de argumentos en el programa,
entonces eso significa que argc es esencialmente la longitud de argv, derecho,
porque no va a haber tantos argumentos como el valor de argc.
Así que si queremos iterar sobre cada elemento de argv,
vamos a querer cada vez que acceder a la variable en argv en el índice dado.
Que se puede representar con este, ¿verdad?
Esta variable representa aquí la cadena en particular, en este caso
porque es una matriz de cadenas - la cadena en particular en ese índice dado.
Lo que queremos hacer, en este caso queremos imprimir, así que vamos a decir printf.
Y ahora argv es una cadena, por lo que queremos poner ese marcador de posición allí.
Queremos una nueva línea sólo para que se vea bien.
Así que aquí tenemos un bucle para. No tenemos la enfermedad todavía.
Así que comienza en 0, y luego cada vez que se va a imprimir la cadena dada
en ese índice determinado de la matriz.
Por eso, cuando queremos dejar de imprimir los elementos de la matriz?
Cuando hemos terminado, ¿verdad? Cuando hemos llegado al final de la matriz.
Así que no desea exceder más allá de la longitud de la matriz,
y ya sabemos que no es necesario en realidad activamente averiguar cuál es la longitud de argv es
porque ha dado a nosotros, y lo que es eso? Argc. Exactamente.
Por eso queremos hacer este número argc proceso de veces.
No estoy en el directorio correcto.
Está bien.
Ahora vamos a hacer args. No hay errores, lo cual es genial.
Así que vamos a ejecutar args.
¿Qué es esto va a volver a nosotros? Es sólo va a imprimir de nuevo.
"Se introducen argumentos en el programa, yo lo voy a dar a usted."
Así que digamos que queremos decir args entonces foo bar.
Así que lo que se imprime de nuevo a nosotros. ¿De acuerdo?
Así que es un ejemplo de cómo se puede utilizar argc y argv
sabiendo que argc representa la longitud de argv.
Asegúrese de que usted no lo hace nunca con acceso matrices de un más allá de la longitud de la matriz
C porque definitivamente gritar en usted.
Usted conseguirá algo que se llama un error de segmentación,
que nunca es divertido, básicamente diciendo que está tratando de acceder a algo
que no existe, no le pertenece a usted.
Así que seguro, y sobre todo con el cero indexación, no quiero -
Como por ejemplo, si tenemos una matriz de longitud 4,
que el índice de matriz de 4 no existe, porque empezamos a 0, en el índice cero.
Se convertirá en una segunda naturaleza al igual que para los bucles cuando empezamos a 0.
Así que tenlo en cuenta.
Usted no desea tener acceso siempre que el índice de un array que está más allá de su alcance.
Así que podemos ver ahora cómo podemos tipo de acceso
los argumentos de línea de comandos que se pasan pulg
Pero como vio la cadena, el argv es en realidad una matriz de cadenas.
Así que no es en realidad un entero todavía, pero en César queremos tratar con números enteros.
Por suerte, hay una función creada por nosotros para que en realidad se puede convertir una cadena a un entero.
También aquí no estamos tratando con la entrada del usuario en el que los está incitando
para la entrada de la clave aquí, así que en realidad no puede reprompt y decir:
"Oh, me dará otro número entero, por ejemplo, si no es válido."
Pero todavía necesita verificar el uso correcto.
En César sólo se les permite pasar en un número,
y lo que tienen que ejecutar. / César y luego te tienen que dar un número.
Así argc tiene que ser un número determinado.
¿Qué número que sería si tienen que pasar el. / César y luego una tecla?
¿Cuál es argc? >> [Estudiante] 2. >> Dos. Exactamente.
Así que usted quiere asegurarse de que argc es 2.
De lo contrario, básicamente se niegan a ejecutar el programa.
En main es una función que dice int main,
así entonces siempre en 0 buen retorno práctica al final de un programa exitoso.
Así que si, por ejemplo, te dan tres argumentos de la línea de comandos en lugar de 2
o te dan 1, por ejemplo, entonces lo que voy a hacer es que usted querrá comprobar que
y luego regresar una diciendo, no, no puedo seguir con este programa.
[Estudiante] No puede haber un espacio en el texto. >> Perdón?
[Estudiante] No puede haber un espacio en el texto que está tratando de cifrar.
¡Ah!
En cuanto al texto que estamos tratando de cifrar, que en realidad viene después
cuando damos ese texto.
Así que ahora sólo estamos aceptando como argumentos del comando el número real,
el cambio real para el cifrado de César.
[Estudiante] ¿Por qué necesita 2 en lugar de sólo 1 argc? Definitivamente hay un número.
Derecha. La razón por la que necesitamos para argc 2 en vez de 1
se debe a que cuando se ejecuta un programa y dicen. / césar o. / hola,
que realmente cuenta como un argumento de línea de comandos.
Así que ya ocupa 1 y así entonces estamos introduciendo un extra.
Así que en realidad está introduciendo una cadena en el argumento de la línea de comandos.
Lo que quiero hacer, para César nos quieren hacer frente a un número entero,
para que pueda utilizar esta función atoi.
Y en el fondo, se pasa en una cadena y luego se le regresará un entero
si es posible hacer esa cadena en un entero.
Ahora recuerdo cuando nos enfrentamos a cosas printf o GetString, así,
que incluyen las bibliotecas que son específicos para nosotros.
Así que al principio comenzamos con un estándar de hash tag de E / S,. H, algo así.
Bueno, atoi no está dentro de una de esas bibliotecas,
así que lo que tienes que hacer es que tenemos que incluir la biblioteca de derecho para ello.
Así que recordar de nuevo a Tutorial 1, donde me referí a la función manual.
Escribes hombre de tu terminal y luego seguido por el nombre de una función.
Y para que le mostrará una lista completa de su uso,
sino que también lo llevará hasta qué biblioteca que pertenece.
Así que lo dejo a usted para usar la función manual con atoi
y averiguar en qué biblioteca se debe incluir para poder utilizar la función atoi.
Así que tenemos la llave y ahora se trata de obtener el texto sin formato,
y de modo que realmente va a ser la entrada del usuario en la que sugerirán.
Nos topamos con getInt y GetFloat, y así, en la misma línea
vamos a estar tratando con GetString.
Pero en este caso no es necesario hacer ninguna do while o while para comprobar.
GetString sin duda nos dará una cadena,
y vamos a cifrar lo que el usuario nos da.
Así que usted puede asumir que todas estas cadenas de usuario introducidos son los correctos.
Grande.
Así que una vez que tienes la llave y una vez que tienes el texto,
ahora lo que queda es que hay que cifrar el texto en claro.
Sólo para cubrir rápidamente en jerga, el texto plano es lo que el usuario le da,
y el texto cifrado es lo que volver a ellos.
Así cadenas, para ser capaz de ir a través de realidad letra por letra
porque tenemos que cambiar cada letra,
entendemos que las cadenas, si es que tipo de pelar la capa,
vemos que sólo son realmente una lista de caracteres.
Una viene después de la otra.
Y así podemos tratar las cadenas como arrays, ya que son conjuntos de caracteres.
Así que usted tiene una cadena denominada texto,
y dentro de ese texto variable se almacena Esto es CS50.
A continuación, el texto en el índice 0 sería una T mayúscula, índice 1 sería h, etc
Y a continuación, con las matrices, en el ejemplo argc en args.c,
vimos que teníamos que recorrer en iteración una matriz
y por lo que tuvo que recorrer desde i = 0 hasta i es menor que la longitud.
Así que necesitamos alguna manera de averiguar lo que la duración de nuestra cadena es
si vamos a iterar sobre ella.
Por suerte, una vez más, hay una función allí para nosotros, aunque más tarde en CS50
que sin duda será capaz de aplicar y hacer su propia función
que puede calcular la longitud de una cadena.
Pero por ahora vamos a utilizar longitud de la cadena, por lo que strlen.
Se pasa de una cadena, y luego se le devolverá un entero que representa la longitud de la cadena.
Veamos un ejemplo de cómo podría ser capaz de repetir cada carácter en una cadena
y hacer algo con eso.
Lo que queremos hacer es iterar sobre cada carácter de la cadena,
y lo que queremos hacer es que imprimimos de nuevo cada carácter 1 por 1
excepto que añadir algo a su lado.
Así que vamos a empezar con el bucle for. Int i = 0.
Vamos a dejar espacio para la condición.
Queremos recorrer hasta llegar al final de la cadena, ¿no?
Entonces, ¿qué función nos da la longitud de la cuerda?
[Respuesta de los estudiantes inaudible]
Esa es la longitud de los argumentos de línea de comandos.
Sin embargo, para una cadena que desea utilizar una función que nos da la longitud de la cadena.
Así que esa es la longitud de cadena.
Y entonces usted tiene que pasar una cadena a la misma.
Es necesario saber qué cadena se debe calcular la longitud de.
Así que en este caso estamos tratando con la cadena s.
Grande.
Así que lo que queremos hacer, vamos a printf.
Ahora, queremos tratar con los personajes. Queremos imprimir cada carácter individual.
Cuando usted quiere que imprima un flotador, se utiliza como marcador de posición% f.
Con un int que usaría% d.
Y así, del mismo modo, con un carácter% c se utiliza para decir que me voy a imprimir un carácter
que está almacenado en el interior de una variable.
Así que tenemos esto, y vamos a agregar un punto y un espacio para ello.
¿Qué personaje estamos usando?
Vamos a utilizar cualquier naturaleza que estamos en la cadena.
Así que vamos a estar usando algo con una cuerda,
pero queremos estar accediendo al carácter cierto allí.
Así que si una cadena es sólo una matriz, entonces, ¿cómo acceder a los elementos de las matrices?
Contamos con los corchetes, y luego ponemos el índice de allí.
Así que tenemos entre corchetes. Nuestro índice en este caso, sólo puedo usar. Exactamente.
Así que aquí estamos diciendo que vamos a imprimir un carácter seguido de un punto y un espacio,
y que personaje va a ser la letra i en nuestra cadena s.
Yo sólo voy a salvar de eso. Bien.
Ahora me voy a correr longitud de la cadena.
Así que tuvimos una cadena denominada OMG, y ahora se ha enfatizado aún más.
Del mismo modo, digamos que realmente desea conseguir una cadena del usuario.
¿Cómo podemos hacer esto?
Antes, ¿cómo hemos llegado un int?
Dijimos getInt, ¿verdad? Pero esto no es int, así que vamos a GetString.
Hagamos longitud de la cadena. Aquí no se ha introducido su sistema específico.
Así que no lo sé.
Voy a poner mi nombre en el aquí y entonces yo puedo hacer una de esas cosas
donde puedo asignar una palabra para cada letra o algo por el estilo. Cool.
Así que esa es la longitud de cadena.
Así que estamos de vuelta a César.
Tenemos algunas herramientas sobre cómo iterar sobre una secuencia,
cómo acceder a cada elemento individual.
Así que ahora podemos volver al programa.
Como he mencionado antes, en la tabla ASCII, su mejor amigo,
vas a ver los números que están asociados con cada letra.
Así que aquí decir que nuestro texto en claro es que estoy mareado!
A continuación, cada uno de estos caracteres se va a tener un número y el valor ASCII asociado con él,
incluso el apóstrofe, incluso el espacio, incluso el signo de exclamación,
por lo que usted quiere mantener eso en mente.
Así que decir que nuestra clave que el usuario incluido en su argumento de línea de comandos es 6.
Esto significa que para la primera letra, que es, que está representado por 73,
desea volver a cualquier letra está representada por el valor ASCII de 73 + 6.
En este caso sería 79.
Ahora queremos ir al siguiente carácter.
Así que el siguiente en el índice 1 del texto claro sería el apóstrofe.
Pero recuerde que sólo desea cifrar las letras.
Así que queremos asegurarnos de que el apóstrofe en realidad sigue siendo la misma,
que no cambiamos de 39 a 45 lo que es.
Queremos mantenerlo como un apóstrofe.
Por eso queremos recordar a cifrar sólo las letras
porque queremos que todos los otros símbolos de permanecer sin cambios en nuestro programa.
Otra cosa que queremos es preservar la capitalización.
Así que cuando usted tiene una letra mayúscula, debe permanecer como una mayúscula.
Lowercases debe permanecer en minúscula.
Así que algunas funciones útiles para poder hacer frente a sólo letras de cifrado
mantener y preservar la capitalización de las cosas
son las funciones islower isalpha, isupper,.
Y estas son funciones que devuelven un valor booleano.
Básicamente, verdadero o falso. ¿Es esta una mayúscula? ¿Es esta alfanumérico?
¿Es ésta una carta, esencialmente.
Así que aquí están 3 ejemplos de como se puede utilizar esta función.
Básicamente, se puede comprobar si el valor devuelto por la función es verdadera o falsa
sobre la base de esa entrada.
O hacer algo no cifrar o cifrar o asegúrese de que se trata de mayúsculas, etc
[Estudiante] ¿Puedes explicar aquellos un poco más y cómo se utilizan? >> Sí, seguro.
Así que si miramos hacia atrás, aquí tenemos una I mayúscula, ¿no?
Así que sabemos que va a O + 6 porque es O.
Pero queremos asegurarnos de que la O va a ser una capital de O.
Así que, básicamente, que es una especie de ir a cambiar nuestra entrada.
Así que si se trata de mayúsculas o no quiere cambiar el tipo de forma que lidiar con eso.
Así que si usamos la función isupper en ese índice en particular,
así isupper ("I"), que devuelve verdadero para nosotros, así que sabemos que es superior.
Así que sobre la base de que, más tarde vamos a ir en una fórmula
que se va a utilizar para cambiar las cosas de César,
Así que, básicamente, va a ser una fórmula ligeramente diferente si se trata de mayúsculas
en contraposición a minúsculas. Tiene sentido?
Si. No se preocupe.
He hablado un poco acerca de cómo agregar 6 a una carta, que no acaba de tener sentido
excepto cuando nos tipo de entender que estos personajes
son un poco intercambiable con números enteros.
Lo que hacemos nosotros es una especie de casting de uso implícito.
Iremos a lanzar un poco más adelante de donde se toma un valor y lo conviertes en un tipo diferente
de lo que originalmente era.
Sin embargo, con este conjunto de procesadores que vamos a ser capaces de utilizar indistintamente tipo de caracteres
y sus correspondientes valores enteros.
Así que si usted simplemente revestir un carácter con sólo las comillas simples,
entonces usted será capaz de trabajar con ella con números enteros, que trata como un entero.
Así que la C mayúscula se refiere a 67. F minúsculas se refiere a 102.
De nuevo, si usted quiere saber estos valores, mira a tu tabla ASCII.
Así que vamos a entrar en algunos ejemplos de cómo podría ser capaz de restar y sumar,
cómo usted puede realmente trabajar con estos personajes, los utilizan de manera intercambiable.
Yo digo que ASCIIMath se va a calcular la adición de un carácter en un entero
y a continuación, muestra el carácter resultante así como el valor ASCII resultante.
Así que aquí estoy diciendo - nos volveremos acuerdo con esta última parte -
pero en el fondo, estoy diciendo que el usuario debe decir ASCIIMath ejecutar junto con una clave,
y yo digo que esa clave va a ser el número
con el que vamos a añadir a este personaje.
Así que aquí cuenta de que ya que estoy pidiendo una clave,
ya que estoy pidiendo que me están dando una cosa,
Sólo quiero aceptar. / ASCIIMath y una llave.
Así que voy a exigir que argc es igual a 2.
Si no es así, entonces me voy a volver una y el programa se cerrará.
Así que estoy diciendo la clave no va a ser el argumento de línea de comandos en primer lugar,
que va a ser la segunda, y como puede ver aquí,
Me voy a convertir esto en un número entero.
Entonces me voy a poner a un personaje que se r.
Observe que el tipo de la variable CHR es en realidad un entero.
La forma en que soy capaz de utilizar r como un entero es por encerrarla con estas comillas simples.
Así que volvemos a nuestro estado de printf en el que tenemos un marcador para un carácter
y entonces un marcador de posición para un número entero,
el carácter se representa por la CDH, y el entero es la clave.
Y entonces vamos a añadir en consecuencia los 2 juntos.
Así que vamos a añadir r + cualquiera que sea la clave es,
y luego vamos a imprimir el resultado de eso.
Así que vamos a hacer ASCIIMath. Es hasta la fecha, así que vamos a ejecutar ASCIIMath.
Oh, pero mira, no hace nada, porque en realidad no nos dan una clave.
Así que cuando uno acaba de regresar, nuestra función principal, que acaba de volver de nuevo a nosotros.
Así que vamos a pasar en una tecla. Que alguien me dé un número. >> [Estudiante] 4.
4. Bien.
Así r aumentó en 4 nos va a dar v, que se corresponde con el valor ASCII de 118.
Entonces es como que tiene sentido que -
En realidad, ¿te puedo preguntar, ¿qué cree usted que el valor ASCII de r es si r + 4 es 118?
Entonces sí, r es 114.
Así que si nos fijamos en la tabla ASCII y luego, por supuesto, usted verá que r está representada por 114.
Así que ahora que sabemos que podemos sumar enteros a caracteres, esto parece bastante simple.
Sólo vamos a iterar sobre una cadena como vimos en el ejemplo anterior.
Vamos a comprobar si se trata de una carta.
Si es así, entonces lo vamos a cambiar por lo que la clave es.
Bastante simple, excepto cuando se llega a gustar esto,
se ve que z, representado por 122, entonces le daría un carácter diferente.
En realidad quiere quedarse en nuestro alfabeto, ¿no?
Así que tenemos que buscar la manera de tipo de envolver alrededor.
Al llegar a zed y desea aumentar en un cierto número,
no quiero entrar en más allá de la sección alfabeto ASCII;
desea ajustar de nuevo todo el camino hasta A.
Pero tenga en cuenta que usted está preservando el caso.
Así que sabiendo que las letras no pueden convertirse en símbolos
al igual que los símbolos no van a estar cambiando.
En el último conjunto de procesadores que definitivamente no era necesario,
pero la opción era implementar su pset codicioso con la función módulo.
Pero ahora estamos en realidad va a tener que utilizar el módulo,
así que vamos a ir sobre esto un poco.
Básicamente, cuando se tiene x módulo y, que le da el resto de dividir x por y.
Éstos son algunos ejemplos. Tenemos un 27% 15.
Básicamente, cuando se resta 15 del 27 tantas veces como sea posible sin llegar negativo
entonces usted consigue 12 sobra.
Así que eso es un poco como en el contexto de las matemáticas, pero ¿cómo podemos realmente usar esto?
Esto va a ser útil para nuestro wrapover.
Para ello, vamos a decir le pedí a todos que se dividen en 3 grupos.
A veces lo hace en grupo y algo por el estilo.
Digamos que yo dije: "Bueno, yo quiero que todos se divide en 3".
¿Cómo podría hacer eso?
[Respuesta de los estudiantes inaudible] Sí, exactamente. Cuente. Bien.
Vamos a hacer eso en realidad. ¿Quieres empezar?
[Estudiantes contando] 1, 2, 3, 4.
Pero recuerda ... >> [Estudiante] Oh, lo siento.
Ese es un punto muy bueno.
Dijiste 4, pero en realidad quiero que digas 1 porque sólo queremos 3 grupos.
Entonces, ¿cómo - No, eso es un ejemplo muy bueno, porque entonces, ¿cómo puede usted decir 1?
¿Cuál es la relación entre el 4 y 1?
Bueno, mod 3 4 1.
Así que si usted continúa, usted sería 2.
Así que tenemos 1, 2, 3, 1, 2.
Una vez más, usted es en realidad la 5 ª persona. ¿Cómo sabes que decir 2 en lugar de 5?
Usted dice mod 3 5 2.
Quiero ver cuántos grupos de 3 se queda, entonces qué orden soy yo
Y entonces si continuamos por toda la habitación,
entonces veríamos que en realidad siempre estamos aplicando la función mod a nosotros mismos
contar tipo de descuento.
Ese es un tipo más de ejemplo tangible de cómo puede utilizar modulo
porque estoy seguro que la mayoría de nosotros hemos pasado por ese proceso
donde hemos tenido que cuente.
Cualquier pregunta sobre modulo?
Será muy importante entender los conceptos de esta,
por lo que desea asegurarse de que ustedes entienden.
[Estudiante] Si no hay resto, ¿se le dará el número real?
Si uno de los 3 primero de ellos lo había hecho, ¿habría dado lo que realmente eran,
o se lo han dado [inaudible] >> Eso es una buena pregunta.
Cuando no hay resto para el módulo - así que usted tiene 6 mod 3 -
que en realidad te devuelve 0.
Vamos a hablar de eso un poco más tarde.
Ah, sí, por ejemplo, la 3 ª persona - 3 mod 3 es realmente 0, pero ella dijo 3.
Así que es algo así como una captura interna, por ejemplo,
como bien, si el mod es 0, entonces yo voy a ser la 3 ª persona.
Pero vamos a entrar en una especie de cómo podemos querer tratar con lo que 0 es tarde.
Así que ahora que de alguna manera tienen una forma de mapear el zed a la letra correcta.
Así que ahora que hemos llegado a través de estos ejemplos,
que tipo de ver cómo César podría funcionar.
Usted ve los dos alfabetos y luego los ves cambiando.
Así que vamos a tratar de expresar que en términos de la fórmula.
Esta fórmula se da realmente a usted en la especificación,
pero bueno vamos a mirar a través de lo que significa cada variable.
Nuestro resultado final va a ser el texto cifrado.
Así que esto nos dice que el carácter de orden i del texto cifrado
va a corresponder al carácter i-ésimo del texto plano.
Eso tiene sentido, porque queremos estar siempre alineando estas cosas.
Así que va a ser el carácter de orden i del texto cifrado k plus, que es nuestra clave -
que tiene sentido - y entonces tenemos este mod 26.
¿Recuerda cuando tuvimos la zed
nosotros no queremos entrar en el personaje, así que quería mod
y el tipo de envoltura alrededor del alfabeto.
Después de zed va a ir a, b, c, d, hasta que llegó al número correcto.
Así que sabemos que zed, si + 6, nos daría f zed porque después viene a, b, c, d, e, f.
Así que vamos a recordar que sabemos con certeza que zed + 6 nos va a dar f.
En valores ASCII, z es de 122 y F 102.
Así que tenemos que encontrar alguna manera de hacer que nuestra fórmula César nos dan 102
después de tomar en 122.
Así que si solo se aplica esta fórmula, el% ('z' + 6) 26, que en realidad le da 24
porque 122 + 6 es de 128, 128 26% le da 24 restantes.
Pero eso no significa realmente f. Eso definitivamente no es 102.
Eso no es también la sexta letra del alfabeto.
Así que, obviamente, tenemos que tener alguna manera de ajustar esto un poco.
En términos del alfabeto corriente, sabemos que z es la letra 26 y F es la sexta.
Pero estamos en ciencias de la computación, por lo que vamos a índice a 0.
Así que en lugar de z es el número 26, vamos a decir que es el número 25
porque a es 0.
Así que ahora vamos a aplicar esta fórmula.
Tenemos z representado por 25 + 6, lo que le da 31.
Y 31 mod 26 le da 5 como un resto.
Eso es perfecto, porque sabemos que f es la quinta letra del alfabeto.
Pero todavía no es f, ¿verdad? Todavía no es 102.
Así que para este conjunto de procesadores, el desafío será tratar de averiguar la relación
entre la conversión entre estos valores ASCII y el índice alfabético.
Esencialmente, lo que usted quiere hacer, quiere empezar con los valores ASCII,
pero entonces usted quiere traducir de alguna manera que en un índice alfabético
luego calcular qué letra debe ser - básicamente, lo que su índice alfabético es
del carácter de cifrado - luego traducir eso a los valores ASCII.
Así que si usted látigo de su tabla ASCII, a continuación, tratar de encontrar relaciones entre, por ejemplo, 102 y 5
o el 122 y 25.
Hemos recibido la llave de los argumentos de línea de comandos, hemos recibido el texto en claro,
lo hemos cifrado.
Ahora todo lo que queda por hacer es imprimirlo.
Podríamos hacer esto un par de maneras diferentes.
Lo que podemos hacer es imprimir en realidad a medida que avanzamos.
Al iterar sobre los caracteres de la cadena,
podríamos simplemente imprimir sólo en ese momento cuando lo calculamos.
Como alternativa, también se puede almacenar en una matriz y tienen una serie de caracteres
y al final iterar sobre esa matriz entera e imprimirlo.
Así que tienes un par de opciones para ello.
Y recuerda que% c va a ser el marcador de posición para la impresión de un carácter.
Así que tenemos César, y ahora pasamos a Vigenère,
que es muy similar a César, pero sólo un poco más complejo.
Así que, esencialmente con Vigenère es que va a estar pasando en una palabra clave.
Así que en lugar de un número, vamos a tener una cadena,
y por lo que va a actuar como su palabra clave.
Entonces, como siempre, va a llegar el aviso de una cadena del usuario
y luego cifrar y luego darles la espalda texto cifrado.
Así que como he dicho, es muy similar a la de César, pero en lugar de cambiar por un cierto número,
el número es en realidad va a cambiar cada vez de un personaje a otro.
Representar a que el número real de cambiar, es representado por las letras del teclado.
Así que si se introduce en un cambio de una, por ejemplo, a continuación, que correspondería a un cambio de 0.
Así que es de nuevo para volver al índice alfabético.
¿Cuál podría ser útil si está viendo que en realidad estamos tratando con valores ASCII
así como las letras, así como el índice alfabético,
tal vez encontrar o hacer su propia tabla ASCII que muestra el índice alfabético de 0 a 25,
aa la z, y los valores ASCII de modo que usted puede ver el tipo de relación
y esbozar y tratar de encontrar algunos patrones.
Del mismo modo, si usted estaba cambiando en la instancia determinada por f -
y esto es o bien f minúscula o mayúscula - a continuación, que correspondería a 5.
¿Estamos bien hasta ahora?
La fórmula de Vigenère es un poco diferente.
Básicamente, se ve que es igual que César,
pero en lugar de k tenemos k solo índice j.
Tenga en cuenta que no estamos usando i porque en esencia, la longitud de la palabra clave
no es necesariamente la longitud de nuestro texto cifrado.
Este será un poco más claro cuando vemos un ejemplo que tengo un poco más adelante.
Básicamente, si ejecuta el programa con una palabra clave de ohai,
entonces eso significa que cada vez, ohai va a ser tu turno.
Así que dependiendo de qué posición está en la palabra clave,
que va a cambiar su carácter determinado texto cifrado en esa cantidad.
Una vez más, al igual que César, queremos asegurarnos de preservar la capitalización de las cosas
y nosotros sólo letras cifrar y no caracteres o espacios.
Así que mirar hacia atrás a César en las funciones que usted pudo haber utilizado,
la forma en que usted decide cómo cambiar las cosas, y aplicar eso a su programa aquí.
Así que vamos a mapear esto.
Contamos con un texto claro que hemos recibido por parte del usuario de GetString
Al decir esto ... CS50 es!
Entonces tenemos una palabra clave de ohai.
Los 4 primeros caracteres son bastante simples.
Sabemos que T va a ser desplazado por O,
entonces h va a ser desplazado por h, i va a ser desplazado por una.
Aquí vemos que a representa 0,
así, el valor final es en realidad la misma letra que antes.
Entonces s es desplazado por i.
Pero entonces usted tiene estos períodos aquí.
No queremos que para cifrar, por lo que entonces no lo cambio por nada
y sólo imprimir el periodo sin cambios.
[Estudiante] No entiendo cómo sabes que esta se desplaza por - ¿De dónde te - >> Oh, lo siento.
En la parte superior se ve que aquí la línea de comandos ohai argumento aquí,
que va a ser la palabra clave.
Así que, básicamente, estás en bicicleta a través de los personajes de la palabra clave.
[Estudiante] Así que o se va a desplazar el mismo -
Así O corresponde a un cierto número en el alfabeto.
[Estudiante] Derecho. Pero, ¿de dónde sacaste la parte de CS50?
Oh. Eso está en GetString donde usted es como, "Dame una cadena a codificar."
[Estudiante] Ellos te van a dar ese argumento para cambiar por
y luego se le pedirá su primera cadena. Sí >>.
Así que cuando se ejecuta el programa, se van a incluir la palabra clave
en sus argumentos de línea de comandos cuando se ejecuta.
Luego, una vez que haya comprobado que en realidad han dado una y no más, ni menos,
entonces usted va a solicitar una cadena, por ejemplo: "Dame una cadena."
Así que ahí es donde en este caso se ha dado esta ... CS50 es!
Así que vas a utilizar y el uso que ohai y iterar.
Tenga en cuenta que aquí nos saltamos sobre la encriptación de los períodos,
pero en cuanto a nuestra posición para ohai, el siguiente que usamos o.
En este caso es un poco más difícil de ver porque es 4,
así que vamos a seguir un poco. Sólo quédate conmigo aquí.
Entonces tenemos i y s, que luego se traducen por O y H, respectivamente.
Entonces tenemos un espacio, y así entonces sabemos que no vamos a cifrar los espacios.
Pero nótese que, en lugar de ir a una en este lugar aquí,
estamos cifrando por un - no sé si se puede ver que - aquí mismo.
Así que no es como si en realidad predeterminado, por ejemplo, o va aquí, h va aquí,
una va aquí, me va aquí, o, h, a., i, o, h, a, i No hagas eso.
Sólo cambiar su posición en la palabra clave
cuando usted sabe que usted está realmente va a cifrar una letra real.
¿Tiene esa clase de sentido?
Bien.
Así que sólo algunos recordatorios.
Usted quiere asegurarse de que sólo avanzar a la siguiente letra de la palabra clave
si el personaje en su texto plano es una letra.
Así que decir que estamos en el o.
Nos damos cuenta de que el siguiente carácter, el índice i del texto plano, es un número, por ejemplo.
Entonces no avanzamos j, el índice de palabras clave, hasta llegar otra carta.
Una vez más, usted también quiere asegurarse de que usted envolvente al principio de la palabra clave
cuando estás en el final de la misma.
Si usted ve aquí estamos en i, el siguiente tiene que ser o.
Así que usted quiere encontrar la manera de poder envolvente al principio de la palabra clave
cada vez que se llega al final.
Y de nuevo, ¿qué tipo de operador es útil en este caso para envolver alrededor?
Al igual que en el recuento de ejemplo.
[Estudiante] El signo de porcentaje. >> Sí, el signo de porcentaje, que es módulo.
Así módulo será muy útil aquí cuando desea ajustar el índice en su ohai.
Y sólo una pista rápida: Trate de pensar de envolver sobre la palabra clave un poco como la de contar,
donde si hay 3 grupos, la persona cuarto,
el número que dijo fue 4 mod 3, que fue de 1.
Así que tratar de pensar en él de esa manera.
Como se vio en la fórmula, siempre que tengas y luego ci pi pero luego kj,
usted querrá asegurarse de que usted mantenga un registro de las personas.
No es necesario que lo llame yo, no es necesario llamarlo j,
pero desea asegurarse de que el seguimiento de la posición que usted está en texto plano en su
así como la posición que usted está en su palabra clave
porque esos no son necesariamente va a ser el mismo.
No sólo la palabra clave - que podría ser una longitud completamente diferente de su texto claro.
Además, su texto claro, hay números y caracteres,
por lo que no va a coincidir perfectamente juntos. Sí.
[Estudiante] ¿Existe una función para alternar mayúsculas y minúsculas?
¿Se puede cambiar una a mayúscula? >> Sí, definitivamente lo es.
Usted puede comprobar fuera - Creo que es toupper, toda palabra 1.
Pero cuando usted está tratando de cifrar las cosas y conservar el texto,
lo mejor es básicamente tener causas distintas.
Si se trata de una mayúscula, entonces usted quiere cambiar por este
porque en la fórmula, cuando uno mira hacia atrás como tenemos que tipo de go
indistintamente entre la forma de ASCII que representa los números
y el propio índice alfabético, que quiere asegurarse de
que va a haber algún tipo de patrón que se va a utilizar.
Otra nota en el patrón, en realidad.
Usted va a ser sin duda tratar con números.
Trate de no usar números mágicos, que es un ejemplo de estilo.
Así que dices que quieres algo cada cambio de tiempo por gusto -
Bueno, por lo toque, otro spoiler es cuando usted va a estar cambiando algo
por cierto, trata de no representa que por un número real
sino más bien tratar de ver si se puede utilizar el valor ASCII, que tipo de tener más sentido.
Otra nota: Debido a que estamos tratando con fórmulas,
a pesar de que su TF se sabe qué tipo de patrón que podría estar usando,
mejor en su clase de comentarios de explicar la lógica, como,
"Estoy usando este patrón porque ..." y la clase de explicar el patrón de manera sucinta en sus comentarios.
[Este tutorial fue 2] Si no hay otras preguntas, entonces me quedaré aquí un poco.
Buena suerte con su conjunto de procesadores 2: Crypto y gracias por venir.
[Estudiante] Gracias. Gracias >>.
[Intro Medios Offline]