Ir para o conteúdo
Gooden

Descodificação Por Letra

Mensagens Recomendadas

Gooden

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

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.


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

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?


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Gooden

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

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


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.