Ir ao conteúdo
  • Cadastre-se

C O que está errado no meu código?


Posts recomendados

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

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

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.

 

Link para o comentário
Compartilhar em outros sites

 

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

Link para o comentário
Compartilhar em outros sites

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