Pesquisar este blog

Livros Recomendados

quarta-feira, 13 de maio de 2020

URI - 1024 - Criptografia - Strings - C++

Plataforma: URI
Problema1024

Enunciado:
Solicitaram para que você construisse um programa simples de criptografia. Este programa deve possibilitar enviar mensagens codificadas sem que alguém consiga lê-las. O processo é muito simples. São feitas três passadas em todo o texto.

Na primeira passada, somente caracteres que sejam letras minúsculas e maiúsculas devem ser deslocadas 3 posições para a direita, segundo a tabela ASCII: letra 'a' deve virar letra 'd', letra 'y' deve virar caractere '|' e assim sucessivamente. Na segunda passada, a linha deverá ser invertida. Na terceira e última passada, todo e qualquer caractere a partir da metade em diante (truncada) devem ser deslocados uma posição para a esquerda na tabela ASCII. Neste caso, 'b' vira 'a' e 'a' vira '`'.

Por exemplo, se a entrada for “Texto #3”, o primeiro processamento sobre esta entrada deverá produzir “Wh{wr #3”. O resultado do segundo processamento inverte os caracteres e produz “3# rw{hW”. Por último, com o deslocamento dos caracteres da metade em diante, o resultado final deve ser “3# rvzgV”.

Linguagem: C++

Solução:

A solução foi criar uma string e realizar cada ação solicitada: verificar se é letra e acrescentar 3 caso positivo; inverter a string, com uso de uma variável auxiliar "letra", trocando o caractere da posição i com o da posição n-i-1; por fim, do meio para o fim da string era só diminuir 1, pois isso representa o deslocamento à esquerda solicitado no enunciado. Ao imprimir a variável é necessário usar endl para quebrar a linha.

#include <iostream>

using namespace std;

int main() {
    
    int n, i = 0, j;
    string palavra;

    cin >> n;
    cin.ignore();
    
    int tamanho[n];
    
    while (i < n) {
        getline(cin, palavra);
        
        tamanho[i] = 0;
        while (palavra[tamanho[i]] ^ '\0')
            tamanho[i]++;

        j = 0;            
        while (j < tamanho[i]) {
            
            if ((palavra[j] >= 97 && palavra[j] <= 122)
            || ((palavra[j] >= 65 && palavra[j] <= 90)))
                palavra[j] = (char) (palavra[j] + 3);
            
            j++;
        }
        
        j = 0;
        while (j < tamanho[i] >> 1) {
            
            char letra = palavra[j];
            palavra[j] = palavra[tamanho[i]-j-1];
            palavra[tamanho[i]-j-1] = letra;
            
            j++;
            
        }
        
        j = tamanho[i] >> 1;
        while (j < tamanho[i]) {
            
            palavra[j] = (char) (palavra[j] - 1);
            
            j++;
            
        }
        
        cout << palavra << endl;
        
        i++;
    }
    
    return 0;
}

Nenhum comentário:

Postar um comentário

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas