Ir ao conteúdo

Posts recomendados

Postado

Estou há horas tentando fazer este exercício em C, não consigo enxergar o erro em meu código, se puderem me ajudar ficaria muito agradecido. Exercício: O imperador romano Júlio César usava um método de criptografia para mandar mensagens criptografadas para seus generais. Este método considerava a ordem dos caracteres no alfabeto e trocava cada letra pela k-ésima letra seguinte a letra. Por exemplo, se k = 3, então a ocorrência da letra 'A' era trocada pela letra 'D'. A letra 'B' era trocada pela letra 'E', assim por diante. Esta substituição era feita de maneira cíclica, que neste caso a letra 'Z' era trocada pela letra 'C'. Faça um programa que lê um inteiro k e uma cadeia de caracteres e imprime a correspondente mensagem criptografada pela cifra de César com parâmetro k. 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 26
int main(){
   char codigo[MAX],copia[MAX],alfabeto[]="abcdefghijklmnopqrstuvwxyz";
    int i,k,alpha=0;
    printf("Digite o codigo: ");
    gets(codigo);
    strcpy(copia,codigo);
    printf("Digite o valor K: ");
    scanf("%i",&k);

    for (i=0;i<26;i++){
        if (codigo[alpha]!=alfabeto[i]){
            continue;
        }
        else
            codigo[alpha]=alfabeto[i+k];
            alpha++;
    }





    printf("Nao-codificado: %s\n",copia);
    printf("Codificado: %s",codigo);



}

 

  • Curtir 1
Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
	int  k, l = 0, tam_s;
	char string[200], c;

	printf("Insira o valor de K: ");
	scanf("%d", &k);

	printf("Insira a string \n");
	fflush(stdin);
	gets(string);

	tam_s = strlen(string);
	while (l < tam_s) {
		c = string[l];
		k %= 26;
		if (64 < c && c < 91) {
			if (c + k > 90)
				c += k - 26;
			else 
				c += k;
			}
		else if (96 < c && c < 123) {
			if (c + k > 122) 
				c += k - 26;
			 else 
				c += k;
		}
		string[l++] = c;
	}
	printf(string);
}

 

  • Curtir 1
Postado
2 horas atrás, Daniel Estevão disse:

Estou há horas tentando fazer este exercício em C, não consigo enxergar o erro em meu código, se puderem me ajudar ficaria muito agradecido.

O seu For só está listando uma vez o vetor do alfabeto e dessa forma apenas comparando uma vez determinada letra com o código. Para resolver você poderia zerar a variável i no else. Além disso como a substituição é cíclica é preciso tratar p.ex o caso da letra z.

 

Outro ponto é que seu código só considera letras minúsculas.

 

Postado

 

Escreva seu programa em torno dos dados, sempre
 

2 horas atrás, Daniel Estevão disse:

se k = 3, então a ocorrência da letra 'A' era trocada pela letra 'D'. A letra 'B' era trocada pela letra 'E', assim por diante. Esta substituição era feita de maneira cíclica

 

Isso sugere que podia usar % --- módulo, o resto da divisão --- e o tamanho do universo de letras para codificar, e provavelmente pode ficar também sem o alfabeto[] e usar só os limites, já que os símbolos são consecutivos. E que limite é esse? no caso aqui é a distância entre a letra lida e 'a' 

 

Seu exemplo usa L = 26 símbolos e uma distância K. E é 1:1 no sentido de que cada simbolo vai gerar um outro na saída. É só um filtro e não vai mudar o comprimento. Então se um símbolo X está dentro do intervalo e  na posição [ i ] apenas troca pelo valor na posição [ i + K ] % L. Ex: 

 

 

Para K = 6, por exemplo:

Para x == 'a': i = 0, i + K = 6, (i + K) % 26 = 6, y = 'a' + 6 = 'g'

Para x == 'y': i = 23, i + K = 29; (i + K) % 26 = 3, y = 'a' + 3 = 'd'

Um gabarito (use os dados)

....*.....1....*....2....5
01234567890123456789012345
abcdefghijklmnopqrstuvxywz

E pode ver o sentido do que estou explicando

 

A linha de comando

 

Considere usar K e a linha como parâmetros de execução, o óbvio desde os '70. Exemplo: se seu programa é cesar.exe em Windows:

cesar 3
cesar 6 "um teste simples"
cesar 8 teste_simples

E vai economizar um tempo ao menos para testar ou demonstrar isso. A menos que goste de ficar esperando e digitando letrinhas no teclado e rodando o programa a cada vez, e esperando o prompt, e digitando k, e digitando a string...

Assim

  • O primeiro caso perguntaria a string mas já saberia que K = 3.
  • O segundo usaria K = 6 e a string com espaços no meio
  • O terceiro usaria K = 8 e a string como digitada

Em geral isso é feito só com uma tabela de referência: é só um byte e são só 256 possíveis valores então no início você aplica o valor de K e arranja tudo uma vez só na tabela, e na saída troca X por tabela[X] sem lógica alguma.

 

 

De volta ao seu programa

for (i=0;i<26;i++)
{
        if (codigo[alpha]!=alfabeto[i]){
            continue;
        }
        else
            codigo[alpha]=alfabeto[i+k];
            alpha++;
}

 

Sua lógica está, digamos, de ponta cabeça. O loop não é pelas MAX letras  --- sim você esqueceu de trocar 26 por MAX ---  do grupo mas sim pelas strlen(string) letras da entrada.

 

   char codigo[MAX],copia[MAX],alfabeto[]="abcdefghijklmnopqrstuvwxyz";

E se leu o que expliquei já sabe que

  • não precisa de codigo[MAX]
  • não precisa de copia[MAX]
  • não precisa de albabeto[]

Basta ler letra a letra até o fim e mostrar o valor dela segundo a distância K

Ao final um '\n'

E a vida segue ;) para o próximo exercício

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!