Ir ao conteúdo
  • Cadastre-se

C representar o codigo nas questoes comentadas


ARcode

Posts recomendados

glr tem esse código , eu fiz algumas interpretações dele so que ainda não consegui entender algumas coisas que deixei comentado, é um codigo que criptografia 

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

/*reconhecimento de caractere */
int charParaValor(char c) {
switch(c) {
case 'a': return 0; case 'j': return 9;  case 's': return 18;
case 'b': return 1; case 'k': return 10; case 't': return 19;
case 'c': return 2; case 'l': return 11; case 'u': return 20;
case 'd': return 3; case 'm': return 12; case 'v': return 21;
case 'e': return 4; case 'n': return 13; case 'w': return 22;
case 'f': return 5; case 'o': return 14; case 'x': return 23;
case 'g': return 6; case 'p': return 15; case 'y': return 24;
case 'h': return 7; case 'q': return 16; case 'z': return 25;
case 'i': return 8; case 'r': return 17; case ' ': return 26;
default: return -1;
}}// 1 - Qual a finalidade dessa funcao? Por que ela retorna -1?
/*Ela retorna um valor inteiro entre 0 e 26 para cada caractere do dicionario.
Caso um caractere diferente seja utilizado ele nao reconhecera e retornara -1(erro)./

char valorParaChar(int v) {
char dicionario[] = "abcdefghijklmnopqrstuvwxyz ";//ultimo caractere eh o backspace
int a = dicionario[v];
printf("v = %d\n", v);
return dicionario[v];
}// 2 - Qual a finalidade dessa funcao?
/*Ela retorna o valor decimal de qualquer caractere do dicionario
a:97 -> z:122 + " ":32 */

char criptChar(char cValor, char cChave) {
int iValor = charParaValor(cValor);
int iChave = charParaValor(cChave);

return valorParaChar((iValor + iChave)%27); //= 117
}// 3 - Qual a finalidade dessa funcao? Por que utilizar o %27?
/*Ela retorna um valor decimal de uma caractere que corresponde a posicao dada pelo resultado da soma do valor de dois caracteres.
27 é devido a quantidade de caracteres do dicionario, (mas porque pegar o resto da divisao?)* */

char decriptChar(char cValor, char cChave) {
int iValor = charParaValor(cValor);
int iChave = charParaValor(cChave);
return valorParaChar((27 + (iValor - iChave)) % 27);
}// 4 - Qual a finalidade dessa funcao? Qual o retorno dessa funcao?
/*Ela retorna um valor decimal de uma caractere que corresponde a posicao dada pelo resultado da soma 27 + a diferença entre dois caracteres.
27 é devido a quantidade de caracteres do dicionario, (mas porque somar e pegar o resto da divisao ?)* */

int main(){
char frase[50], chave[10];

    strcpy(frase, "string a ser criptografada ");//faz a copia da frase para o vetor frase
    strcpy(chave, "chave");                     //faz a copia da frase para o vetor chave
    printf("original: %s\nchave: %s\n\n\n", frase, chave);//mostra o conteudo dos vetores

  
char criptografado[50], descriptografado[50];
int i;

    for(i = 0; i < strlen(frase); i++) {//laco de repeticao ate 26
    criptografado[i] = criptChar(frase[i], chave[i%strlen(chave)]);//a cada laco convoca a funcao criptChar
    }/*                       i->26             0....4      */           
              
    criptografado[strlen(frase)] = '\0';//adiciona o caractere de quebra de pagina
    // 5 - Qual a finalidade da linha de código acima
    /criptografar cada caractere do vetor frase e no fim adiciona o caractere de quebra de pagina para nao mostrar lixo/

    printf("Criptografada: %s\n", criptografado);//mostra a string criptografado
    for(i = 0; i < strlen(criptografado); i++) {
      
    descriptografado[i] = decriptChar(criptografado[i], chave[i % strlen(chave)]);
    }/*                             i->26                       0....4                 */
    descriptografado[strlen(criptografado)] = '\0';
    // 6 - Qual a finalidade da linha de código acima
/descriptografar cada caractere do vetor criptografado e no fim adiciona o caractere de quebra de pagina para nao mostrar lixo/

    printf("\nDescriptografada: %s\n", descriptografado);

    if(strcmp(frase, descriptografado) == 0) 
      puts("\nAs frases coincidem");
    
    puts("\n");
    system("pause");
}

/*
a[0]: return 97;   j[9]: return 106;   s[18]: return 115;
b[1]: return 98;   k[10]: return 107;   t[19]: return 116;
c[2]: return 99;   l[11]: return 108;   u[20]: return 117;
d[3]: return 100;  m[12]: return 109;   v[21]: return 118;
e[4]: return 101;  n[13]: return 110;   w[22]: return 119;
f[5]: return 102;  o[14]: return 111;   x[23]: return 120;
g[6]: return 103;  p[15]: return 112;   y[24]: return 121;
h[7]: return 104;  q[16]: return 113;   z[25]: return 122;
i[8]: return 105;  r[17]: return 114;  ' '[26]: return 32;


criptografado[i] = criptChar(frase["s"], chave[i % strlen("c")]);
                            (    s=18       +          c=2     )    => u[20]: return 117 (valor decimal);
                            (    a=0        +          a=0     )    => a[0]:  return 97 (valor decimal);


prints auxiliares:
//printf("criptchar: %d\n", criptografado[i]);
//printf("chave[%d] = %d   i/ strlen[chave] = %ld\n", i, chave[i % strlen(chave)], i%strlen(chave));
//printf("ivalor(%d) + ichave(%d) = %d/%c\n", iValor, iChave, res, res);
//printf("a:%d\n", a);
int a = strlen(frase); 
int b = strlen(chave);
//printf("a: %d caracteres\nb: %d caracteres\n\n", a, b);

*/

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, ARcode disse:

glr

 

que é glr?

 

/*reconhecimento de caractere */
int charParaValor(char c) {
switch(c) {
case 'a': return 0; case 'j': return 9;  case 's': return 18;
case 'b': return 1; case 'k': return 10; case 't': return 19;
case 'c': return 2; case 'l': return 11; case 'u': return 20;
case 'd': return 3; case 'm': return 12; case 'v': return 21;
case 'e': return 4; case 'n': return 13; case 'w': return 22;
case 'f': return 5; case 'o': return 14; case 'x': return 23;
case 'g': return 6; case 'p': return 15; case 'y': return 24;
case 'h': return 7; case 'q': return 16; case 'z': return 25;
case 'i': return 8; case 'r': return 17; case ' ': return 26;
default: return -1;
}}// 1 - Qual a finalidade dessa funcao? Por que ela retorna -1?
/*Ela retorna um valor inteiro entre 0 e 26 para cada caractere do dicionario.
Caso um caractere diferente seja utilizado ele nao reconhecera e retornara -1(erro)./

 

É muito chato ficar procurando suas dúvidas no meio do programa. Você podia simplesmente escrever o trecho e a dúvida passo a passo aqui e ajudar os outros a ajudarem você

 

Sobre o programa:

 

  • Esse programa não está assim muito bom.
  • Esse switch apenas é uma tabela de conversão
  • (-1) não é um erro. Apenas indica que o valor em c não será afetado pela criptografia
  • % 27 é o simples: usa para conseguir o índice da tabela para conversão, já que vai ter um número entre 0 e 26, como é o caso de dividir um número inteiro por 27... 
  • isso é apenas uma tabela de translação: troca a letra pela equivalente. Se chamar duas vezes volta ao que era antes. "descriptografado".
  • Obrigado 1
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...

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!