cs50-cc50-harvard

Voltar ao README

Voltar ao Índice da Semana 2

Exercício 3 - Substitution (Substituição)

Para este problema, você escreverá um programa que implementa uma cifra de substituição, conforme abaixo.

$ ./substitution JTREKYAVOGDXPSNCUIZLFBMWHQ
plaintext:  HELLO
ciphertext: VKXXN

Começando:

Abra o VS Code

1 - Entre no Terminal do VsCode: Ctrl+'

2 - Entrar nessa pasta: cd pset2
OBS: Caso a pasta possua espaço, por exemplo: Semana 2
Será necessário colocar aspas para entrar na pasta: cd 'Semana 2'

3 - No terminal digite o comando: wget https://cdn.cs50.net/2023/fall/psets/2/substitution.zip
seguido de ENTER para baixar o zip substitution.zip que contem a pasta substitution com o arquivo em C.

4 - Execute o unzip: unzip substitution.zip para extrair a pasta substitution dentro da pasta pset2.

5 - Você não precisa mais do arquivo ZIP, então você pode executar o comando para excluir: rm substitution.zip

6 - Agora entre na pasta: cd substitution

7 - Se tudo foi bem sucedido, você deve executar o comando ls que listará os arquivos dentro dessa pasta, nesse caso deverá ter o arquivo substitution.c
A execução code substitution.c deve abrir o arquivo onde você digitará seu código para este conjunto de problemas. Se não, refaça seus passos e veja se consegue determinar onde errou!

8 - No arquivo substitution.c faça o exercício proposto;

9 - Teste seu código: check50 cs50/problems/2023/x/substitution;

10 - Avalie o estilo do seu código: style50 substitution.c;

11 - Envie seu código: submit50 cs50/problems/2023/x/substitution depois digite: yes

 

Ver o progresso no Curso

 

Introdução ao Exercício

Em uma cifra de substituição, nós “criptografamos” (ou seja, ocultamos de forma reversível) uma mensagem substituindo cada letra por outra letra. Para isso, utilizamos uma chave: neste caso, um mapeamento de cada uma das letras do alfabeto para a letra correspondente quando criptografada.

Para “descriptografar” a mensagem, o destinatário da mensagem precisaria conhecer a chave, para que pudesse reverter o processo: traduzir o texto criptografado (geralmente chamado de texto cifrado) de volta para a mensagem original (geralmente chamada de texto simples).

Uma chave, por exemplo, pode ser a string NQXPOMAFTRHLZGECYJIUWSKDVB. Esta chave de 26 caracteres significa que A (a primeira letra do alfabeto) deve ser convertida em N (o primeiro caractere da chave), B (a segunda letra do alfabeto) deve ser convertida em Q (o segundo caractere da chave) e assim por diante.

Uma mensagem como HELLO, então, seria criptografada como FOLLE, substituindo cada uma das letras de acordo com o mapeamento determinado pela chave.

Vamos escrever um programa chamado substitution que permite criptografar mensagens usando uma cifra de substituição. No momento em que o usuário executa o programa, ele deve decidir, fornecendo um argumento de linha de comando, qual deve ser a chave na mensagem secreta que fornecerá em tempo de execução.

Aqui estão alguns exemplos de como o programa pode funcionar. Por exemplo, se o usuário inserir uma chave YTNSHKVEFXRBAUQZCLWDMIPGJO e um texto simples de HELLO:

$ ./substitution YTNSHKVEFXRBAUQZCLWDMIPGJO
plaintext:  HELLO
ciphertext: EHBBQ

Veja como o programa pode funcionar se o usuário fornecer uma chave VCHPRZGJNTLSKFBDQWAXEUYMOI e um texto simples de hello, world:

$ ./substitution VCHPRZGJNTLSKFBDQWAXEUYMOI
plaintext:  hello, world
ciphertext: jrssb, ybwsp

Observe que nem a vírgula nem o espaço foram substituídos pela cifra. Substitua apenas caracteres alfabéticos! Observe, também, que o caso da mensagem original foi preservado. Letras minúsculas permanecem minúsculas e letras maiúsculas permanecem maiúsculas.

Se os caracteres na própria chave são maiúsculos ou minúsculos, não importa. Uma chave de VCHPRZGJNTLSKFBDQWAXEUYMOI é funcionalmente idêntica a uma chave de vchprzgjntlskfbdqwaxeuymoi(como é, aliás, VcHpRzGjNtLsKfBdQwAxEuYmOi).

E se um usuário não fornecer uma chave válida? O programa deve explicar com uma mensagem de erro:

$ ./substitution ABC
Key must contain 26 characters.  
A chave deve conter 26 caracteres.

Ou realmente não coopera, não fornecendo nenhum argumento de linha de comando? O programa deve lembrar ao usuário como usar o programa:

$ ./substitution
Usage: ./substitution key  
Maneira de usar: ./substitution key  

Ou realmente não coopera, fornecendo muitos argumentos de linha de comando? O programa também deve lembrar ao usuário como usar o programa:

$ ./substitution 1 2 3
Usage: ./substitution key  
Maneira de usar: ./substitution key  

Tente

Para experimentar a implementação deste problema pela equipe, execute

./substitution key
substituindo uma chave válida no lugar de key, dentro desta sandbox.

Especificação

Projete e implemente um programa, substitution, que criptografa mensagens usando uma cifra de substituição.

DICA

Este vídeo irá te ajudar a entender o problema ;)
Atenção: para adicionar legendas ao vídeo clique no botão CC localizado no Player e selecione a opção “Português (Brasil)”.
Uma excelente aula para você!

CC50: PSet 2 - Substituição

 

PSEUDOCÓDIGO

// 1 - Validar se o usuário forneceu somente (1) um argumento na linha de comando. Se não fornecer, imprimir: Usage: ./substitution key  

// 2 - Validar se a chave (argv[1]) são apenas letras do alfabeto. string key = argv[1]. Caso contrário imprimir: Usage: ./substitution key

// 3 - Validar se a chave consiste em 26 caracteres. Caso contrário imprimir: Key must contain 26 characters. 

// 4 - Validar se cada letra foi digitada somente uma vez. Caso contrário imprimir: Contains repeated letter (Contém letras repetidas).

// 5 - Solicita ao usuário texto sem formatação (plaintext:);

// 6 - Ver quantas letras tem no texto e salvar em uma variável "length" 

// 7 - Salvar a chave em uma string "key"

// 8 - Crie uma matriz de letras cifradas e percorra todas as letras dessa matriz.
         // Função para cifrar o texto simples (retornando o texto cifrado "c")
         // 8.1 - Para cada caractere no texto simples (plaintext:) repita/itere:
         // 8.2 - Verificar se é uma letra maiúscula ou minúscula, itere-a, preservando capitalização, e então imprima o caractere iterado.
         // 8.3 - Se não for uma letra maiúscula nem minúscula, imprima o caractere como digitado, ou seja, o texto simples;

// 9 - imprimir texto cifrado

 

Voltar ao README

Voltar ao Índice da Semana 2