• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gooden

Descodificação Por Letra

6 mensagens neste tópico

Bom foi dado a um colega meu um trabalho de universidade. e eu estou a tentar fazer ja que estou a começar o c :thumbsup:

Só que como sou muito azelha nisto queria ver se me davam uma ajudita. :P

Bom tenho uma frase encriptada e ele vai desencriptar conforme o numero de caracteres k existirem.

Por exemplo numa frase a letra que aparece mais vezes é o A. logo a letra encriptada que tiver mais é o A.

este prof deu um bocado do codigo. da contagem de letras.

/*
Este exemplo apresenta noções iniciais para a resolução do trabalho prático de Programação, 
nomeadamente a forma como a mensagem cifrada pode ser integrada no programa.
É também apresentada a estrutura exemplificativa da contagem do número de caracteres para cada classe de letra
*/


#include<stdio.h>
#include<stdlib.h>
#include<string.h> /* para poder usar funções como a strlen */

int main()
{ 
  
  /* é criado, através de um apontador, um vector de caracteres em que o conteúdo é o texto cifrado 
     note-se que este vector assume como último elemento o carácter terminador (1.º elemento da tabela ascii). 
     Esse carácter permite conhecer o limite do conteúdo do vector.  
     Assim, a este vector podemos chamar string - uma cadeia de caracteres com um terminador final - */
  const char * const msg = "cscmxcszfsocmfzscssjncwcgfspezgcfkjgznvcwbmcjcwesjvcncbfmxcmzsnenkcgzcnvzsncazicgfsbcsscmcxcjngccwzxgcvcbmfocnczxbzmjifsziezmmcszsrfmkcgfsxcjsgfpezbmfxzvjccrfmkchexcnczznvmziznvzmzxfvczgjrjkcmcxnfafmzjnfpezvcnvfseowjxcmcxzvcxozxcsxzxfmjcsiwfmjfscsgcpezwzsmzjspezrfmcxgjwcvcngfcrzfjxbzmjfzcsvzmmcsajkjfscsgzcrmjkczgzcsjccngcmcxgzacsvcngfzcpezwzspezbfmfomcsacwzmfscsszacfgcwzjgcxfmvzwjozmvcngfkcnvcngfzsbcwhcmzjbfmvfgcbcmvzszcvcnvfxzcyegcmfzniznhfzcmvzkzsszxgfscojfimzifzgfvmfjcnfcsncazickfzsimcngzspezrjqzmcxkcwzszgzcwztcngmfzgzvmcycnfcrcxcgcsajvfmjcspezvjazmcxpezzekcnvffbzjvfjwesvmzwesjvcnfcpezxnzbvenfzxcmvzfozgzkzmcxkzsszvegffpezcxesccnvjickcnvcpezfevmfacwfmxcjscwvfszcwzacnvczafsvcijgzsxjnhcsbfjskmjcgfvzngzszxxjexnfafzniznhfcmgznvzszszxbmzzxazmsfhexjwgzkzwzomcgfrfjgzxjafssfmjfcwzmzxznvzgcjxzcifmcexsfxcwvfzseowjxcgfexzsvjwfimcngjwfkfzkfmmznvzbfmpezgzafsscsciecsrzoffmgznzpezncfvznhcxznazyccsgzhjbfkmznzgcjxzecremjcimcngzzsfnfmfsczncfgzcimzsvzcazncfermcevcmegcxcsgzveockcnfmczozwjkfscpezfbzjvfckzngzzckfmcfizsvfxegcgcjxzjiecwkcnvfcfsrzjvfsgcrcxfsciznvzafsscpezcxcmvzvcnvfcyegcpezszzsbcwhzzszkcnvznfenjazmsfszvcfseowjxzbmzkfkcozzxazmsfzafsfozxncskjgcsziemcnkcgcwesjvcnccnvjicwjozmgcgzzncfxznfskzmvjssjxczsbzmcnkcgzcexznvfgcbzpeznckmjsvcngcgzafsfnfafvzxfmgcxcemcwcnkcxcmcajwhcrcvcwgcnfsscjgcgzgcgccfxengfbfmgzespezvfgffxcngzbzmcgfxengfcgzesgcmbcmvzimcngz";
  
  
  int i;
  unsigned int contadores[26]; /* cada elemento deste vector será usado como um contador de ocorrências das letras. 
                                  São 26 contadores porque existem 26 espécies de letras (alfabeto) */
int f=false;

  
  /****************************************exemplos simples de acesso à string msg***********************************************/
  /* colocação no ecrã do texto cifrado: */
  printf("%s\n\n", msg);
  
  
  /* colocação no ecrã do 4.º carácter da string msg  */
  printf("4. elemento = %c\n\n", msg[3]);
  /******************************************************************************************************************************/
  
  system("pause");  
  
  /*****************************************contagem de cada classe de letra*****************************************************/
  /* iniciação de todos os contadores a zero */
  for(i=0; i<26; i++)
    contadores[i] = 0;  


  /* é percorrida toda a mensagem, da 1 posição de msg até à última
     o comprimento de msg pode ser determinado pela função strlen()
     msg[i] - 'a' permite indexar o vector contadores numa posição que corresponde à letra que surge na posição i de msg
     Exemplo: sempre que surge na mensagem a letra d será produzido o índice 3 sobre o vector contadores que é depois incrementado
     Isto significa que a posição 3 do vector contadores irá contabilizar o número de ds que aparecem na mensagem.
     Isto significa que a posição 2 do vector contadores irá contabilizar o número de cs que aparecem na mensagem.
     Isto significa que a posição 1 do vector contadores irá contabilizar o número de bs que aparecem na mensagem.
     Isto significa que a posição 0 do vector contadores irá contabilizar o número de as que aparecem na mensagem.     */
  for(i=0; i<strlen(msg); i++)  
    contadores[ msg[i] - 'a' ]++;
    
    
  /* visualização do conteúdo de todos os contadores */  
  for(i=0; i<26; i++)
    printf("%c tem -> %d\n", i + 'a', contadores[i]);  
  /******************************************************************************************************************************/  
  
  

  system("pause");  
}

ou pelo menos darem me uma ideia.

e mais uma duvida que tenho no codigo..... 

    printf("%c tem -> %d\n", i + 'a', contadores[ i]); 

nesta linha na parte do i+'a' ele vai buscar o chr do a e adicionalo a posicao. ou seja chr(a)+0 da o a mas se for mais 1 da o b certo??

Desculpem a burrice. :P

Abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, ele tá a somar o código ascii da letra 'a' com o i e funciona como disseste. O %c vai tomar o código ascii pretendido e apresentar o caracter correspondente.

edit: isto funciona porque os códigos ascii das letras (maiúsculas e minúsculas, e já agora dos digitos também) são consecutivos como podes ver aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok brigado pela explicação :P ja consegui ordenar e fazer mais umas coisitas.

Agora So falta substituir. alguem pode ajudar nisso? :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que só disseste como desencriptar a letra A, faltam as outras :x

Ao ordenares as ocorrências, tiveste o cuidado de manter a ligação entre cada letra e a respectiva ocorrência? E já agora, como ordenaste?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mogers ta ai o codigo

/*
Este exemplo apresenta noções iniciais para a resolução do trabalho prático de Programação, 
nomeadamente a forma como a mensagem cifrada pode ser integrada no programa.
É também apresentada a estrutura exemplificativa da contagem do número de caracteres para cada classe de letra
*/


#include<stdio.h>
#include<stdlib.h>
#include<string.h> /* para poder usar funções como a strlen */

int main()
{ 
  
  /* é criado, através de um apontador, um vector de caracteres em que o conteúdo é o texto cifrado 
     note-se que este vector assume como último elemento o carácter terminador (1.º elemento da tabela ascii). 
     Esse carácter permite conhecer o limite do conteúdo do vector.  
     Assim, a este vector podemos chamar string - uma cadeia de caracteres com um terminador final - */
  const char * const msg = "cscmxcszfsocmfzscssjncwcgfspezgcfkjgznvcwbmcjcwesjvcncbfmxcmzsnenkcgzcnvzsncazicgfsbcsscmcxcjngccwzxgcvcbmfocnczxbzmjifsziezmmcszsrfmkcgfsxcjsgfpezbmfxzvjccrfmkchexcnczznvmziznvzmzxfvczgjrjkcmcxnfafmzjnfpezvcnvfseowjxcmcxzvcxozxcsxzxfmjcsiwfmjfscsgcpezwzsmzjspezrfmcxgjwcvcngfcrzfjxbzmjfzcsvzmmcsajkjfscsgzcrmjkczgzcsjccngcmcxgzacsvcngfzcpezwzspezbfmfomcsacwzmfscsszacfgcwzjgcxfmvzwjozmvcngfkcnvcngfzsbcwhcmzjbfmvfgcbcmvzszcvcnvfxzcyegcmfzniznhfzcmvzkzsszxgfscojfimzifzgfvmfjcnfcsncazickfzsimcngzspezrjqzmcxkcwzszgzcwztcngmfzgzvmcycnfcrcxcgcsajvfmjcspezvjazmcxpezzekcnvffbzjvfjwesvmzwesjvcnfcpezxnzbvenfzxcmvzfozgzkzmcxkzsszvegffpezcxesccnvjickcnvcpezfevmfacwfmxcjscwvfszcwzacnvczafsvcijgzsxjnhcsbfjskmjcgfvzngzszxxjexnfafzniznhfcmgznvzszszxbmzzxazmsfhexjwgzkzwzomcgfrfjgzxjafssfmjfcwzmzxznvzgcjxzcifmcexsfxcwvfzseowjxcgfexzsvjwfimcngjwfkfzkfmmznvzbfmpezgzafsscsciecsrzoffmgznzpezncfvznhcxznazyccsgzhjbfkmznzgcjxzecremjcimcngzzsfnfmfsczncfgzcimzsvzcazncfermcevcmegcxcsgzveockcnfmczozwjkfscpezfbzjvfckzngzzckfmcfizsvfxegcgcjxzjiecwkcnvfcfsrzjvfsgcrcxfsciznvzafsscpezcxcmvzvcnvfcyegcpezszzsbcwhzzszkcnvznfenjazmsfszvcfseowjxzbmzkfkcozzxazmsfzafsfozxncskjgcsziemcnkcgcwesjvcnccnvjicwjozmgcgzzncfxznfskzmvjssjxczsbzmcnkcgzcexznvfgcbzpeznckmjsvcngcgzafsfnfafvzxfmgcxcemcwcnkcxcmcajwhcrcvcwgcnfsscjgcgzgcgccfxengfbfmgzespezvfgffxcngzbzmcgfxengfcgzesgcmbcmvzimcngz";
  
  
  int i,j;
  unsigned char contadores_letras[26];
  unsigned char letras_ordem[26];
  unsigned int contadores[26]; /* cada elemento deste vector será usado como um contador de ocorrências das letras. 
                                  São 26 contadores porque existem 26 espécies de letras (alfabeto) */

// array de troca: "a e o s r d n i t m u l c v p g q b f h j x z k y w"
  letras_ordem[0]='a';
  letras_ordem[1]='e';
  letras_ordem[2]='o';
  letras_ordem[3]='s';
  letras_ordem[4]='r';
  letras_ordem[5]='d';
  letras_ordem[6]='n';
  letras_ordem[7]='i';
  letras_ordem[8]='t';
  letras_ordem[9]='m';
  letras_ordem[10]='u';
  letras_ordem[11]='l';
  letras_ordem[12]='c';
  letras_ordem[13]='v';
  letras_ordem[14]='p';
  letras_ordem[15]='g';
  letras_ordem[16]='q';
  letras_ordem[17]='b';
  letras_ordem[18]='f';
  letras_ordem[19]='h';
  letras_ordem[20]='j';
  letras_ordem[21]='x';
  letras_ordem[22]='z';
  letras_ordem[23]='k';
  letras_ordem[24]='y';
  letras_ordem[25]='w';
  
  
  /****************************************exemplos simples de acesso à string msg***********************************************/
  /* colocação no ecrã do texto cifrado: */
  printf("%s\n\n", msg);
  
  
  /* colocação no ecrã do 4.º carácter da string msg  */
  printf("4. elemento = %c\n\n", msg[3]);
  
  printf("Len = %d\n\n", strlen(msg));
  /******************************************************************************************************************************/
  
  system("pause");  
  
  /*****************************************contagem de cada classe de letra*****************************************************/
  /* iniciação de todos os contadores a zero */
  for(i=0; i<26; i++)
    contadores[i] = 0;  


  /* é percorrida toda a mensagem, da 1 posição de msg até à última
     o comprimento de msg pode ser determinado pela função strlen()
     msg[i] - 'a' permite indexar o vector contadores numa posição que corresponde à letra que surge na posição i de msg
     Exemplo: sempre que surge na mensagem a letra d será produzido o índice 3 sobre o vector contadores que é depois incrementado
     Isto significa que a posição 3 do vector contadores irá contabilizar o número de ds que aparecem na mensagem.
     Isto significa que a posição 2 do vector contadores irá contabilizar o número de cs que aparecem na mensagem.
     Isto significa que a posição 1 do vector contadores irá contabilizar o número de bs que aparecem na mensagem.
     Isto significa que a posição 0 do vector contadores irá contabilizar o número de as que aparecem na mensagem.     */
  for(i=0; i<strlen(msg); i++)  
    contadores[ msg[i] - 'a' ]++;
    
    /* Cria Array de Letras */
  for(i=0; i<26; i++)
    contadores_letras[i]= i + 'a';

  /* visualização do conteúdo de todos os contadores */  
  for(i=0; i<26; i++)
    printf("%c -> %d\n",contadores_letras[i], contadores[i]);  
  /******************************************************************************************************************************/  


  system("pause");  

/* Ordena  a array tanto os numero como as letras */
  for(i = 0; i < 26; i++) 
    for(j = i+1; j < 26; j++) 
      if (contadores[i] < contadores[j]) { 
        // Muda ordem do numero
        int tmp = contadores[i];
        contadores[i] = contadores[j];
        contadores[j] = tmp;
        
        // Muda ordem Letra 
        char tmp2 = contadores_letras[i];
        contadores_letras[i] = contadores_letras[j];
        contadores_letras[j] = tmp2;
      }


  for(i=0; i<26; i++)
    printf("%c -> %d -> %c\n", contadores_letras[i], contadores[i], letras_ordem[i]);  

/*
String   tmpString = myString.replace( '\'', '*' );
System.out.println( "Original = " + myString );
System.out.println( "Result   = " + tmpString );
*/  

  for(i=0; i<strlen(msg); i++)  
    for(j=0; j<26; j++)  
      if (msg[i]==contadores_letras[j]){ 
        printf("%c",letras_ordem[j]);
      }
     
    
  system("pause");
}

TUDO FEITO :thumbsup:

ps: o geshi ja n funfa? o.0

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ps: o geshi ja n funfa? o.0

Não :thumbsup:

Podias ter feito antes:

unsigned char letras_ordem[26] = "aeosrdnitmulcvpgqbfhjxzkyw";

Muito mais simples :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora