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.
- Implemente seu programa em um arquivo chamado
substitution.c
em um diretório chamadosubstitution
. - Seu programa deve aceitar um único argumento de linha de comando, a chave a ser usada para a substituição. A chave em si deve ser insensível a maiúsculas e minúsculas, portanto, se algum caractere na chave estiver em maiúscula ou minúscula, isso não afetará o comportamento do seu programa.
- Se o seu programa for executado sem argumentos de linha de comando ou com mais de um argumento de linha de comando, seu programa deve imprimir uma mensagem de erro de sua escolha (com
printf
) e retornar demain
um valor de1
(que tende a significar um erro) imediatamente. - Se a chave for inválida (por não conter 26 caracteres, conter qualquer caractere que não seja um caractere alfabético, ou não conter cada letra exatamente uma vez), seu programa deve imprimir uma mensagem de erro de sua escolha (com
printf
) e retornar demain
um valor de1
imediatamente. - Seu programa deve exibir
plaintext:
(sem uma nova linha) e, em seguida, solicitar ao usuário umastring
de texto simples (usandoget_string
). - Seu programa deve exibir
ciphertext:
(sem uma nova linha) seguido do texto cifrado correspondente ao texto simples fornecido, com cada caractere alfabético do texto simples substituído pelo caractere correspondente no texto cifrado; caracteres não alfabéticos devem ser exibidos inalterados. - Seu programa deve preservar a caixa: letras maiúsculas devem permanecer letras maiúsculas; letras minúsculas devem permanecer letras minúsculas.
- Após a exibição do texto cifrado, você deve imprimir uma nova linha. Seu programa deve então sair, retornando
0
a partir demain
.
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