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      

Problema a Resolver

Em um arquivo chamado substitution.c em uma pasta chamada substitution, crie um programa 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.

Começando

Passo a Passo

Eis aqui um passo a passo para a resolução do problema.

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  
Demo

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/2024/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/2024/x/substitution