Ir ao conteúdo

Posts recomendados

Postado

Estou fazendo um código de criptografia básico, onde o usuário entra com uma chave e um texto e o programa imprime o texto criptografado(soma a chave a cada letra do texto). Estou interessado que o programa funcione da seguinte forma:

Chave: 1

Texto: ABZabz

Texto criptografado: BCAbca

quero que quando a chave mais a letra passe de Z a criptografia retorne para A.

O código é o seguinte:

#include<stdio.h>
#include<string.h>

int
main (void)
{
int c;
char t[201];

printf("Chave: ");
scanf("%d", &c);                        //chave para somar às letras na criptografia

if (c<1)
   {
    printf("\nMe dê um numero positivo.\n");
    return 1;                   //caso o número seja 0 ou menos o programa encerra
   }
if (c >= 26)
   {
   c = c % 26;          // se a chave for maior que 26 (numero de letras no alfabeto) transftransforma a chave no resto da divisao entre os dois
     }
if (c == 0)
   {
   printf("Essa chave é um múltiplo de 26 (ou 26), portanto, o texto não será criptografado.$
   return 2;
   }
printf("%d", c);

printf("Texto a ser criptografado (máximo 200 caracteres) : ");
scanf("%s", t);

int i=0, n=strlen(t);

while (i < n)
   {
    if ((int)t[i] < 90 && ((int)t[i] + c) > 90)
       {
        t[i] = (((int)t[i] + c) % 90) + 64;              //caso a letra de número i da string mais a chave passe de Z, a criptografia retorna para A (aqui está o erro)
       }
    else if ((int)t[i] < 96 && (int)t[i] + c > 122)
       {
        t[i] = (((int)t[i] + c) % 122) + 96;
       }
    t[i] = ((int)t[i] + c);                     //criptografa cada letra da string
    i=i+1;
   }
t[i]='\0';
printf("Texto criptografado: %s\n", t);
return 0;
}

Mas por algum motivo o código não executa os ifs dentro do while mesmo quando as condições são verdadeiras. Qual o meu erro? 

  • Amei 1
Postado

@Aquiles Augusto     seu código está sim funcionando os if's , e você pode ver isso colocando mensagens dentro deles para observar seus funcionamentos ,  veja esse aqui :

#include<stdio.h>
#include<string.h>
int main (void)
{
    int c,flag=0;
    char t[201] = {"qualquer coisa"};
    printf("Chave: ");
    scanf("%d", &c);           ///chave para somar às letras na criptografia

    if (c<1)
    {
        printf("\nMe dê um numero positivo.\n");
        return 1;              ///caso o número seja 0 ou menos o programa encerra
    }
    if (c >= 26)
    {
        c = c % 26;            /// se a chave for maior que 26 (numero de letras
    }                          /// no alfabeto) transftransforma a chave no resto da
    if (c == 0)                /// divisao entre os dois
    {
        printf("Essa chave é um múltiplo de 26 (ou 26), portanto, o texto não será criptografado");//.$
        return 2;
    }
    printf("%d", c);

    printf("Texto a ser criptografado (máximo 200 caracteres) : ");
    ///  scanf("%s", t);   aqui só para testar , depois volte com o scanf
    printf("\n");
    int i=0, n=strlen(t);

    while (i < n)
    {
        if ((int)t[i] < 91 && ((int)t[i] + c) > 90) /// z maiusculo é 90
        {
            printf("aqui no primeiro IF dentro do While !\n");
            t[i] = (((int)t[i] + c) % 90) + 64;     /// caso a letra de número i da string mais a
        }                                           /// chave passe de Z, a criptografia retorna
        else                                        /// para A (aqui está o erro)
        {
            flag = 0;
            if ((int)t[i] < 96 && (int)t[i] + c > 122)
            {
                printf("aqui no IF  dentro do ELSE e dentro do While !\n");;
                t[i] = (((int)t[i] + c) % 122) + 96;
                flag = 1;
            }
            if( ! flag)
            printf("aqui no ELSE e sem passar nesse segundo IF dentro do While !\n");;
            t[i] = ((int)t[i] + c);                 /// criptografa cada letra da string
            i=i+1;
        }
    }
    t[i]='\0';
    printf("Texto criptografado: %s\n", t);
    return 0;
}

 

  • Curtir 2
  • Obrigado 1
Postado

Uma forma que acho mais simples de resolver é fazendo esta atribuição,

 

Letra Alterada = (Letra Original - A + chave) % QTD_LETRAS_ALFABETO + A

 

E com o uso de funções para retornar se a letra é maiúscula/minúscula ou se é uma letra válida (se quiser evitar pegar espaços, números, pontuação, etc), o código fica mais reduzido. O loop p.ex ficaria assim,

 

#define QTD_LETRAS 26
...
for(int i = 0; texto[i]; i += 1){
    if(isalpha(texto[i])){
        char A = 'A';
        if(islower(texto[i])){
            A = 'a';
        }
        texto[i] = (texto[i] - A + chave) % QTD_LETRAS + A;
    }
}

 

Se não quiser usar funções nativas (isalpha/islower) poderia substituir pelo teste das letras do alfabeto, p.ex,

if(texto[i] >= 'a' && texto[i] <= 'z')

 

  • Curtir 1
  • Obrigado 2
Postado
char t[201];

// ...

printf("Texto a ser criptografado (máximo 200 caracteres) : ");
scanf("%s", t);

int i=0, n=strlen(t);

while (i < n) // ...
  

 

Do seu código...

 

Recomendo muito não programar assim. Vai perder muito tempo à toa.

 

- sobre scanf(): TESTE sempre o retorno. 

- limite o tamanho no especificador. Nesse caso use "%200s".

- declare uma variável por linha. É grátis

- quando está inseguro, mostre o que está assumindo: mostre o valor de n antes de entrar no loop

- leia de um arquivo. É muito mais fácil e rápido. Não tem sentido ficar digitando frases a cada teste.

 

 

SE é um programa de criptografia porque se preocupar com as letras ao invés de aplicar o deslocamento para TODAS as posições? é muito mais simples

 

 

  • Curtir 2
  • Obrigado 1
Postado
14 horas atrás, arfneto disse:

SE é um programa de criptografia porque se preocupar com as letras ao invés de aplicar o deslocamento para TODAS as posições?

Seria fazer o "Z" se tornar "[" caso a chave fosse 1, por exemplo? Este programa é para um curso que estou fazendo e lá pede para retornar para A, por isso fiz assim.

 

Ah, estou enfrentando outro problema, o scanf não atribui espaços a strings. Você conhece outra função que o faça?

  • Obrigado 1
Postado

@Aquiles Augusto Então você tem um enunciado que poderia postar?

 

Se o enunciado tem explicitamente um universo de símbolos de entrada então apenas use módulo mesmo. Em qualquer outro caso não teste nada e apenas converta. Ida e volta.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!