/*
 * Problema extra.  A Cifra de César é uma técnica de criptografia
 * simples em que cada letra do alfabeto é substituída pela letra
 * deslocada de um valor secreto d > 0.  Por exemplo, se d = 5, 'A' é
 * substituído por 'F', 'B' por 'G', 'C' por 'H' e assim por diante, até
 * 'U' ser substituído por 'Z', 'V' por 'A', 'W' por 'B', etc.  Há
 * referências históricas que mostram que o imperador romano
 * comunicava-se com seus generais usando este esquema para evitar que as
 * mensagens fossem descobertas por inimigos.  Veja
 * https://en.wikipedia.org/wiki/Caesar_cipher
 * 
 * Faça uma função de protótipo
 * 
 *     int cesar(char *ch, int d);
 * 
 * que recebe um caractere *ch e devolve 1 se *ch for um caractere
 * alfanumérico (A-Za-z ou 0-9) ou um whitespace (veja o Problema 17) e
 * devolve 0 caso contrário.
 * 
 * Além disso, no caso de *ch ser uma letra em A-Za-z, sua função deve
 * deslocar *ch de d unidades ciclicamente, como mostrado no exemplo
 * (mantendo se *ch é uma letra maiúscula ou minúscula).  No caso de *ch
 * ser um whitespace, sua função deve converter *ch para ' '.
 * 
 * Escreva um programa que receba um inteiro d na linha de comando e leia
 * uma sequência de caracteres alfanuméricos, whitespaces e sinais de
 * pontuação (diferentes de '$'), terminada por '$', e que imprima a
 * entrada codificada pela cifra de César com parâmetro d.  Na saída de
 * seu programa, os caracteres que não forem alfanuméricos ou whitespaces
 * devem ser eliminados e os whitespaces devem ser convertidos para ' '.
 * Seu programa deve imprimir um '\n' no fim de sua saída.
 * 
 * Por exemplo, com d = 5 e a entrada
 * 
As armas e os barões assinalados,
Que da ocidental praia Lusitana,$
 * 
 * seu programa deve ter a saída 
 * 
 * Fx fwrfx j tx gfwjx fxxnsfqfitx Vzj if thnijsyfq uwfnf Qzxnyfsf
 * 
 */

#include <stdio.h>
#include <stdlib.h>
  
#define TRUE 1
#define FALSE 0
  
int cesar(char *ch, int d);

int main(int argc, char *argv[])
{
  char c;
  int d = atoi(argv[1]);

  do {
    scanf("%c", &c);
    if (cesar(&c, d))
      printf("%c", c);
  } while (c != '$');

  printf("\n");
  return 0;
}

int cesar(char *ch, int d)
{
  if ('a' <= *ch && *ch <= 'z') {
    int t = *ch - 'a';
    t = (t + d) % 26;
    *ch = 'a' + t;
    return TRUE;
  }
  if ('A' <= *ch && *ch <= 'Z') {
    int t = *ch - 'A';
    t = (t + d) % 26;
    *ch = 'A' + t;
    return TRUE;
  }
  
  if (*ch == ' ' || *ch == '\n' || *ch == '\t') {
    *ch = ' ';
    return TRUE;
  }
  
  return FALSE;
}
