[Powered by Google Translate] [Paso a paso - conxunto de problemas 2]
[Zamyla Chan - Harvard University]
[Esta é CS50. CS50.TV]
Todo ben. Ola, todos, e ben benvida ao Paso a paso 2.
En primeiro lugar, quero felicitalo-lo por rematar pset 1.
Sei que podería ter sido un pouco difícil para algúns de vós,
podería ser o seu primeiro programa de ordenador que escribiu,
pero lembre que a finais deste, cando ollar cara atrás a finais do semestre,
vai mirar para pset 1 e vai dicir: "Ei, eu podería ter feito isto en 5 minutos."
Entón coñece e confía que a finais deste vai definitivamente considerar un pset moi sinxelo.
Pero por agora é unha realización enorme, e parabéns polo ser feito.
Agora, tamén, unha nota rápida antes de entrar na carne do paso a paso.
Eu só quero facer unha breve nota que ás veces non ten tempo suficiente
durante as orientacións que pasar por cada única forma de facer o conxunto de problemas
e si cadra só concentrarse nun ou dous tipos de implementacións,
formas que podería facelo.
Pero iso non quere dicir que está prohibido facelo doutro xeito.
Existen moitas veces, como coa informática, moitas formas de facer as cousas,
e así definitivamente sentirse libre para usar un tipo de solución que eu poida ter presentado.
[Pset 2: crypto - Zamyla Chan - zamyla@cs50.net]
[Pset2 - 0. Unha sección de preguntas - 1. César - 2. Vigenère]
Todo ben. Entón conxunto de problemas 2: crypto é unha diversión.
Unha vez máis, con todos os pset vai comezar por unha sección de preguntas
que vai ser realizado en súas seccións co seu compañeiro de ensino asignado.
Non imos pasar por estes sobre o paso a paso,
pero sempre vai axudar a completar a pset.
Así, a primeira parte do conxunto de problemas e César.
E así, en César alguén vai pasar-lle unha chave cun número enteiro,
e vai cifrar unha secuencia de texto que fornecen
e darlles de volta unha cousa cifrada.
Se alguén asistiu Unha Historia de Nadal, hai un exemplo de que non hai.
A continuación, a segunda parte do conxunto de problemas e Vigenère,
que é unha técnica máis avanzada de cifrado.
E así imos codificar unha parte do texto,
excepto no canto de só un único número enteiro, en realidade estamos indo a codifica-la
cunha palabra clave que o usuario pode fornecer.
Ok, entón a primeira ferramenta no cadro de ferramentas de hoxe é realmente vai ser a actualización do aparello.
O foro de debate veriamos cousas como, "Por que non funciona?"
"Por que non 50 Enviar traballo?"
e moitas veces a solución é realmente só para actualizar o seu aparello.
E por iso, se vostede acaba de ser executado nunha fiestra de terminal no seu dispositivo sudo yum-y -
que é unha bandeira dicindo que si, actualizar todo - actualización,
a continuación, o aparello pode actualizar necesario.
E non fai mal se xa está na versión máis recente do aparello.
A continuación, el vai só dicir que non hai actualizacións dispoñibles e pode continuar a traballar xuntos.
Pero iso é bo para executar incluso cada vez que abrir o dispositivo
porque aínda estamos moi -
por veces, se entramos nun erro - resolve-lo no aparello.
Entón, asegúrese de que ten a versión máis recente do aparello
e realizar o que actualizar alí.
Todo ben. Entón, xa que estamos lidando con as letras e cambiando, codificación cousas,
imos realmente quere facer o mellor amigo de nosa táboa ASCII.
Existen numerosos liña, se atopa. Quizais mesmo facer o seu propio.
Basicamente, con cada letra e cada número e cada personaxe
existe un número asociado a eles,
e por iso é bo de ver os seus valores ASCII ao lado da letra real.
Isto vai axudar definitivamente no conxunto de problemas.
Unha cousa que realmente me axudou nese conxunto de problemas era, en realidade, imprimir lo,
e como eu estaba pasando, realmente usalo,
escribir: "Se este ten que ir para alí, entón ..."
Tipo de usalo e marcalo, facer-se a mellor amiga da súa táboa ASCII.
Entón temos algunhas outras ferramentas á nosa disposición.
Esta vez, en vez de realmente avisar o usuario para toda a súa entrada
imos facer unha combinación.
Nós imos leva-los a algunha entrada,
pero nós tamén imos usar só os argumentos de liña de comandos.
Entón, cando eles corren o programa, xeralmente di. / Ola, por exemplo,
o seu programa foi hello.c.
Pero, desta vez, en vez de só dicir que, poden poñer palabras, argumentos despois.
E así imos usar o que eles pasan para nós como a súa contribución, así como,
tan conmovedora ademais de só solicitando enteiro, pero tamén usando argumentos de liña de comandos.
E despois imos en matrices e cadeas, que imos estar usando moi ben.
Aquí é só un exemplo dun gráfico de mini-ASCII.
Como dixen, cada letra representa un número,
e así familiarizarse con iso. El vai vir a cadra.
E máis tarde, cando comezar a facer algúns ASCIIMath xestionar os números -
engadir, subtrair-los -, entón definitivamente bo para referirse a este gráfico.
Entón, aquí está un exemplo dunha cifra de César - algo que pode xogar.
É só unha roda. Esencialmente, existe un alfabeto exterior e, a continuación, hai un alfabeto interior.
Entón, aquí está un exemplo da cifra de César, pero con unha chave de 0.
Esencialmente, un está vencellada con A, B está aliñado con B, todo o camiño ata Z.
Pero, entón, dicir que quería unha chave de tres, por exemplo.
Entón nós xirar a roda interna de modo que a agora aliñar con D, etc
E así, este é, esencialmente, o que imos facer.
Nós non temos unha roda, pero o que imos facer é facer o noso programa
tipo de desprazar o alfabeto con nós unha certa cantidade de números.
Entón, como eu dixen antes, nós imos estar lidando con argumentos de liña de comandos
así como a obtención dun número enteiro.
Así, a forma que un usuario pode realizar o seu programa de César é por dicir. / Caesar
e, a continuación, escriba un número despois diso.
E ese número representa a clave, o cambio,
cantas veces vai estar xirando a roda interior da súa cifra de César.
E así que ve aquí un exemplo.
Se entramos as letras de A a L na nosa cifra de César,
entón, sería a entrada D a O, porque é cada letra desprazouse máis de 3 veces,
así como o exemplo da roda que eu mostre.
Entón, se entrou, por exemplo, esta é CS50!
entón sería tamén mover todas as letras.
E iso é unha cousa importante, tanto César e Vigenère
é que nós imos desconsiderar os cartas non.
Entón, todos os espazos, personaxes, etc, números, imos perder los o mesmo.
Só imos cambiar as letras neste caso.
Entón, como ve na roda, só temos as letras dispoñibles para nós,
por iso só quero cambiar as letras e cifrar as letras.
Polo tanto, a primeira cousa que facer, viu que o uso para César en conxunto de problemas 2
é executar César e insira un número cando executa-lo no terminal.
Entón o que necesitamos facer é dalgunha forma obter esa clave e acceder a ela.
E así que queremos dalgunha forma ver que vai ser o argumento segunda liña de comandos.
O primeiro vai ser. / César, eo próximo vai ser o número clave.
Entón, antes de que tivemos int (void) principal para iniciar nosos programas de C.
Estamos indo para pelar unha capa un pouco
e realmente ver que en vez de pasar o baleiro a nosa función principal
en realidade estamos lidando con dous parámetros.
Temos un int argc chamado e despois dun conxunto de cordas chamado argv.
Entón argc é un enteiro,
e representa o número de argumentos pasados ​​para o seu programa.
E entón argv é na verdade a lista de argumentos pasados.
Todos os argumentos son cadeas, e así argv representa unha matriz, unha lista de cadeas.
Imos falar sobre matrices un pouco.
Matrices son esencialmente unha nova estrutura de datos.
Temos ints, temos dobra, temos cordas, e agora temos matrices.
Matrices son estruturas de datos que pode conter varios valores do mesmo tipo,
Entón, basicamente, unha lista de todo tipo que sexa.
Esencialmente, se quería unha lista de enteiros, todo dunha variable,
entón ten que crear unha nova variable, que foi de matriz tipo int.
Entón matrices son con índice cero, o que significa que o primeiro elemento da matriz é o índice 0.
Se a matriz é de lonxitude 4, como neste exemplo, entón o último elemento sería o índice 3,
o cal é 4 - 1.
Polo tanto, para crear matriz, faría algo así.
Digamos que quería unha matriz dupla.
Iso vale para calquera tipo de tipo de datos, con todo.
Entón diga que quere un conxunto dobre. Digamos que queira chamalo de caixa de correo.
Así como iniciar calquera outro matrimonio,
diría parella e logo o nome, pero esta vez imos poñer os corchetes,
e, a continuación, o número haberá a lonxitude da matriz.
Nótese que nas matrices que non pode xa modificar a lonxitude,
así sempre ten que definir e escoller cantas caixas,
cantos valores a matriz vai realizar.
Así, para definir valores diferentes na súa matriz, vai usar esa sintaxe seguinte
como podes ver no slide.
Ten 0 índice de caixa será definido para 1,2,
caixa de correo índice de 1 set a 2.4, etc
Polo tanto, agora que revimos matrices un pouco, imos voltar a argc e argv.
Sabemos que argv é agora unha matriz de cadeas.
Así, cando un usuario pasa - din que está executando un programa -
eles din. / Ola David Malan,
o que o programa vai facer por ti é xa, de feito, vir cara arriba co argc e argv son.
Así que non se preocupe con iso.
Argc, neste caso, sería de 3 porque ve tres palabras distintas separadas por espazos.
E entón a matriz, neste caso, o primeiro índice sería. / Ola,
seguinte David, o Malan próximo.
Alguén ve inmediatamente que a relación entre argv,
a matriz, e argc é?
Si Nós imos entrar que un exemplo de args.c.
Imos ver se podemos sacar proveito da relación entre o 2.
Aquí pode considerar que o aparello a aplicación por defecto
para abrir ficheiros. C ás veces é Emacs.
Pero queremos tratar con gedit, entón o que podes facer é que pode prema co botón dereito sobre o arquivo C,
vaia Propiedades, Abrir con e, a continuación, escolla gedit, definido por defecto,
e agora o programa debe abrir o gedit en vez de Emacs.
Perfecto.
Entón aquí eu teño un programa que quero imprimir cada argumento de liña de comandos.
Entón o que o usuario inserir, quero esencialmente devolve-lo de volta para eles en unha nova liña.
Entón, o que é unha estrutura que pode usar para iterar sobre algo -
algo que probablemente usado en seu 1 pset?
Se queres pasar por un determinado número de cousas? >> [Alumno] Para loop.
Para loop. Exactamente. Entón, imos comezar co loop for.
Temos a int i = 0. Imos comezar por unha variable de inicio por defecto.
Eu vou deixar a condición dun conxunto e, a continuación, dicir que eu + +, vai facer as cousas alí.
Todo ben.
Entón, a pensar de volta para argv, argv, a lista de argumentos pasados ​​para o programa
e argc é o número de argumentos no programa,
a continuación, o que significa que argc é esencialmente da lonxitude da argv, dereita,
porque non van ser tantos argumentos como o valor argc.
Polo tanto, se queremos iterar sobre cada elemento na argv,
imos querer cada vez acceder á variable en argv no índice indicado.
Que pode ser representado con iso, non?
Esta variable representa aquí a secuencia particular neste caso
porque é unha matriz de cadea - a cadea particular aquel determinado índice.
O que queremos facer, neste caso, queremos imprimir lo, entón imos dicir que printf.
E agora argv é unha cadea, por iso queremos poñer este espazo reservado alí.
Queremos unha nova liña só para facelo ben.
Polo tanto, temos aquí un lazo para. Non temos a condición aínda.
Entón eu comeza en 0, e despois cada vez que vai imprimir a cadea dada
en que o índice particular na matriz.
Así, cando queremos deixar de imprimir elementos na matriz?
Cando terminarmos, non? Cando chegamos ao fin da matriz.
Entón, nós non queremos superar pasado a lonxitude da matriz,
e xa sabemos que non precisamos realmente activamente descubrir o que a lonxitude de argv é
porque chega a nós, eo que é isto? Argc. Exactamente.
Entón, nós queremos facer esta cifra argc proceso de veces.
Eu non estou no directorio correcto.
Todo ben.
Agora imos facer args. Sen erros, o que é óptimo.
Entón imos correr args.
O que é que isto vai volver para nós? El só vai imprimir lo de volta.
"Inseriu args no programa, eu vou dá-lo de volta para ti."
Entón, imos dicir que queremos dicir args entón foo bar.
Así, pois, imprime-lo de volta para nós. Todo ben?
Polo tanto, hai un exemplo de como pode utilizar argc e argv
sabendo que argc representa a lonxitude do argv.
Asegúrese de que vostede non fai nunca, con matrices de acceso dun alén da lonxitude da matriz
porque C vai definitivamente berrar con vostede.
Vai ter unha cousa chamada fallo de segmento,
que non é divertido, basicamente dicindo que está intentando acceder algo
que non existe, non pertence a vostede.
Entón, asegúrese de, e, especialmente, con o cero-indexación, nós non queremos -
Por exemplo, se temos unha matriz de lonxitude 4,
que o índice de matriz 4 non existe, porque nós comezamos a 0, o índice cero.
El vai facer unha segunda natureza como loops cando comezamos a 0.
Entón, só tes que manter isto presente.
Non quero nunca acceder ao índice dunha matriz que está alén do seu alcance.
Así, podemos ver agora como podemos tipo de acceso
os argumentos de liña de comandos que son pasados ​​dentro
Pero, como viu a corda, o argv é na verdade unha matriz de cadea.
Polo tanto, non é realmente un enteiro aínda, pero César queremos tratar con números enteiros.
Afortunadamente, existe unha función creada para nós que realmente pode converter unha cadea para un enteiro.
Tamén aquí non estamos lidando con a entrada do usuario ao que estamos levando-os
para a entrada de aquí a clave, por iso non podemos realmente Reprompt e dicir:
"Oh, me dea outro enteiro, por exemplo, non é válido."
Pero aínda necesitamos comprobar se hai uso correcto.
En César eles só están autorizados a pasar un número,
e así que ten que funcionar. / César e entón eles teñen que darlle un número.
Así argc ten que ser un número determinado.
Cal é o número que sería iso, eles teñen que pasar-lle o. / César e despois unha clave?
¿Que é argc? >> [Alumno] 2. >> Dous. Exactamente.
Entón quere estar seguro de que argc é 2.
Se non, basicamente, rexeitar a executar o programa.
Na principal é unha función que se int main,
entón sempre en 0 boas prácticas de retorno ao final dun programa exitoso.
Así, por exemplo, eles dan-lle tres argumentos de liña de comandos en vez de 2
ou darlle unha, por exemplo, entón o que vai facer e vai querer comprobar para que
e despois volver un dicindo, non, eu non podo continuar con este programa.
[Alumno] Non pode haber un espazo no seu texto. >> Perdoe-me?
[Alumno] Non pode haber un espazo no texto que está intentando cifrar.
Ah!
En termos do texto que estamos intentando cifrar, que en realidade vén despois
cando damos este texto.
Entón, agora, nós estamos só aceptar como argumentos de mando do número real,
o cambio real para o cifrado de César.
[Alumno] Por que precisa de 2 no canto de só un argc? Hai sempre un número.
Dereito. A razón pola que cómpre 2 para argc, en vez de un
é porque cando executar un programa e dicir. / César ou. / Ola,
que realmente conta como un argumento de liña de comandos.
Así, entón, que xa ocupa 1 e así entón nós estamos introducindo un extra.
Entón está introducindo na verdade unha secuencia no argumento de liña de comandos.
O que quere facer, para César que queren tratar con un número enteiro,
así pode usar esta función atoi.
E, basicamente, vostede pasalo nunha corda e logo ha volver atrás dun número enteiro
se é posible facer esa cadea nun enteiro.
Agora lembre cando estamos lidando con cousas printf ou GetString, así,
que inclúen as bibliotecas que son específicas para nós.
Así, en principio, comezamos cunha marca de algo hash estándar I / O,. H, así.
Ben, atoi non está dentro dunha destas bibliotecas,
Entón, o que temos que facer é que temos que incluír a biblioteca axeitado para iso.
Entón, recordo ao Paso a paso 1 onde discutir a función manual.
Te tipo home no seu terminal e, a continuación, seguida polo nome dunha función.
E para que será unha lista completa do seu uso,
pero tamén vai traer o que biblioteca que pertence.
Entón, eu vou deixar isto para usar a función manual con atoi
e descubrir cal biblioteca necesitas Engadir para ser capaz de utilizar a función atoi.
Entón, nós temos a clave e agora se trata de obter o texto simple,
e para que, en realidade, vai ser a entrada do usuario onde pedir.
Lidamos con GetInt e GetFloat, e así na mesma liña
imos estar lidando con GetString.
Pero, neste caso, non precisamos de facer calquera while ou while para comprobar.
GetString vai certamente dar-nos unha corda,
e nós estamos indo para cifrar o que o usuario nos dá.
Así, pode asumir que todas esas secuencias de usuarios inseridos son correctos.
Grande.
Entón unha vez que ten a chave e unha vez que ten o texto,
agora o que queda é que ten que codificar o texto simple.
Só para cubrir rapidamente sobre linguaxe, o texto orixinal é o que o usuario lle dá,
eo texto cifrado é o que volver a eles.
Entón, cordas, para poder pasar por verdade letra por letra
porque temos que cambiar cada letra,
entendemos que as secuencias, se nós tipo de pelar a capa,
vemos que son só realmente unha lista de caracteres.
Un vén a continuación do outro.
E así podemos tratar cordas como matrices, porque elas son matrices de caracteres.
Entón, digamos que ten unha secuencia chamada de texto,
e dentro dese texto variable é almacenada Este é CS50.
A continuación, o texto no índice 0 sería un T maiúsculo, índice 1 sería h, etc
E, a continuación, con matrices, no exemplo en args.c argc,
vimos que tiñamos para iterar sobre un array
e por iso tivemos que repetir a partir de i = 0 ata i é menor que a lonxitude.
Entón, necesitamos algunha forma de descubrir o que a lonxitude da corda é nosa
se imos para iterar sobre el.
Afortunadamente, de novo, hai unha función que para nós, aínda que máis tarde na CS50
vai certamente ser capaz de aplicar e facer a súa propia función
que pode calcular a lonxitude dunha corda.
Pero, por agora, imos usar lonxitude da corda, así strlen.
Vostede pasa unha corda, e entón el ha voltar un int que representa a lonxitude da secuencia.
Vexamos un exemplo de como podemos ser capaces de iterar sobre cada carácter nunha cadea
e facer algo con iso.
O que queremos facer é iterar cada carácter da cadea,
eo que queremos facer é que imprimir volver cada personaxe 1 a 1
excepto engadimos algo próximo a el.
Entón, imos comezar co loop for. Int i = 0.
Nós imos deixar espazo para a condición.
Queremos repetir ata chegar ao final da cadea, non?
Entón, o que nos dá a función de lonxitude da corda?
[Resposta do alumno inaudível]
Ese é o longo dos argumentos da liña de ordes.
Pero, para unha cadea que queremos usar unha función que nos dá a lonxitude da corda.
Entón, iso é lonxitude da corda.
E entón tes que pasar unha corda para el.
Precisa saber o que precisa de corda para calcular a lonxitude de.
Entón, neste caso, estamos lidando con cadea s.
Grande.
Entón o que queremos facer, imos printf.
Agora, queremos tratar con caracteres. Queremos imprimir cada personaxe individual.
Cando se quere imprimir un float, usaría o marcador, como f%.
Cun int usaría% d.
E así da mesma forma, cun personaxe que usa c% para dicir que eu vou estar imprimindo un carácter
que está almacenado dentro dunha variable.
Entón temos iso, e imos engadir un período e un espazo para el.
Cal personaxe que estamos a usar?
Nós imos estar usando calquera personaxe que estamos no da cadea.
Entón nós imos estar usando algo coa corda,
pero queremos estar accedendo o personaxe correcto alí.
Entón, se unha cadea é só unha matriz, como podemos entón acceder elementos de matrices?
Temos aquelas chaves, e entón poñemos o índice alí.
Polo tanto, temos corchetes. O noso índice, neste caso, podemos usar só i. Exactamente.
Entón, aquí estamos dicindo que imos estar imprimindo un carácter seguido por un punto e un espazo,
e que o personaxe vai ser a letra m na nosa cadea s.
Eu só vou gardar isto. Okay.
Agora estou indo a executar lonxitude da corda.
Entón, tivemos unha cadea chamada OMG, e agora está aínda máis evidente.
Do mesmo xeito, imos dicir que realmente quere obter unha cadea de usuario.
Como podemos facer iso?
Antes, como chegamos a un int?
Dixemos GetInt, non? Pero este non é int, entón imos GetString.
Imos facer lonxitude da corda. Aquí non entrou un aviso específico.
Entón, eu non sei.
Eu vou poñer o meu nome aquí e entón eu podo facer unha desas cousas
onde asignar unha palabra para cada letra ou algo así. Cool.
Entón, iso é lonxitude da corda.
Entón, estamos de volta a César.
Temos algunhas ferramentas sobre como nós iterar sobre unha corda,
como podemos acceder cada elemento individual.
Entón agora podemos volver para o programa.
Como mencionei antes, na táboa ASCII, o seu mellor amigo,
vai ver os números que están asociados a cada letra.
Entón aquí dicir que o noso texto simple é que eu estou tonto!
A continuación, cada un destes caracteres pode ter un número e valor ASCII asociado a el,
mesmo o apóstrofo, incluso o espazo, mesmo a marca de exclamación,
así que vai querer manter isto presente.
Entón, dicir que a nosa clave que o usuario incluído no seu argumento de liña de comandos é 6.
Isto significa que a primeira letra, que é I, o cal é representado por 73,
querer volver a eles o que letra é representada polo valor ASCII de 73 + 6.
Neste caso, que sería 79.
Agora, queremos ir ao seguinte carácter.
Polo tanto, a seguinte Índice 1 do plaintext sería o apóstrofo.
Pero lembre-se nós só queremos codificar as letras.
Entón, nós queremos estar seguro de que o apóstrofo en realidade, permanece o mesmo,
que non cambiar de 39 a 45 o que é.
Queremos mantelo como unha apóstrofe.
Entón, nós queremos lembrar-se só codificar as letras
porque queremos que todos os outros símbolos se manteña inalteradas no noso programa.
Outra cousa que queremos é preservar a capitalización.
Entón, cando ten unha letra maiúscula, debe permanecer como unha maiúscula.
Lowercases debe permanecer como minúsculas.
Por iso, algunhas funcións útiles para ser capaz de tratar con letras só Nomes
preservar e manter a capitalización das cousas
é a función IsLower isalpha, isupper,.
E estes son funcións que retornan vostede un valor booleano.
Basicamente, verdadeiro ou falso. É este un maiúscula? Este é o alfanumérico?
É este unha carta, esencialmente.
Entón, aquí están tres exemplos de como usar esa función.
Basicamente, pode probar o valor devolto pola función é verdadeira ou falsa
con base en que a entrada.
Quere facer algo non cifrar ou cifra que ou asegúrese de que é maiúscula, etc
[Estudante] Pode só explicar os un pouco máis e como usalos? >> Si, con certeza.
Entón, se miramos cara atrás, aquí temos un capital I, non?
Entón, nós sabemos que vai para o porque + 6 é O.
Pero queremos estar seguro de que o que vai ser unha capital de O.
Entón, basicamente, que é unha especie de vai cambiar a nosa entrada.
Entón, se é maiúscula ou non vai tipo de cambiar a forma como lidamos con el.
Entón, se usamos a función isupper en que determinado índice,
así isupper ("I"), que retorna para nós verdade, entón sabemos que é superior.
Entón con base en que, máis tarde imos entrar nunha fórmula
que vai empregar para cambiar as cousas de César,
Entón, basicamente, non vai ser unha fórmula lixeiramente diferente se é maiúscula
ao contrario de minúsculas. Ten sentido?
Si Non te preocupes.
Eu falei un pouco sobre a adición de 6 a unha carta, que non chega a ter sentido
excepto cando tipo de entender que eses personaxes
son unha especie de intercambiábeis con números enteiros.
O que facemos é que tipo de fundición uso implícito.
Imos para lanzar un pouco máis tarde, onde toma un valor e transformalo en un tipo
que era orixinalmente.
Pero con este pset imos ser capaces de utilizar indistintamente tipo de caracteres
e os correspondentes seus valores enteiros.
Entón, se simplemente pechar un personaxe con só as comiñas simples,
entón vai ser capaz de traballar con el con números enteiros, tratando-o como un número enteiro.
Así, o capital C refírese a 67. F minúsculas refírese a 102.
De novo, se quere saber eses valores, ollar para a súa táboa ASCII.
Entón, imos entrar en algúns exemplos de como pode ser capaz de restar e sumar,
como pode realmente realmente traballar con estes personaxes, use os alternativamente.
I dicir que ASCIIMath vai calcular a suma dun caracter para un número enteiro
e, a continuación, presenta o carácter resultante, así como o valor resultante ASCII.
E aquí estou dicindo - we'll acordo con esta parte máis tarde -
pero, basicamente, eu estou dicindo que o usuario debe dicir ASCIIMath executado xunto cunha clave,
e eu estou dicindo que a clave será o número
co cal estamos indo para engadir este personaxe.
Entón aquí notar que desde que eu estou esixindo unha clave,
dende que eu estou esixindo que eles están me dando unha cousa,
Eu só quero aceptar. / Asciimath e unha chave.
Entón, eu vou esixir que argc é igual a 2.
Se non é, entón eu vou volver 1 eo programa vai saír.
Entón, eu estou dicindo que a clave non vai ser o primeiro argumento da liña de comandos,
que vai ser o segundo, e, como ve aquí,
Vou transformar isto nun enteiro.
Entón eu estou indo a definir un personaxe para ser r.
Nótese que o tipo de variable CHR é realmente un número enteiro.
O xeito que eu son capaz de utilizar r como un enteiro é rematando con estas aspas.
Entón, de volta á nosa declaración de printf onde temos un espazo reservado para un personaxe
e un espazo reservado para un número enteiro,
o caracter é representado polo CHR, e o número enteiro é a clave.
E entón imos engadir o resultado en dous xuntos.
Entón, nós estamos indo para engadir r + o que é a clave,
e despois imos para imprimir o resultado.
Entón, imos facer asciimath. Cabe a data, entón imos correr asciimath.
Ah, pero mira, el non fai nada, porque realmente non darlle unha clave.
Entón, cando el só volveu unha, a nosa función principal, el só volveu para nós.
Entón imos pasar unha chave. Alguén me pode dar un número. >> [Alumno] 4.
4. Okay.
Así, un aumento de 4 r vai dar us V, o que corresponde ao valor ASCII 118.
Entón que tipo de sentido que -
En realidade, te podo preguntar, o que pensas que o valor ASCII de r é se r + 4 é de 118?
Entón, si, é de 114 r.
Entón, se ollar para a táboa ASCII, entón, por suposto, vai ver que r é representado por 114.
Polo tanto, agora que sabemos que podemos engadir enteiros para caracteres, iso parece moi sinxelo.
Nós só estamos indo a repetir unha cadea como vimos no exemplo anterior.
Imos comprobar se é unha carta.
Se for, entón imos transferir-lo por calquera que sexa a clave.
Moi sinxelo, excepto cando comeza a gustar deste,
vostede ve que Z, representado por 122, a continuación, vai dar-lle un carácter diferente.
En realidade, quero estar dentro do noso alfabeto, non?
Polo tanto, temos que descubrir algunha maneira de tipo de implicación en torno.
Cando chegar zed e pretende aumentar un determinado número,
non quere ir máis aló da sección alfabeto ASCII;
quere dispoñer de volta todo o camiño para A.
Pero teña presente que aínda está preservando o caso.
Entón, sabendo que as letras non poden facer símbolos
como símbolos non van estar cambiando tamén.
Na última pset definitivamente non precisa,
pero unha opción foi aplicar o seu pset ganancioso usando a función módulo.
Pero agora estamos indo realmente precisa usar módulo,
entón imos só pasar por riba deste un pouco.
Basicamente, cando ten x modulo y, que lle dá o resto de x dividido por y.
Aquí están algúns exemplos aquí. Temos a 27% 15.
Basicamente, cando restar 15 do 27 tantas veces como sexa posible, sen estar negativo
entón vostede obtén 12 sobraron.
Entón, iso é tipo como no contexto de matemáticas, pero como podemos realmente usar este?
El vai ser útil para o noso wrapover.
Para iso, imos só dicir que eu pedín a todos os que se dividen en tres grupos.
Ás veces fai iso en grupos e algo como isto.
Digamos que eu dixen: "Ok, quero que todos vostedes ser dividido en tres."
Como podería facer iso?
[Resposta do alumno inaudível] Si, exactamente. Conta fóra. Okay.
Imos realmente facer iso. Quere comezar?
[Estudantes contando] 1, 2, 3, 4.
Pero lembre-se ... >> [Alumno] Oh, desculpe.
Este é un punto moi bo.
Vostede dixo 4, pero nós realmente quero que diga unha porque só queremos tres grupos.
Entón, como - Non, iso é un bo exemplo, porque entón como pode dicir unha?
Cal é a relación entre 4 e 1?
Ben, 4 mod 3 é 1.
Entón, se continúa, sería 2.
Así, temos 1, 2, 3, 1, 2.
Unha vez máis, está, de feito, a 5 ª persoa. Como vostede sabe que dicir 2 en vez de 5?
Vostede di que 5 mod 3 é 2.
Quero ver cantos grupos de 3 sobran despois de que orde son eu
E entón continuou ao longo da sala enteira,
entón veriamos que estamos sempre na realidade da aplicación da función mod para nós mesmos
que tipo de contar off.
Isto é un tipo de exemplo máis tanxible de como pode usar módulo
porque eu estou seguro que a maioría de nós probablemente xa pasou por este proceso
onde tivemos que contar fóra.
Calquera dúbida sobre modulo?
Será moi importante para comprender os conceptos desta,
entón eu quero estar seguro de que vostedes entenden.
[Alumno] Se non hai resto, non é darlle o número real?
Un dos tres primeiro deles tivese feito isto, tería dado a eles o que realmente eran,
ou tería dado a eles [inaudível] >> Esa é unha boa pregunta.
Cando non hai resto do módulo - para dicir que ten 6 mod 3 -
que realmente lle dá de volta 0.
Nós imos falar sobre iso un pouco máis tarde.
Ah, si, por exemplo, a persoa 3 - 3 mod 3 é realmente 0, pero ela dixo 3.
Entón, iso é como unha especie de captura interna, por exemplo,
como ben se o mod é 0, entón eu vou ser a 3 ª persoa.
Pero nós imos entrar en tipo de como podemos querer tratar co que 0 é tarde.
Entón agora nós dalgunha forma, ter un xeito de mapear o zed letra correcta.
Entón, agora nós pasamos por estes exemplos,
que tipo de ver como César podería funcionar.
Vostede ve os dous alfabetos e entón ve-los a cambiar.
Entón, imos tratar de expresar que en termos de fórmula.
Esta fórmula é, en realidade, dada a ti na especificación,
pero tipo imos ollar a través do que significa cada variable.
O noso resultado final vai ser o texto cifrado.
Polo tanto, esta di que o carácter i da cifrado
vai corresponder ao carácter i da de texto simple.
Isto ten sentido porque queremos ser sempre aliñados esas cousas.
Por iso, vai ser o personaxe i da máis k cifrado, que é a nosa clave -
que ten sentido - e entón temos este mod 26.
Lembre-se de volta cando tivemos o zed
nós non queremos entrar no personaxe, entón nós queriamos para modificar isto
e do tipo de envoltura en torno do alfabeto.
Tras zed ía a, b, c, d, ata que ten o número correcto.
Entón, sabemos que zed, se + 6, nos daría f porque despois vén zed a, b, c, d, e, f.
Entón, imos lembrar que sabemos con certeza que zed + 6 vai dar-nos f.
En valores ASCII, z é de 122 e f é 102.
Entón temos que atopar unha forma de facer a nosa fórmula César dar 102
despois de tomar en 122.
Entón, se nós simplemente aplicamos esa fórmula, o% ('z' + 6) 26, que, en realidade, dálle 24
porque 122 + 6 é de 128; 128% 26 dálle 24 restantes.
Pero iso non significa realmente f. Isto definitivamente non é 102.
Isto non é tamén a carta 6 no alfabeto.
Entón, obviamente, debemos ter algunha forma de axustar iso un pouco.
En termos do alfabeto normal, sabemos que z é a letra 26 e f é a sexta.
Pero estamos en ciencia da computación, por iso estamos indo para o índice de 0.
Entón, en vez de z é o número 26, imos dicir que é o número 25
porque a é 0.
Entón agora imos aplicar esta fórmula.
Temos z representado por 25 + 6, o que lle dá 31.
E 31 mod 26 dálle 5 como un resto.
Isto é perfecto, porque sabemos que é a letra f 5 no alfabeto.
Pero aínda non é f, non? Aínda non é 102.
Entón a este pset, un reto será tentar descubrir a relación
entre converter entre estes valores ASCII e do índice alfabético.
Esencialmente, o que quere facer, quere comezar cos valores ASCII,
pero despois quere dalgunha forma, traducir iso en un índice alfabético
a continuación, calcular o que a carta debe ser - basicamente, o que o seu índice alfabético é
do carácter cifra - entón traducir isto para os valores ASCII.
Entón, se sacar súa táboa ASCII, a continuación, tentar atopar relacións entre, digamos, 102 e 5
ou 122 e 25.
Nós comezamos a nosa clave dos argumentos de liña de comandos, temos obtido o texto simple,
temos cifrada-lo.
Agora todo o que queda a facer é imprimir lo.
Nós poderiamos facelo de dous xeitos diferentes.
O que podemos facer é realmente imprimir a medida que avanzamos.
Coma nós iterar sobre os caracteres na secuencia,
poderiamos simplemente imprimir certo, entón cando calculalas lo.
Alternativamente, tamén se pode almacena-lo nunha matriz e unha matriz de caracteres
e ao final iterar sobre esta matriz enteiro e imprimir lo.
Entón tes dúas opcións para iso.
E lembre que% c será o espazo reservado para a impresión dun personaxe.
Polo tanto, temos de César, e agora imos pasar Vigenère,
o que é moi semellante ao Caesar, pero só un pouco máis complexo.
Entón, basicamente con Vigenère é que vai estar pasando unha palabra clave.
Entón, en vez de un número, vai ter unha secuencia,
e así que vai actuar como a palabra clave.
Entón, como sempre, está indo para obter un prompt para unha cadea de usuario
e entón cifrar-lo e despois darlles a volta cifrado.
Entón, como eu dixen, é moi semellante ao César, excepto en vez de desprazarse por un determinado número,
o número é realmente vai cambiar cada vez de personaxe para personaxe.
Para representar o número real de cambiar, é representado polas letras do teclado.
Entón, se vostede poñerse en un cambio de un, por exemplo, a continuación, que correspondería a un cambio de 0.
Entón, é unha vez máis de volta ao índice alfabético.
O que pode ser útil se está vendo que estamos realmente lidando con valores ASCII
así como as cartas, así como o índice alfabético,
quizais atopar ou facer a súa propia táboa ASCII que amosa o índice alfabético de 0 a 25,
A a Z, e os valores ASCII de modo que pode tipo de ver a relación
e esbozar e tentar atopar algúns patróns.
Do mesmo xeito, se está cambiando na instancia determinada por f -
e este é ou f minúscula ou maiúscula -, entón, que correspondería a 5.
Estamos ben ata agora?
A fórmula para Vigenère é un pouco diferente.
Basicamente, vostede ve que é só como César,
excepto no canto de só k temos k índice j.
Teña en conta que non estamos usando i porque esencialmente, a lonxitude da contrasinal
non é necesariamente a lonxitude do noso texto cifrado.
Este será un pouco máis claro cando vemos un exemplo que eu teño un pouco máis tarde.
Basicamente, se executar o programa cunha palabra clave de ohai,
entón iso significa que cada vez, ohai vai ser o seu turno.
Entón, dependendo de en que posición está na súa contrasinal,
vai cambiar o seu carácter cifrado determinada por esa cantidade.
De novo, así como César, queremos estar seguro de que preservar a capitalización das cousas
e nós só letras de cifrado non caracteres ou espazos.
Entón, ollar cara atrás a César sobre as funcións que pode usar,
a forma que decidiu como cambiar as cousas, e que se aplican ao seu programa aquí.
Entón, imos mapear iso.
Temos un texto sinxelo que temos obtido a partir do usuario a partir de GetString
Está dicindo ... é CS50!
Entón temos a palabra chave de ohai.
Os primeiros catro carácteres son moi sinxelo.
Sabemos que T vai ser desprazada polo,
h, a continuación, vai ser desviado por hora, i vai ser desviado por un.
Aquí vese que a representa 0,
así, entón o valor final é en realidade só unha carta a mesma de antes.
Entón s é desprazado por i.
Pero entón tes eses períodos aquí.
Nós non queremos para codificar que, entón non muda-lo por nada
e só imprimir o período inalterado.
[Estudante] Non entendo como vostede sabe que este é desprazado por - Onde - >> Oh, desculpe.
Arriba aquí ve o mando ohai argumento de liña aquí,
que vai ser a palabra clave.
E por iso, basicamente, está en bicicleta sobre os personaxes a palabra clave.
[Estudante] Entón o que vai estar cambiando o mesmo -
Así, o correspondente a un determinado número no alfabeto.
[Estudante] Dereito. Pero de onde sacou a parte de CS50?
Oh Isto é en GetString onde está como "Deixa-me unha corda para codificar."
[Alumno] Eles van dar-lle ese argumento para cambiar por
e entón vai pedir a súa primeira corda. Si >>.
Entón, cando eles executar o programa, que van incluír a palabra clave
nos seus argumentos da liña de ordes cando executa-lo.
Entón, despois de ter comprobado que realmente lle deu un, e non máis, non menos,
a continuación, vai leva-los a unha secuencia, digamos, "Déame unha corda".
Entón é aí que, neste caso, eles deron-lle isto ... é CS50!
Entón vai usar isto e utilizar ohai e iterar.
Teña en conta que aquí nós pulamos cifrar os períodos,
pero en termos da nosa posición para ohai, o próximo usan o.
Neste caso, é un pouco máis difícil de ver porque é 4,
entón imos seguir un pouco. Basta estar aquí comigo.
Entón temos i e s, os cales son, a continuación, traducido por O e H, respectivamente.
Entón, temos un espazo, e entón sabemos que non imos para codificar os espazos.
Pero teña en conta que, en vez de ir a un neste punto aquí,
estamos criptografando por un - Eu non sei se pode ver que - ben aquí.
Entón non é como se realmente predeterminado, por exemplo, vai aquí, vai aquí h,
un vai aquí, i vai aquí, o, h, a, i, o, h, a, i. Non fai iso.
Só cambiar a súa posición na palabra clave
cando vostede sabe que está indo realmente para ser cifrar unha carta real.
Será que este tipo de ten sentido?
Okay.
Así, só algúns recordatorios.
Quere estar seguro de que só avanzará á seguinte letra a palabra chave
o personaxe no seu texto orixinal é unha letra.
Entón, dicir que estamos no o.
Entender que o próximo personaxe, o índice i do texto orixinal, é un número, por exemplo.
Entón, nós non avanzamos j, o índice para a nosa palabra clave, ata chegar outra carta.
De novo, vostede tamén quere ter a certeza de que entorno ao comezo da palabra clave
cando está no fin.
Se ves aquí estamos no i, o seguinte ten que ser o.
Entón quere atopar unha forma de poder contorno para o inicio da súa contrasinal
cada vez que chegar ao final.
E así unha vez máis, que tipo de operador é útil, neste caso para enrolar?
Como na conta fóra exemplo.
[Alumno] O sinal de por cento. >> Si, o sinal de porcentaxe, que é módulo.
Entón modulo vai vir a cadra aquí, cando quere dispoñer sobre o índice no seu ohai.
É só unha suxestión rápida: Proba pensar participa máis a palabra chave un pouco como o off contando,
onde hai tres grupos, a persoa 4,
o seu número que eles dixeron foi de 4 mod 3, que foi 1.
Entón probe pensar desa maneira.
Como viu na fórmula, sempre que teña ci e despois pi pero despois KJ,
quere ter seguro de que manter o control destes.
Non precisa de chamalo de min, non precisa de chamalo j,
pero quere ter seguro de que manter o control da posición que está no seu plaintext
así como a posición que está na súa palabra clave
porque os que non son, necesariamente, será o mesmo.
Non só a palabra chave - que podería ser unha extensión completamente diferente do que o seu texto simple.
Ademais, o texto simple, existen números e caracteres
de xeito que non vai quedar perfectamente xuntos. Si
[Alumno] Existe unha función para cambiar caso?
Pode cambiar ao capital a? >> Si, hai definitivamente.
Podes consultar - eu creo que é toupper, toda palabra 1.
Pero cando estás cifra cousas e preservar o texto,
el é o mellor, basicamente, a ter casos separados.
Se é unha maiúscula, entón quere cambiar por este
porque na súa fórmula, cando mira cara atrás como temos que tipo de movemento
alternativamente entre o modo ASCII de representar os números
eo índice alfabético real, queremos estar seguro de
alí vai ser algún tipo de patrón que vai empregar.
Outra nota sobre o estándar de feito.
Vai definitivamente ser tratar con números.
Probe a non usar números máxicos, que é un exemplo de estilo.
Entón, dicir que quere algo cada cambio de tempo por gusto -
Ok, entón Consello, outro spoiler é cando está indo estar cambiando algo
por unha certa cantidade, proba non representa que por un número real
pero tentao e vexa se pode utilizar o valor ASCII, que tipo de facer máis sentido.
Outra nota: Como estamos a tratar con fórmulas,
aínda que o seu TF vai saber o que tipo de estándar que pode estar usando,
mellor no seu tipo de comentarios de explicar a lóxica, como,
"Está a usar este estándar porque ..." e tipo de explicar o nivel de forma sucinta nos seus comentarios.
[Este foi paso a paso 2] Se non hai calquera outras preguntas, entón eu vou estar aquí por un pouco.
Boa sorte co seu pset 2: crypto e grazas por vir.
[Estudante] Grazas. Grazas >>.
[Intro multimedia offline]