Departamento de Ciência da Computação - IME-USP

MAC 115 - Introdução à Computação para Ciências Exatas e Tecnologia

INSTITUTO DE GEOCIêNCIAS - SEGUNDO SEMESTRE DE 1998

Terceiro Exercício-Programa
Data de entrega: até 13 de novembro de 1998

Prof. Ronaldo Fumio Hashimoto

Cifra de César

O objetivo deste exercí cio-programa é a construção de um algoritmo de criptografia. A palavra criptografia vem do grego kryptós (escondido) e grápho (escrita), e é a arte ou ciência de tornar incompreensí vel uma mensagem originalmente escrita com clareza. Esta é uma ciência muito antiga, e vem sendo usada principalmente para fins militares e diplomáticos.

1  Cifra de César

Um esquema de codificação de textos usado há mais de 2000 anos é a chamada Cifra de César. Esse esquema de codificação era utilizado pelo imperador romano para se comunicar com seus generais. O esquema de codificação funciona da seguinte forma.

Numa primeira etapa, substitua as ocorrências de brancos e sinais de pontuação por uma seqüência de caracteres seguindo a seguinte tabela:

(branco)WBRW
, WVRW
. WPTW
; WPVW
: WDPW
! WEXW
? WINW
- WHFW
Tabela 1

Depois de feita essa substituição o texto terá apenas letras do alfabeto. Então, dado um natural k substitua cada letra i pela (i+k)-ésima letra do alfabeto (após a última letra letra segue-se a primeira novamente). Observe o exemplo a seguir:

Texto original:

ESSE EXERCICIO-PROGRAMA VAI SER MUITO LEGAL.

Após substituir-se os brancos e sinais de pontuação:

ESSEWBRWEXERCICIOWHFWPROGRAMAWBRWVAIWBRWSERWBRWMUITOWBRWLEGALWPTW

Então, usando-se k = 2, obtemos o seguinte texto codificado:

GUUGYDTYGZGTEKEKQYJHYRTQITCOCYDTYXCKYDTYUGTYDTYOWKVQYDTYNGICNYRVY

2  O que você deve fazer

Você irá programar um sistema completo de criptografia, ou seja, você deverá fazer um programa em linguagem C que:

  1. leia um string s (vetor de caracteres) contendo um texto;
  2. leia um natural k;
  3. leia uma opção: 1 para cifrar ou 2 para decifrar;
  4. se a opção for 1, então seu programa deverá cifrar o texto contido no string s imprimi-lo;
  5. se a opção for 2, então seu programa deverá decifrar o texto contido no string s e imprimi-lo (com brancos e sinais de pontuação).

3  Como você deve fazer este exercício

Para fazer seu programa, você deverá implementar as seguintes funções:

  1. void troca_sinal (char frase_sai[], char frase_ent[], char sinal, char pal[]);

    Percorre a frase guardada em frase_ent, trocando toda ocorrência do sinal de pontuação guardado em sinal pela palavra guardada em pal. A frase obtida é armazenada em frase_sai.

    Por exemplo, a chamada

    troca_sinal (frase, "AH! AH! AH!", '!', "WEXW");

    coloca no vetor frase o string "AHWEXW AHWEXW AHWEXW".

  2. void troca_todos_sinais (char frase_sai[], char frase_ent[]);

    Troca todos os sinais da Tabela 1 que ocorrem na frase guardada em frase_ent pelos respectivos strings e coloca a frase obtida em frase_sai.

    Por exemplo, a chamada

    troca_todos_sinais (frase, "FACIL? - SIMPLES!");

    coloca no vetor frase o string "FACILWINWWBRWWHFWWBRWSIMPLESWEXW".

    OBS.: Esta função deve obrigatoriamente usar a função do item 1.

  3. void troca_letras (char frase_sai[], char frase_ent[], int k);

    Esta função troca cada letra i da frase guardada em frase_ent pela (i+k)-ésima letra do alfabeto (após a última letra, segue-se a primeira novamente). A nova frase obtida é armazenada em frase_sai.

    Por exemplo, a chamada

    troca_letras (frase, "ESSEWBRWEXERCICIOWBRWEWBRWLEGALWPTW", 2);

    coloca no vetor frase o string "GUUGYDTYGZGTEKEKQYDTYGYDTYNGICNYGZY".

  4. int procura_pal (char frase[], int i, char pal[]);

    Esta função procura no vetor frase, a partir da posição i, a palavra guardada em pal. Esta função retorna -1, se a palavra pal não está no vetor frase a partir da posição i, ou o índice da primeira ocorrência da palavra.

    Exemplos:

    c = procura_pal ("FACILWINWWBRWWHFWWBRWSIMPLESWEXW", 0, "WINW"); c recebe valor 5.

    c = procura_pal ("FACILWINWWBRWWHFWWBRWSIMPLESWEXW", 9, "WINW"); c recebe valor -1.

    c = procura_pal ("FACILWINWWBRWWHFWWBRWSIMPLESWEXW", 13, "WBRW"); c recebe valor 17.

  5. void troca_string (char frase_sai[], char frase_ent[], char pal[], char sinal);

    Percorre a frase guardada em frase_ent, trocando toda ocorrência do string guardado em pal pelo sinal de pontuação guardado em sinal. A frase obtida é armazenada em frase_sai.

    Por exemplo, a chamada

    troca_string (frase, "AH!WBRWAH!WBRWAH!", "WBRW", ' ');

    coloca no vetor frase o string "AH! AH! AH!".

    OBS.: Esta função deve obrigatoriamente usar a função do item 4.

  6. void troca_todos_strings (char frase_sai[], char frase_ent[]);

    Troca todos os strings da Tabela 1 que ocorrem na frase guardada em frase_ent pelos respectivos sinais e coloca a frase obtida em frase_sai.

    Por exemplo, a chamada

    troca_todos_strings (frase, "FACILWINWWBRWWHFWWBRWSIMPLESWEXW");

    coloca no vetor frase o string "FACIL? - SIMPLES!".

    OBS.: Esta função deve obrigatoriamente usar a função do item 5.

    4  O seu programa

    O seu programa (void main (void)) deve utilizar obrigatoriamente as funções dos itens 2, 3 e 6.

    5  Desafio

    Você seria capaz de decifrar o texto abaixo?

    VJNSINZJKNSINVZENSINKVOKNSINZENSINUVLKJTYNGKNNSINVJNSINNRVIVNSINQLNSINVZEWRTYNMIN
    NSINNVEENSINUVINSINKVOKNSINZENSINGFIKLXZVJZJTYNSINXVJTYIZVSVENSINNFIUVENSINNRVIVN
    GKNNSINZTYNSINNVZJJNGKNNSINZTYNSINNVZJJNMINNSINVJNSINZJKNSINEZTYKNSINWRZINGKNNSIN
    YVIQCZTYVENSINXCLVTBNLVEJTYVENSINQLDNSINXVNZEEVINVONNVONNVON

    IMPORTANTE: Todo exercício-programa deve seguir as observações contidas no EP-1. Nestas observações estão descritas as diretrizes para forma de entrega do exercício, aspectos importantes na avaliação, etc.


    File translated from TEX by TTH, version 1.58.
    With personal mofications.
    Last modified: Fri Oct 2 18:55:45 EST 1998