CS50-MCZ

Uma introdução aos empreendimentos intelectuais da Ciência da Computação e da arte da programação.


Substitution


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.

Comece clicando dentro da janela do seu terminal e execute cd sozinho. Você deve encontrar que seu "prompt" se parece com o abaixo.

$

Clique dentro da janela do terminal e execute

wget https://cdn.cs50.net/2022/fall/psets/2/substitution.zip

seguido de Enter para baixar um arquivo ZIP chamado substitution.zip em seu espaço de código. Tenha cuidado para não ignorar o espaço entre o wget e a URL a seguir, ou qualquer outro caractere!

Agora execute

unzip substitution.zip

para criar uma pasta chamada substitution. Você não precisa mais do arquivo ZIP, então pode executar

rm substitution.zip

e responda com "y" seguido por Enter no prompt para remover o arquivo ZIP que você baixou.

Agora digite

cd substitution

seguido de Enter para mover-se para o diretório (ou seja, abrir) esse diretório. Seu prompt agora deve se parecer com o abaixo.

substitution/ $

Se tudo ocorreu bem, você deve executar

ls

e ver um arquivo chamado substitution.c. Executar code substitution.c deve abrir o arquivo onde você digitará o seu código para este problema. Se não, refaça seus passos e veja se consegue determinar onde errou!

Contexto

Em uma cifra de substituição, "criptografamos" (ou seja, ocultamos de maneira reversível) uma mensagem substituindo cada letra por outra letra. Para isso, usamos uma chave: nesse caso, um mapeamento de cada uma das letras do alfabeto para a letra que ela deve corresponder quando criptografada. Para "descriptografar" a mensagem, o receptor da mensagem precisaria conhecer a chave, para que possa reverter o processo: traduzindo o texto criptografado (geralmente chamado de ciphertext) de volta à mensagem original (geralmente chamada de plaintext).

Uma chave, por exemplo, pode ser a string NQXPOMAFTRHLZGECYJIUWSKDVB. Essa 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 permita 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 será a chave na mensagem secreta que ele 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 de YTNSHKVEFXRBAUQZCLWDMIPGJO e um plaintext de HELLO:

$ ./substitution YTNSHKVEFXRBAUQZCLWDMIPGJO
plaintext:  HELLO
ciphertext: EHBBQ  

Veja como o programa pode funcionar se o usuário fornecer uma chave de 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 pelo cifrador. Apenas substitua os 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 chave em si são maiúsculos ou minúsculos, não importa. Uma chave de VCHPRZGJNTLSKFBDQWAXEUYMOI é funcionalmente idêntica a uma chave de vchprzgjntlskfbdqwaxeuymoi (assim 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.  

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

$ ./substitution
Usage: ./substitution key  

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

$ ./substitution 1 2 3
Usage: ./substitution key  
Assista a uma gravação

Especificação

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

Você pode achar uma ou mais funções declaradas em ctype.h úteis, conforme manual.cs50.io.

Como Testar o Seu Código

Execute o código abaixo para avaliar a correção do seu código usando o check50. Mas certifique-se de compilar e testá-lo você mesmo também!

check50 cs50/problems/2023/x/substitution

Execute o comando abaixo para avaliar o estilo do seu código usando style50.

style50 substitution.c
Como Usar debug50

Procurando executar o debug50? Você pode fazê-lo da seguinte forma, depois de compilar seu código com sucesso usando o make,

debug50 ./substitution KEY
  

onde KEY é a chave que você dá como argumento de linha de comando para o seu programa. Note que ao executar

debug50 ./substitution
  

Isso (idealmente!) fará com que o programa termine solicitando uma chave ao usuário.


Como Enviar

No seu terminal, execute abaixo para enviar seu trabalho.

submit50 cs50/problems/2023/x/substitution