Ir ao conteúdo
  • Cadastre-se
joaaogui

RESOLVIDO Cifra De Cesar

Recommended Posts

 Galera, nessa cifra de césar ele codifica a mensagem  usando uma chave , e desloca a mensagem utilizando a tabela ASCII.

O problema é que eu nao queria utilizar os caracteres especiais ,

 

utilizando somente os caracteres de A a Z;

 

alguém sabe o que deve ser mudado ?

#include <stdio.h>#include <string.h>// src = a string a ser cifrada// chave = o tamanho do deslocamento das letras, exemplo 3 -> 'a' seria 'd'void CrifaDeCesar(char *src, int chave){	int n = 0;	strlwr(src); // lower case = diminui as letras maísculas em minúsculas	while(src[n] != 0)	{		// ASCII		// A = 97;		// Z = 122;		if((src[n] + chave) > 122)		{			src[n] -= 26;		}		if((src[n] + chave) < 97)		{			src[n] += 26;		}		src[n] = src[n] + chave;		n++;	}}int main(){	char a[30] ;	int chave;	 printf("\nDigite o texo a ser encriptado:");    scanf("%s",a);	printf("Digite a chave a ser utilizada:");	scanf("%d", &chave);	CrifaDeCesar(a, chave);	printf("%s\n", a);	getchar();	return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente usar algo após seu scan para verificar o que esta sendo armazenado, algo como: while (opc < 'A' || opc > 'Z'), enquanto for diferente do declarado você solicita que o texto seja digitado novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, essa é uma opção, mas eu não queria limitar o usuário.

 

O ideal seria o algoritmo fazer tipo um loop entre o A e o Z, indenpendendo da chave inserida.

 

Mas valeu pela ajuda :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A = 97

Z = 122

Pelo que entendi, você quer que a tua função lide apenas com as 26 letras do alfabeto, certo?

Tipo, se a letra for Z e a chave for 1, em vez de transformar o Z em "{" você quer transformar ele em "A", é isso?

Considere A é igual a 1 e Z é igual a 26.

Se a chave for igual a 1, em vez de transformar os caracteres em [C + 1], você pode transformar eles em [ (C+1) % 26 ].

Desse modo, quando a chave for igual a 1 e o caractere a ser transformado for igual a Z, em vez de transformar ele em 27 (26 + 1), você transforma ele em 1 ((26+1) % 26).

E pra pegar o valor dele na tabela ASCII, é só adicionar depois 97, que é o valor do primeiro caractere na tabela ('a').

Então, isso:

src[n] = src[n] + chave;
Vira isso:

src[n] = (src[n] - 97 + chave) % 26;src[n] = src[n] + 97;
Na prática você não precisa transformar eles entre 1-26 pra depois somar 97.

Você pode simplesmente pegar o modulo de 122. Dá no mesmo.

 

src[n] = (src[n] + chave) % 122;
Não testei o código aqui.
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo que o uso do módulo com o deslocamento, no índice do vetor, resolve o exercício,

Já que você vai verificar apenas o ciclo da chave durante o loop.

Por exemplo, a implementação da função pode ser assim

char *desloc_letra(char *palavra, char *chave, int desloc){    char *s = palavra;    int i = 0, deslocou;    while(*s){        i = deslocou = 0;        while(i < 26){            if(toupper(*s) == chave[i++]){                                deslocou = 1;                *s++ = chave[(i + desloc - 1) % 26];                        }           }        if(!deslocou) *s++;    }    return palavra;}int main(){    char palavra[20] = "AZXIJ";    char chave[26];    int i = 0;    while(i < 26) chave[i++] = (char)(i + 65);        printf("%s -> ", palavra);    printf("%s\n", desloc_letra(palavra, chave, 3));    return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

A = 97

Z = 122

Pelo que entendi, você quer que a tua função lide apenas com as 26 letras do alfabeto, certo?

Tipo, se a letra for Z e a chave for 1, em vez de transformar o Z em "{" você quer transformar ele em "A", é isso?

Considere A é igual a 1 e Z é igual a 26.

Se a chave for igual a 1, em vez de transformar os caracteres em [C + 1], você pode transformar eles em [ (C+1) % 26 ].

Desse modo, quando a chave for igual a 1 e o caractere a ser transformado for igual a Z, em vez de transformar ele em 27 (26 + 1), você transforma ele em 1 ((26+1) % 26).

E pra pegar o valor dele na tabela ASCII, é só adicionar depois 97, que é o valor do primeiro caractere na tabela ('a').

Então, isso:

src[n] = src[n] + chave;
Vira isso:

src[n] = (src[n] - 97 + chave) % 26;src[n] = src[n] + 97;
Na prática você não precisa transformar eles entre 1-26 pra depois somar 97.

Você pode simplesmente pegar o modulo de 122. Dá no mesmo.

 

src[n] = (src[n] + chave) % 122;
Não testei o código aqui.

 

 

Era exatamente isso dontpanic, valeu mesmo !!!!

 

oliver.soul, seu comentário ajudou no entendimento também, valeu :).

 

Resolvido.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×