[Powered by Google Translate] [Passo a passo - Conjunto de Problemas 2] [Zamyla Chan - Harvard University] [Esta é CS50. CS50.TV] Tudo bem. Olá, todos, e bem vindo ao Passo a passo 2. Primeiro, quero felicitá-lo por terminar pset 1. Eu sei que poderia ter sido um pouco difícil para alguns de vocês, poderia ter sido o seu primeiro programa de computador que você escreveu, mas lembre-se que no final deste, quando você olhar para trás no final do semestre, você vai olhar para pset 1 e você vai dizer: "Ei, eu poderia ter feito isso em 5 minutos." Então conhece e confia que no final deste você vai definitivamente achar um pset bastante simples. Mas por enquanto é uma realização enorme, e parabéns pelo sendo feito. Agora, também, uma nota rápida antes de entrar na carne do passo a passo. Eu só quero fazer uma breve nota que às vezes não tem tempo suficiente durante as orientações que passar por cada única maneira de fazer o conjunto de problemas e sim talvez apenas se concentrar em um ou dois tipos de implementações, maneiras que você poderia fazer isso. Mas isso não quer dizer que você está proibido de fazê-lo de outra maneira. Existem muitas vezes, como com a informática, inúmeras maneiras de fazer as coisas, e assim definitivamente se sentir livre para usar um tipo diferente de solução do que eu possa ter apresentado. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Uma seção de perguntas - 1. César - 2. Vigenère] Tudo bem. Então conjunto de problemas 2: Crypto é uma diversão. Mais uma vez, com todos os pset você vai começar com uma seção de perguntas que vai ser realizado em suas seções com o seu companheiro de ensino atribuído. Nós não vamos passar por estes sobre o passo a passo, mas eles definitivamente vai ajudar a concluir a pset. Assim, a primeira parte do conjunto de problemas é César. E assim, em César alguém vai passar-lhe uma chave com um número inteiro, e você vai criptografar uma seqüência de texto que eles fornecem e dar-lhes de volta uma coisa criptografada. Se alguém assistiu Uma História de Natal, há um exemplo de que não há. Em seguida, a segunda parte do conjunto de problemas é Vigenère, que é uma técnica mais avançada de criptografia. E assim vamos codificar uma parte do texto, exceto em vez de apenas um único número inteiro, na verdade estamos indo para codificá-la com uma palavra-chave que o usuário irá nos fornecer. Ok, então a primeira ferramenta na caixa de ferramentas de hoje é realmente vai ser a atualização do aparelho. No fórum de discussão veríamos coisas como, "Por que não funciona?" "Por que não 50 Enviar trabalho?" e muitas vezes a solução é realmente apenas para atualizar o seu aparelho. E por isso, se você acabou de ser executado em uma janela de terminal em seu aparelho sudo yum-y - que é uma bandeira dizendo que sim, atualizar tudo - atualização, em seguida, o aparelho irá atualizar se necessário. E não faz mal se você já está na versão mais recente do aparelho. Em seguida, ele vai apenas dizer que não há atualizações disponíveis e você pode continuar a trabalhar junto. Mas isso é bom para executar até mesmo a cada vez que você abrir o aparelho porque ainda estamos muito - por vezes, se entramos em um bug - corrigi-lo no aparelho. Então, certifique-se que você tem a versão mais recente do aparelho e executar o que atualizar lá. Tudo bem. Então, já que estamos lidando com as letras e mudando, cifragem coisas, vamos realmente quer se tornar o melhor amigo de nossa tabela ASCII. Há os numerosos online, se você encontrar. Talvez até mesmo fazer o seu próprio. Basicamente, com cada letra e cada número e cada personagem existe um número associado a eles, e por isso é bom de ver seus valores ASCII ao lado da letra real. Isso vai ajudá-lo definitivamente no conjunto de problemas. Uma coisa que realmente me ajudou nesse conjunto de problemas era, na verdade, imprimi-lo, e como eu estava passando, eu realmente utilizá-lo, escrever: "Se este tem de ir para lá, então ..." Tipo de utilizá-lo e marcá-lo, tornar-se a melhor amiga de sua tabela ASCII. Então nós temos algumas outras ferramentas à nossa disposição. Desta vez, em vez de realmente avisar o usuário para toda a sua entrada vamos fazer uma combinação. Nós vamos levá-los para alguma entrada, mas nós também vamos usar apenas os argumentos de linha de comando. Então, quando eles correm o programa, geralmente você diz. / Olá, por exemplo, se o seu programa foi hello.c. Mas, desta vez, em vez de apenas dizer que, eles podem colocar palavras, argumentos depois. E assim nós vamos usar o que eles passam para nós como o seu contributo, bem como, tão comovente além de apenas solicitando inteiro, mas também usando argumentos de linha de comando. E depois vamos em matrizes e strings, que vamos estar usando muito bem. Aqui é apenas um exemplo de um gráfico de mini-ASCII. Como eu disse, cada letra corresponde a um número, e assim se familiarizar com isso. Ele vai vir a calhar. E mais tarde, quando começar a fazer alguns ASCIIMath lidar com os números - adicionar, subtrair-los -, então definitivamente bom para se referir a este gráfico. Então, aqui está um exemplo de uma cifra de César - algo que você pode ter jogado. É apenas uma roda. Essencialmente, existe um alfabeto exterior e, em seguida, existe um alfabeto interior. Então, aqui está um exemplo da cifra de César, mas com uma chave de 0. Essencialmente, um está alinhada com A, B está alinhado com B, todo o caminho até Z. Mas, então, dizer que queria uma chave de três, por exemplo. Então nós girar a roda interna de modo que A agora se alinha com D, etc E assim, este é, essencialmente, o que vamos fazer. Nós não temos uma roda, mas o que vamos fazer é fazer o nosso programa tipo de deslocar o alfabeto connosco uma certa quantidade de números. Então, como eu disse antes, nós vamos estar lidando com argumentos de linha de comando bem como a obtenção de um número inteiro. Assim, a maneira que um usuário irá executar o seu programa de César é por dizer. / Caesar e, em seguida, digitar um número depois disso. E esse número representa a chave, a mudança, quantas vezes você vai estar girando a roda interior de sua cifra de César. E assim que você vê aqui um exemplo. Se entramos as letras de A a L em nossa cifra de César, então, seria a entrada D a O, porque é cada letra deslocou mais de 3 vezes, assim como o exemplo da roda que eu mostrei. Então, se você entrou, por exemplo, esta é CS50! então seria também mover todas as letras. E isso é uma coisa importante, tanto César e Vigenère é que nós vamos desconsiderar quaisquer cartas não-. Então, todos os espaços, personagens, etc, números, vamos mantê-los o mesmo. Só vamos mudar as letras neste caso. Então, como você vê na roda, só temos as letras disponíveis para nós, por isso só quero mudar as letras e criptografar as letras. Portanto, a primeira coisa a fazer, você viu que o uso para César em conjunto de problemas 2 é executar César e insira um número quando você executá-lo no terminal. Então o que precisamos fazer é de alguma forma obter essa chave e acessá-lo. E assim que nós queremos de alguma forma ver que vai ser o argumento segunda linha de comando. O primeiro vai ser. / César, eo próximo vai ser o número chave. Então, antes que nós tivemos int (void) principal para iniciar nossos programas de C. Estamos indo para descascar uma camada um pouco e realmente ver que em vez de passar no vazio a nossa função principal na verdade estamos lidando com dois parâmetros. Nós temos um int argc chamado e depois um conjunto de cordas chamado argv. Então argc é um inteiro, e representa o número de argumentos passados ​​para seu programa. E então argv é na verdade a lista de argumentos passados. Todos os argumentos são strings, e assim argv representa uma matriz, uma lista de strings. Vamos falar sobre matrizes um pouco. Matrizes são essencialmente uma nova estrutura de dados. Temos ints, temos dobra, temos cordas, e agora temos matrizes. Matrizes são estruturas de dados que pode conter vários valores do mesmo tipo, Então, basicamente, uma lista de tudo o tipo que você quiser. Essencialmente, se você queria uma lista de inteiros, tudo em uma variável, então você deve criar uma nova variável, que foi de matriz tipo int. Então matrizes são com índice zero, o que significa que o primeiro elemento da matriz é no índice 0. Se a matriz é de comprimento 4, como neste exemplo, então o último elemento seria no índice 3, o qual é 4 - 1. Portanto, para criar matriz, você faria algo assim. Digamos que você queria uma matriz dupla. Isso vale para qualquer tipo de tipo de dados, no entanto. Então diga que você quer um conjunto duplo. Digamos que você queira chamá-lo de caixa de correio. Assim como você inicializar qualquer outro casal, você diria casal e em seguida o nome, mas desta vez vamos colocar os colchetes, e, em seguida, o número haverá o comprimento da matriz. Note-se que nas matrizes que não pode já modificar o comprimento, assim você sempre tem de definir e escolher quantas caixas, quantos valores a matriz vai realizar. Assim, para definir valores diferentes em sua matriz, você vai usar essa sintaxe seguinte, como você pode ver no slide. Você tem 0 índice de caixa será definido para 1,2, caixa de correio índice de 1 set a 2.4, etc Portanto, agora que nós revimos matrizes um pouco, vamos voltar para argc e argv. Sabemos que argv é agora uma matriz de strings. Assim, quando um usuário passa - dizem que está executando um programa - eles dizem. / Olá David Malan, o que o programa vai fazer por você já é, na verdade, vir para cima com o argc e argv são. Assim você não precisa se preocupar com isso. Argc, neste caso, seria de 3 porque vê três palavras distintas separadas por espaços. E então a matriz, neste caso, o primeiro índice seria. / Olá, a próxima Davi, o Malan próximo. Alguém vê imediatamente que a relação entre argv,  a matriz, e argc é? Sim. Nós vamos entrar que em um exemplo de args.c. Vamos ver se conseguimos tirar proveito da relação entre o 2. Aqui você pode achar que no aparelho o aplicativo padrão para abrir arquivos. C às vezes é Emacs. Mas queremos lidar com gedit, então o que você pode fazer é que você pode clique direito sobre o arquivo C, vá para Propriedades, Abrir com e, em seguida, escolha gedit, definido como padrão, e agora o programa deve abrir no gedit em vez de Emacs. Perfeito. Então aqui eu tenho um programa que eu quero imprimir cada argumento de linha de comando. Então o que o usuário insere, quero essencialmente devolvê-lo de volta para eles em uma nova linha. Então, o que é uma estrutura que podemos usar para iterar sobre algo - algo que você provavelmente usado em seu 1 pset? Se você quer passar por um determinado número de coisas? >> [Aluno] Para loop. Para loop. Exatamente. Então, vamos começar com o loop for. Temos para int i = 0. Vamos começar com uma variável de inicialização padrão. Eu vou deixar a condição de um conjunto e, em seguida, dizer que eu + +, vai fazer as coisas lá. Tudo bem. Então, pensando de volta para argv, argv, se a lista de argumentos passados ​​para o programa e argc é o número de argumentos no programa, em seguida, o que significa que argc é essencialmente do comprimento da argv, direita, porque não vão ser tantos argumentos como o valor de argc. Portanto, se queremos iterar sobre cada elemento em argv, vamos querer cada vez acessar a variável em argv no índice fornecido. Que pode ser representado com isso, certo? Esta variável representa aqui a seqüência particular neste caso porque é uma matriz de cadeia - a string particular naquele determinado índice. O que nós queremos fazer, neste caso, queremos imprimi-lo, então vamos dizer que printf. E agora argv é uma string, por isso queremos colocar esse espaço reservado lá. Queremos uma nova linha apenas para torná-lo bom. Portanto, temos aqui um laço para. Não temos a condição ainda. Então eu começa em 0, e depois cada vez que vai imprimir a string dada em que o índice particular na matriz. Assim, quando queremos parar de imprimir elementos na matriz? Quando terminarmos, certo? Quando chegamos ao fim da matriz. Então, nós não queremos ultrapassar passado o comprimento da matriz, e já sabemos que não precisamos realmente ativamente descobrir o que o comprimento de argv é porque é dado a nós, eo que é isso? Argc. Exatamente. Então, nós queremos fazer este número argc processo de vezes. Eu não estou no diretório certo. Tudo bem. Agora vamos fazer args. Sem erros, o que é ótimo. Então vamos correr args. O que é que isto vai voltar para nós? Ele só vai imprimi-lo de volta. "Você digitou args no programa, eu vou dá-lo de volta para você." Então, vamos dizer que queremos dizer args então foo bar. Assim, pois, imprime-lo de volta para nós. Tudo bem? Portanto, há um exemplo de como você pode usar argc e argv sabendo que argc representa o comprimento do argv. Certifique-se de que você não faz nunca, com matrizes de acesso de um além do comprimento da matriz porque C vai definitivamente gritar com você. Você vai ter uma coisa chamada falha de segmentação, que nunca é divertido, basicamente dizendo que você está tentando acessar algo que não existe, não pertence a você. Então, certifique-se, e, especialmente, com o zero-indexação, nós não queremos - Como por exemplo, se temos uma matriz de comprimento 4, que o índice de matriz 4 não existe, porque nós começamos a 0, no índice zero. Ele vai se tornar uma segunda natureza como loops quando começamos a 0. Então, basta manter isso em mente. Você não quero nunca acessar o índice de uma matriz que está além de seu alcance. Assim, podemos ver agora como podemos tipo de acesso os argumentos de linha de comando que são passados ​​dentro Mas, como você viu a corda, o argv é na verdade uma matriz de cadeia. Portanto, não é realmente um inteiro ainda, mas em César queremos lidar com números inteiros. Felizmente, existe uma função criada para nós que pode realmente converter uma string para um inteiro. Também aqui não estamos lidando com a entrada do usuário para onde estamos levando-os para a entrada de aqui para a chave, por isso não podemos realmente Reprompt e dizer: "Oh, me dê outro inteiro, por exemplo, se não é válido." Mas nós ainda precisamos verificar se há uso correto. Em César eles só estão autorizados a passar em um número, e assim que tem que funcionar. / César e então eles têm que dar-lhe um número. Assim argc tem que ser um número determinado. Qual o número que seria isso, se eles têm de passar-lhe o. / César e depois uma chave? O que é argc? >> [Aluno] 2. >> Dois. Exatamente. Então você quer ter certeza de que argc é 2. Caso contrário, você basicamente se recusar a executar o programa. Na principal é uma função que diz int main, então nós sempre em 0 boas práticas de retorno no final de um programa bem sucedido. Assim, se, por exemplo, eles dão-lhe três argumentos de linha de comando em vez de 2 ou dar-lhe uma, por exemplo, então o que você vai fazer é você vai querer verificar para que e depois voltar um dizendo, não, eu não posso continuar com este programa. [Aluno] Não pode haver um espaço em seu texto. >> Perdoe-me? [Aluno] Não pode haver um espaço no texto que você está tentando criptografar. Ah! Em termos do texto que estamos tentando criptografar, que na verdade vem depois quando damos esse texto. Então, agora, nós estamos apenas aceitar como argumentos de comando do número real, a mudança real para a criptografia de César. [Aluno] Por que você precisa de 2 ao invés de apenas um argc? Há definitivamente um número. Direito. A razão pela qual precisamos de 2 para argc, em vez de um é porque quando você executar um programa e dizer. / César ou. / Olá, que realmente conta como um argumento de linha de comando. Assim, então, que já ocupa 1 e assim então nós estamos introduzindo um extra. Então você está introduzindo na verdade uma seqüência no argumento de linha de comando. O que você quer fazer, para César que querem lidar com um número inteiro, assim você pode usar esta função atoi. E, basicamente, você passá-lo em uma corda e em seguida, ele irá voltar para trás um número inteiro se é possível fazer essa string em um inteiro. Agora lembre-se quando estamos lidando com coisas printf ou GetString, assim, que incluem as bibliotecas que são específicas para nós. Assim, no início, começamos com uma marca de algo hash padrão I / O,. H, assim. Bem, atoi não está dentro de uma dessas bibliotecas, Então, o que temos que fazer é que temos de incluir a biblioteca certo para isso. Então, lembro de volta para Passo a passo 1 onde eu discuti a função manual. Te tipo homem no seu terminal e, em seguida, seguida pelo nome de uma função. E para que trará uma lista inteira de seu uso, mas também vai trazer o que biblioteca que pertence. Então, eu vou deixar isso para você usar a função manual com atoi e descobrir qual biblioteca você precisa incluir para ser capaz de usar a função atoi. Então, nós temos a chave e agora se trata de obter o texto simples, e para que, na verdade, vai ser a entrada do usuário onde você pedir. Lidamos com GetInt e GetFloat, e assim na mesma linha vamos estar lidando com GetString. Mas, neste caso, não precisamos de fazer qualquer WHILE ou while para verificar. GetString vai certamente dar-nos uma corda, e nós estamos indo para criptografar o que o usuário nos dá. Assim, você pode assumir que todas essas seqüências de usuários inseridos estão corretos. Grande. Então uma vez que você tem a chave e uma vez que você tem o texto, agora o que resta é que você tem que codificar o texto simples. Só para cobrir rapidamente sobre linguagem, o texto original é o que o usuário lhe dá, eo texto cifrado é o que você voltar a eles. Então, cordas, para poder passar por realmente letra por letra porque temos de mudar cada letra, entendemos que as seqüências, se nós tipo de descascar a camada, vemos que eles são apenas realmente uma lista de caracteres. Um vem a seguir ao outro. E assim podemos tratar cordas como matrizes, porque elas são matrizes de caracteres. Então, digamos que você tem uma seqüência chamada de texto, e dentro desse texto variável é armazenada Este é CS50. Em seguida, o texto no índice 0 seria um T maiúsculo, índice 1 seria h, etc E, em seguida, com matrizes, no exemplo em args.c argc, vimos que tínhamos para iterar sobre um array e por isso tivemos de repetir a partir de i = 0 até i é menor do que o comprimento. Então, precisamos de alguma forma de descobrir o que o comprimento da corda é nossa se vamos para iterar sobre ele. Felizmente, novamente, há uma função que para nós, embora mais tarde na CS50 você vai certamente ser capaz de implementar e fazer a sua própria função que pode calcular o comprimento de uma corda. Mas, por enquanto, vamos usar comprimento da corda, assim strlen. Você passa uma corda, e então ele irá retornar um int que representa o comprimento da seqüência. Vejamos um exemplo de como podemos ser capazes de iterar sobre cada caractere em uma string e fazer algo com isso. O que queremos fazer é iterar cada caractere da cadeia, eo que nós queremos fazer é que imprimir voltar cada personagem 1 a 1 exceto acrescentamos algo próximo a ele. Então, vamos começar com o loop for. Int i = 0. Nós vamos deixar espaço para a condição. Queremos repetir até chegar ao final da cadeia, certo? Então, o que nos dá a função de comprimento da corda? [Resposta do aluno inaudível] Esse é o comprimento dos argumentos de linha de comando. Mas, para uma string que queremos usar uma função que nos dá o comprimento da corda. Então, isso é comprimento da corda. E então você tem que passar em uma corda para ele. Ele precisa saber o que ele precisa de corda para calcular o comprimento de. Então, neste caso, estamos lidando com cadeia s. Grande. Então o que nós queremos fazer, vamos printf. Agora, queremos lidar com caracteres. Queremos imprimir cada personagem individualmente. Quando você quiser imprimir um float, você usaria o marcador, como f%. Com um int você usaria% d. E assim da mesma forma, com um personagem que você usar c% para dizer que eu vou estar imprimindo um caráter que está armazenado dentro de uma variável. Então nós temos isso, e vamos adicionar um período e um espaço para ele. Qual personagem que estamos usando? Nós vamos estar usando qualquer personagem que estamos no da cadeia. Então nós vamos estar usando algo com a corda, mas nós queremos estar acessando o personagem certo lá. Então, se uma string é apenas uma matriz, como podemos então acessar elementos de matrizes? Temos aquelas chaves, e então colocamos o índice lá. Portanto, temos colchetes. Nosso índice, neste caso, podemos usar apenas i. Exatamente. Então, aqui estamos dizendo que vamos estar imprimindo um caractere seguido por um ponto e um espaço, e que o personagem vai ser a letra om em nossa cadeia s. Eu só vou para salvar isso. Okay. Agora estou indo para executar comprimento da corda. Então, nós tivemos uma string chamada OMG, e agora está ainda mais realçado. Da mesma forma, vamos dizer que realmente deseja obter uma string do usuário. Como podemos fazer isso? Antes, como chegamos a um int? Dissemos GetInt, certo? Mas este não é int, então vamos GetString. Vamos fazer comprimento da corda. Aqui nós não entrou um aviso específico. Então, eu não sei. Eu vou colocar o meu nome aqui e então eu posso fazer uma dessas coisas onde eu atribuir uma palavra para cada letra ou algo assim. Cool. Então, isso é comprimento da corda. Então, estamos de volta a César. Nós temos algumas ferramentas sobre como nós iterar sobre uma corda, como podemos acessar cada elemento individual. Então agora podemos voltar para o programa. Como mencionei antes, na tabela ASCII, seu melhor amigo, você vai ver os números que estão associados a cada letra. Então aqui dizer que o nosso texto simples é que eu estou tonto! Em seguida, cada um destes caracteres irá ter um número e valor ASCII associado a ele, mesmo o apóstrofo, até mesmo o espaço, mesmo a marca de exclamação, assim que você vai querer manter isso em mente. Então, dizer que a nossa chave que o usuário incluído em seu argumento de linha de comando é 6. Isto significa que para a primeira letra, que é I, o qual é representado por 73, você querer voltar para eles o que letra é representada pelo valor ASCII de 73 + 6. Neste caso, que seria 79. Agora, queremos ir para o próximo caractere. Portanto, a seguinte índice 1 do plaintext seria o apóstrofo. Mas lembre-se nós só queremos codificar as letras. Então, nós queremos ter certeza de que o apóstrofo na verdade, permanece o mesmo, que não mudar de 39 para 45 o que é. Queremos mantê-lo como uma apóstrofe. Então, nós queremos lembrar-se de apenas codificar as letras porque queremos que todos os outros símbolos se mantenha inalterado em nosso programa. Outra coisa que queremos é preservar a capitalização. Então, quando você tem uma letra maiúscula, ele deve permanecer como uma maiúscula. Lowercases deve permanecer como minúsculas. Por isso, algumas funções úteis para ser capaz de lidar com letras apenas cifragem preservar e manter a capitalização das coisas é a função IsLower isalpha, isupper,. E estes são funções que retornam você um valor booleano. Basicamente, verdadeiro ou falso. É este um maiúscula? É este o alfanumérico? É este uma carta, essencialmente. Então, aqui estão três exemplos de como você deve usar essa função. Basicamente, você pode testar se o valor devolvido pela função é verdadeira ou falsa com base em que a entrada. Quer fazer algo não cifrar ou cifra que ou certifique-se de que é maiúscula, etc [Estudante] Você pode apenas explicar aqueles um pouco mais e como você usá-los? >> Sim, com certeza. Então, se olharmos para trás, aqui nós temos um capital I, certo? Então, nós sabemos que vai para Ó porque eu + 6 é O. Mas nós queremos ter certeza de que O que vai ser uma capital de O. Então, basicamente, que é uma espécie de vai mudar a nossa entrada. Então, se é maiúscula ou não vai tipo de alterar a forma como lidamos com ele. Então, se nós usamos a função isupper em que determinado índice, assim isupper ("I"), que retorna para nós verdade, então sabemos que é superior. Então com base em que, mais tarde vamos entrar em uma fórmula que você vai usar para mudar as coisas de César, Então, basicamente, não vai ser uma fórmula um pouco diferente se é maiúscula ao contrário de minúsculas. Faz sentido? Sim. Não se preocupe. Eu falei um pouco sobre a adição de 6 a uma carta, que não chega a fazer sentido exceto quando tipo de entender que esses personagens são uma espécie de intercambiáveis ​​com números inteiros. O que fazemos é que tipo de fundição uso implícito. Vamos para lançar um pouco mais tarde, onde você toma um valor e transformá-lo em um tipo diferente do que era originalmente. Mas com este pset vamos ser capazes de usar indistintamente tipo de caracteres e os correspondentes seus valores inteiros. Então, se você simplesmente encerrar um personagem com apenas as aspas simples, então você vai ser capaz de trabalhar com ele com números inteiros, tratando-o como um número inteiro. Assim, o capital C refere-se a 67. F minúsculas refere-se a 102. Novamente, se você quiser saber esses valores, olhar para a sua tabela ASCII. Então, vamos entrar em alguns exemplos de como você pode ser capaz de subtrair e somar, como você pode realmente realmente trabalhar com esses personagens, use-os alternadamente. I dizer que ASCIIMath vai calcular a adição de um caracter para um número inteiro e, em seguida, apresenta o carácter resultante, bem como o valor resultante ASCII. E aqui eu estou dizendo - we'll acordo com esta parte mais tarde - mas, basicamente, eu estou dizendo que o usuário deve dizer ASCIIMath executado juntamente com uma chave, e eu estou dizendo que a chave vai ser o número com o qual estamos indo para adicionar este personagem. Então aqui notar que desde que eu estou exigindo uma chave, desde que eu estou exigindo que eles estão me dando uma coisa, Eu só quero aceitar. / Asciimath e uma chave. Então, eu vou exigir que argc é igual a 2. Se não é, então eu vou retornar 1 eo programa vai sair. Então, eu estou dizendo que a chave não vai ser o primeiro argumento da linha de comando, que vai ser o segundo, e, como você vê aqui, Eu vou transformar isso em um inteiro. Então eu estou indo para definir um personagem para ser r. Note-se que o tipo da variável chr é realmente um número inteiro. O jeito que eu sou capaz de usar r como um inteiro é encerrando com estas aspas simples. Então, de volta à nossa declaração de printf onde temos um espaço reservado para um personagem e um espaço reservado para um número inteiro, o caracter é representado pelo chr, e o número inteiro é a chave. E então vamos adicionar o resultado em dois juntos. Então, nós estamos indo para adicionar r + o que é a chave, e depois vamos para imprimir o resultado disso. Então, vamos fazer asciimath. Cabe a data, então vamos correr asciimath. Ah, mas veja, ele não faz nada, porque nós realmente não dar-lhe uma chave. Então, quando ele só voltou uma, a nossa função principal, ele só voltou para nós. Então vamos passar em uma chave. Alguém me dar um número. >> [Aluno] 4. 4. Okay. Assim, um aumento de 4 r vai dar us v, o que corresponde ao valor ASCII 118. Então que tipo de faz sentido que - Na verdade, posso te perguntar, o que você acha que o valor ASCII de r é se r + 4 é de 118? Então, sim, é de 114 r. Então, se você olhar para a tabela ASCII, então, com certeza, você vai ver que r é representado por 114. Portanto, agora que sabemos que podemos adicionar inteiros para caracteres, isso parece bastante simples. Nós apenas estamos indo para repetir uma string como vimos no exemplo anterior. Vamos verificar se é uma carta. Se for, então vamos transferi-lo por qualquer que seja a chave. Muito simples, exceto quando você começa a gostar deste, você vê que z, representado por 122, em seguida, iria dar-lhe um caráter diferente. Na verdade, quero ficar dentro do nosso alfabeto, certo? Portanto, temos de descobrir alguma maneira de tipo de envolvimento em torno. Quando você chegar zed e pretende aumentar em um determinado número, você não quer ir para além da secção alfabeto ASCII; você deseja dispor de volta todo o caminho para A. Mas tenha em mente que você ainda está preservando o caso. Então, sabendo que as letras não podem se tornar símbolos como símbolos não vão estar mudando também. Na última pset você definitivamente não precisa, mas uma opção foi implementar o seu pset ganancioso usando a função módulo. Mas agora nós estamos indo realmente precisa usar módulo, então vamos apenas passar por cima deste um pouco. Basicamente, quando você tem x modulo y, que lhe dá o resto de x dividido por y. Aqui estão alguns exemplos aqui. Nós temos a 27% 15. Basicamente, quando você subtrair 15 de 27 tantas vezes quanto possível, sem ficar negativo então você obtém 12 sobraram. Então, isso é tipo como no contexto de matemática, mas como podemos realmente usar este? Ele vai ser útil para o nosso wrapover. Para isso, vamos apenas dizer que eu pedi a todos que se dividem em três grupos. Às vezes você faz isso em grupos e algo como isso. Digamos que eu disse: "Ok, eu quero que todos vocês ser dividido em três." Como você poderia fazer isso? [Resposta do aluno inaudível] Sim, exatamente. Conte fora. Okay. Vamos realmente fazer isso. Você quer começar? [Estudantes contando] 1, 2, 3, 4. Mas lembre-se ... >> [Aluno] Oh, desculpe. Esse é um ponto muito bom. Você disse 4, mas nós realmente quero que você diga uma porque nós só queremos três grupos. Então, como - Não, isso é um bom exemplo, porque então como você pode dizer uma? Qual é a relação entre 4 e 1? Bem, 4 mod 3 é 1. Então, se você continuar, você seria 2. Assim, temos 1, 2, 3, 1, 2. Mais uma vez, você está, na verdade, a 5 ª pessoa. Como você sabe a dizer 2 em vez de 5? Você diz que 5 mod 3 é 2. Quero ver quantos grupos de 3 sobram, depois que ordem sou eu E então se continuou ao longo da sala inteira, então veríamos que estamos sempre na realidade da aplicação da função mod para nós mesmos que tipo de contar off. Isso é um tipo de exemplo mais tangível de como você pode usar modulo porque eu tenho certeza que a maioria de nós provavelmente já passou por esse processo onde tivemos que contar fora. Qualquer dúvida sobre modulo? Será muito importante para compreender os conceitos desta, então eu quero ter certeza de que vocês entendem. [Aluno] Se não houver resto, não é dar-lhe o número real? Se um dos três primeiro deles tivesse feito isso, teria dado a eles o que eles realmente eram, ou ele teria dado a eles [inaudível] >> Essa é uma boa pergunta. Quando não há restante para o módulo - para dizer que você tem 6 mod 3 - que realmente lhe dá de volta 0. Nós vamos falar sobre isso um pouco mais tarde. Ah, sim, por exemplo, a pessoa 3 - 3 mod 3 é realmente 0, mas ela disse 3. Então, isso é como uma espécie de captura interna, por exemplo, como bem, se o mod é 0, então eu vou ser a 3 ª pessoa. Mas nós vamos entrar em tipo de como podemos querer lidar com o que 0 é tarde. Então agora nós de alguma forma, ter uma maneira de mapear o zed a letra certa. Então, agora nós passamos por estes exemplos, que tipo de ver como César poderia funcionar. Você vê os dois alfabetos e então você vê-los a mudar. Então, vamos tentar expressar que em termos de fórmula. Esta fórmula é, na verdade, dada a você na especificação, mas tipo vamos de olhar através do que significa cada variável. Nosso resultado final vai ser o texto cifrado. Portanto, esta diz que o caráter i da cifrado vai corresponder ao carácter i da de texto simples. Isso faz sentido porque queremos ser sempre alinhando essas coisas. Por isso, vai ser o personagem i da mais k cifrado, que é a nossa chave - que faz sentido - e então temos este mod 26. Lembre-se de volta quando tivemos o zed nós não queremos entrar no personagem, então nós queríamos para modificar isso e do tipo de envoltório em torno do alfabeto. Após zed você iria para a, b, c, d, até que você tem o número certo. Então, sabemos que zed, se + 6, nos daria f porque depois vem zed a, b, c, d, e, f. Então, vamos lembrar que sabemos com certeza que zed + 6 vai dar-nos f. Em valores ASCII, z é de 122 e f é 102. Então nós temos que encontrar uma maneira de fazer a nossa fórmula César nos dar 102 depois de tomar em 122. Então, se nós simplesmente aplicamos essa fórmula, o% ('z' + 6) 26, que, na verdade, dá-lhe 24 porque 122 + 6 é de 128; 128% 26 dá-lhe 24 restantes. Mas isso não significa realmente f. Isso definitivamente não é 102. Isso não é também a carta 6 no alfabeto. Então, obviamente, temos de ter alguma forma de ajustar isso um pouco. Em termos do alfabeto normal, sabemos que z é a letra 26 e f é a sexta. Mas estamos em ciência da computação, por isso estamos indo para o índice de 0. Então, em vez de z é o número 26, vamos dizer que é o número 25 porque a é 0. Então agora vamos aplicar esta fórmula. Temos z representado por 25 + 6, o que lhe dá 31. E 31 mod 26 dá-lhe 5 como um resto. Isso é perfeito, porque sabemos que é a letra f 5 no alfabeto. Mas ainda não é f, certo? Ele ainda não é 102. Então para este pset, um desafio será tentar descobrir a relação entre converter entre estes valores ASCII e do índice alfabético. Essencialmente, o que você quer fazer, você quer começar com os valores ASCII, mas depois você quer de alguma forma, traduzir isso em um índice alfabético em seguida, calcular o que a carta deve ser - basicamente, o que o seu índice alfabético é do caráter cifra - então traduzir isso para os valores ASCII. Então, se você sacar sua tabela ASCII, em seguida, tentar encontrar relações entre, digamos, 102 e 5 ou a 122 e 25. Nós começamos nossa chave dos argumentos de linha de comando, temos obtido o texto simples, temos cifrada-lo. Agora tudo o que resta a fazer é imprimi-lo. Nós poderíamos fazer isso de duas maneiras diferentes. O que podemos fazer é realmente imprimir à medida que avançamos. Como nós iterar sobre os caracteres na seqüência, poderíamos simplesmente imprimir certo, então quando nós calculá-lo. Alternativamente, você também pode armazená-lo em uma matriz e tem uma matriz de caracteres e no final iterar sobre essa matriz inteiro e imprimi-lo. Então você tem duas opções para isso. E lembre-se que% c vai ser o espaço reservado para a impressão de um personagem. Portanto, temos de César, e agora vamos passar para Vigenère, o que é muito semelhante ao Caesar, mas apenas um pouco mais complexo. Então, basicamente com Vigenère é que você vai estar passando em uma palavra-chave. Então, em vez de um número, você vai ter uma seqüência, e assim que vai agir como a palavra-chave. Então, como sempre, você está indo para obter um prompt para uma string do usuário e então cifrar-lo e depois dar-lhes a volta cifrado. Então, como eu disse, é muito semelhante ao César, exceto em vez de deslocar por um determinado número, o número é realmente vai mudar cada vez de personagem para personagem. Para representar o número real de mudar, ele é representado pelas letras do teclado. Então, se você entrar em uma mudança de um, por exemplo, em seguida, que corresponderia a uma mudança de 0. Então, é mais uma vez de volta ao índice alfabético. O que pode ser útil se você está vendo que estamos realmente lidando com valores ASCII bem como as cartas, assim como o índice alfabético, talvez encontrar ou fazer a sua própria tabela ASCII que mostra o índice alfabético de 0 a 25, A a Z, e os valores ASCII de modo que você pode tipo de ver a relação e esboçar e tentar encontrar alguns padrões. Da mesma forma, se você estivesse mudando na instância determinada por f - e este é ou f minúscula ou maiúscula -, então, que corresponderia a 5. Estamos bem até agora? A fórmula para Vigenère é um pouco diferente. Basicamente, você vê que é apenas como César, exceto em vez de apenas k temos k índice j. Note que não estamos usando i porque essencialmente, o comprimento da palavra-chave não é necessariamente o comprimento do nosso texto cifrado. Este será um pouco mais claro quando vemos um exemplo que eu tenho um pouco mais tarde. Basicamente, se você executar o programa com uma palavra-chave de ohai, então isso significa que a cada vez, ohai vai ser o seu turno. Então, dependendo de em que posição você está em sua palavra-chave, você vai mudar o seu caráter cifrado determinada por essa quantia. Novamente, assim como César, queremos ter certeza de que nós preservar a capitalização das coisas e nós apenas letras de encriptação, não caracteres ou espaços. Então, olhar para trás a César sobre as funções que você pode ter usado, a maneira que você decidiu como mudar as coisas, e que se aplicam ao seu programa aqui. Então, vamos mapear isso. Nós temos um texto simples que temos obtido a partir do usuário a partir de GetString Esta dizendo ... é CS50! Então nós temos uma palavra-chave de ohai. Os primeiros quatro caracteres são bastante simples. Sabemos que T vai ser deslocada por o, h, em seguida, vai ser desviado por h, i vai ser desviado por um. Aqui você vê que a representa 0, assim, então o valor final é na verdade apenas uma carta a mesma de antes. Então s é deslocado por i. Mas então você tem esses períodos aqui. Nós não queremos para codificar que, então nós não mudá-lo por nada e apenas imprimir o período inalterado. [Estudante] Eu não entendo como você sabe que este é deslocado por - Onde você - >> Oh, desculpe. No topo aqui você vê que o comando ohai argumento de linha aqui, que vai ser a palavra-chave. E por isso, basicamente, você está de bicicleta sobre os personagens a palavra-chave. [Estudante] Então o que vai estar mudando o mesmo - Assim, o correspondente a um determinado número no alfabeto. [Estudante] Direito. Mas de onde você tirou a parte de CS50? Oh. Isso é em GetString onde você está como, "Dê-me uma corda para codificar." [Aluno] Eles vão dar-lhe esse argumento para mudar por e então você vai pedir a sua primeira corda. Sim >>. Então, quando eles executar o programa, que vão incluir a palavra-chave em seus argumentos de linha de comando quando executá-lo. Então, depois de ter verificado que eles realmente lhe deu um, e não mais, não menos, em seguida, você vai levá-los para uma seqüência, digamos, "Dê-me uma corda". Então é aí que, neste caso, eles deram-lhe isto ... é CS50! Então você vai usar isso e usar ohai e iterar. Note que aqui nós pulamos criptografar os períodos, mas em termos de nossa posição para ohai, o próximo usamos o. Neste caso, é um pouco mais difícil de ver porque é 4, então vamos continuar um pouco. Basta ficar aqui comigo. Então temos i e s, os quais são, em seguida, traduzido por O e H, respectivamente. Então, temos um espaço, e então nós sabemos que não vamos para codificar os espaços. Mas note que, em vez de ir a um neste ponto aqui, estamos criptografando por um - Eu não sei se você pode ver que - bem aqui. Então não é como se você realmente predeterminado, digamos, o vai aqui, vai aqui h, um vai aqui, i vai aqui, o, h, a, i, o, h, a, i. Você não faz isso. Você só mudar a sua posição na palavra-chave quando você sabe que você está indo realmente para ser criptografar uma carta real. Será que esse tipo de faz sentido? Okay. Assim, apenas alguns lembretes. Você quer ter certeza de que você só avançará para a próxima letra a palavra-chave se o personagem em seu texto original é uma letra. Então, dizer que estamos no o. Percebemos que o próximo personagem, o índice i do texto original, é um número, por exemplo. Então, nós não avançamos j, o índice para a nossa palavra-chave, até chegar outra carta. Novamente, você também quer ter a certeza de que você envolvente para o início da palavra-chave quando você está no fim. Se você ver aqui estamos no i, o próximo tem que ser o. Então você quer encontrar uma forma de poder envolvente para o início da sua palavra-chave cada vez que você chegar ao fim. E assim mais uma vez, que tipo de operador é útil, neste caso para enrolar? Como na contagem fora exemplo. [Aluno] O sinal de por cento. >> Sim, o sinal de porcentagem, que é módulo. Então modulo vai vir a calhar aqui, quando você deseja dispor sobre o índice no seu ohai. E apenas uma sugestão rápida: Tente pensar de envolver mais a palavra-chave um pouco como o off contando, onde se há três grupos, a pessoa 4, seu número que eles disseram foi de 4 mod 3, que foi 1. Então tente pensar dessa maneira. Como você viu na fórmula, sempre que tiver ci e depois pi mas depois kj, você quer ter certeza de que você manter o controle desses. Você não precisa de chamá-lo de mim, você não precisa de chamá-lo j, mas você quer ter certeza de que você manter o controle da posição que você está em seu plaintext bem como a posição que você está na sua palavra-chave porque aqueles que não são, necessariamente, será o mesmo. Não só a palavra-chave - que poderia ser uma extensão completamente diferente do que o seu texto simples. Além disso, o texto simples, existem números e caracteres, de modo que não vai combinar perfeitamente juntos. Sim. [Aluno] Existe uma função para mudar caso? Você pode alterar um ao capital A? >> Sim, há definitivamente. Você pode conferir - eu acredito que é toupper, toda palavra 1. Mas quando você está tentando cifra coisas e preservar o texto, ele é o melhor, basicamente, a ter casos separados. Se for uma maiúscula, então você quer mudar por este porque em sua fórmula, quando você olha para trás como temos que tipo de movimento alternadamente entre o modo ASCII de representar os números eo índice alfabético real, nós queremos ter certeza de lá vai ser algum tipo de padrão que você vai usar. Outra nota sobre o padrão, na verdade. Você vai definitivamente ser lidar com números. Tente não usar números mágicos, que é um exemplo de estilo. Então, dizer que você quer algo a cada mudança de tempo por gosto - Ok, então dica, outro spoiler é quando você está indo estar mudando alguma coisa por uma certa quantidade, tente não representa que por um número real mas tente e veja se você pode usar o valor ASCII, que tipo de fazer mais sentido. Outra nota: Como estamos a lidar com fórmulas, mesmo que seu TF vai saber o que tipo de padrão que você pode estar usando, melhor no seu tipo de comentários de explicar a lógica, como, "Estou usando esse padrão porque ..." e tipo de explicar o padrão de forma sucinta em seus comentários. [Este foi passo a passo 2] Se não houver quaisquer outras perguntas, então eu vou ficar aqui por um pouco. Boa sorte com seu pset 2: Crypto e obrigado por vir. [Estudante] Obrigado. Graças >>. [Intro de mídia offline]