Ir ao conteúdo
  • Cadastre-se

Cifra De Cesar


joaaogui
Ir à solução Resolvido por dontpanic,

Posts recomendados

 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;}
Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
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;}
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!