Ir para conteúdo
Fórum Script Brasil
  • 0

anagrama em c


Filipe Nogueira

Pergunta

boa tarde

Estou tendando fazer um programa que leia uma palara e retorna o numero de anagramas possiveis de fazer.

o problema esta na ultimafuncao do codigo onde eu montei uma struct para esta colocando a letra da palavra e a quantidade de vezes que ela aparece na palavra so que a funcao ao invés de me retorna a quantidade ela me retorna a quantidade ao quadrado e eu não sei o que fazer

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

//tamanho do vetor de char para receber do usuario
const int tamanho=100;

//funcoes
int numAnagrama (char anag[]);
int fatorial (int n);
int vletrasIguais (char anag[]);
int pletrasIguais (char anag[]);


int main(int argc, char *argv[])
{
    
    char anagrama[tamanho];
    
    printf ("Este programa é um programa que ira calcular o anagrama de uma palavra\n\n");
    printf ("Informe uma palavra de no maximo 5 caracteres: >");
    gets(anagrama);
    
    //tratar condição caso o usuário digite uma palavra maior que 5
    if ( strlen(anagrama) > 5 ){

        system("cls");
        system("color 81");
        printf("\n\n\n\n\n\n\n\n\n\n\nERRO!!! Este programa so funciona com palavras\n\nque tenhao 5 caracteres apenas!!\n\n");
        system("Pause");

    return 1;
    } 
    
    //exibir numero de anagramas possiveis
     printf ("Numero de anagramas possiveis: %d \n\n",numAnagrama(anagrama));
    
    system("PAUSE");
    return 0;
}

//funcao que retorna o numero de anagrama possiveis de se montar
int numAnagrama (char anag[]){
    
    int c=0;
    
    //verificar letras iguais
    if(vletrasIguais(anag)== 0){
       c=strlen(anag);
       c=fatorial(c);
    }
    else {
    
    pletrasIguais(anag);      
    
    }     
    
    return c;

    
}

//Funcao que retorna o fatorial
int fatorial (int n)
{
    int result;
    
    if(n < 0 ) return -1; //erro
    if(n == 0 || n == 1) return 1;
    result = fatorial(n-1) * n;

    return result;
}

//funcao para verificar se exixte letrars iguais na palavra
//caso não tenha a funcao retorna numero 0;
int vletrasIguais (char anag[]){

    int ret=0;
        
    for (int i = 0; i < strlen(anag); i++){
         for (int j = 0; j < strlen(anag); j++){
             if(anag==anag[j]){
                ret++;
             }           
         }
         if(ret==1)
            ret=0;                  
    }    
        
    return ret;
    
}

int pletrasIguais (char anag[]){

    struct comparacao{
           char letra;
           int quantidade;
           
           };
    comparacao vetor[tamanho];     
    char l;
    
    for(int cont=0;cont<tamanho;cont++){
       vetor[cont].quantidade=0;
       vetor[cont].letra='$';
    }
    
    for(int a=0; a<strlen(anag); a++){
       l= anag[a];
       for(int b=0; b<strlen(anag); b++){
          if (l==anag){
             for(int z=0; z<strlen(anag); z++){
                if(vetor[z].letra=='$'){
                  vetor[z].letra=anag[a];
                  vetor[z].quantidade++;
                  z=strlen(anag);
                }
                else{
                    if(vetor[z].letra==anag[a]){
                      vetor[z].quantidade++;
                      z=strlen(anag);
                    }
                }
             }  
          }               
       }             printf("vetor %d  %c \n", vetor[a].quantidade, vetor[a].letra);
}
}

 

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Buenas Felipe.

Tchê, acredito que você esteja limitando o tamanho da palavra em 5 letras apenas para teste. Caso contrário convém diminuir o valor do tamanho para 5 também.

Da mesma forma seria mais interessante você usar uma forma diferente de tratar uma entrada maior que a esperada, talvez usando um while:

while ( strlen(anagrama) > 5 ){
        printf("\n\n\nERRO!!! Este programa so funciona com palavras que tenham no maximo 5 caracteres!\n\n");
        printf ("Informe uma palavra de no maximo 5 caracteres: >");
        gets(anagrama);
    }
Dessa forma você não precisa rodar o programa novamente por causa de um erro de digitação. Na função que verifica a existência de letras iguais, não vejo a necessidade de fazeres tantas comparações, uma vez que se existir pelo menos uma repetição você terá que passar para a função pletrasiguais. Nesse caso ficaria melhor assim:
int vletrasIguais (char anag[]){

    int i, j;
        
    for (i = 0; i < strlen(anag); i++)
        for (j = 0; j < strlen(anag); j++){
            if((anag[i]==anag[j]) && (i!=j))
                return 1;
        }
    return 0;
}
Note que sem a condição de i!=j a função vai retornar que exite repetição. Quanto a função pletrasiguais ela realmente está confusa. Você está fazendo muitas comparações desnecessárias, pelo que entendi você compara se houve repetição usando o '$' e então incrementa. Confesso que não vou conseguir te ajudar seguindo essa linha de raciocínio. Acredito que seria mais fácil você usar um vetor para fazer essas comparações, de forma que sempre que você tiver uma repetição você incremente o valor da posição desse vetor. Algo assim, por exemplo:
int pletrasIguais (char anag[]){
    int i, j, *v, tam, fat, denominador=1;
    char *palavra;
  
    tam=strlen(anag);
    palavra=(char*)malloc(sizeof(char)*tam);
    strcpy(palavra,anag);

    v=(int*)malloc(sizeof(int)*tam);
    
    for(i=0;i<tam;i++)
        v[i]=1;
    
    for(i=0; i<tam; i++){
        if(palavra[i]!='$')
            for(j=0; j<tam; j++){
                if ((palavra[i]==palavra[j])&&(i!=j)){
                    v[i]++;
                    palavra[j]='$';
                }
            }              
    }
    for(i=0;i<tam;i++){
        fat=fatorial(v[i]);
        denominador=denominador*fat;
    }

    return denominador;
}

Acredito que você tenha o conhecimento matemático para solucionar a questão dos anagramas, logo saberá como usar o denominador.

Qualquer duvida posta ai.

Um abraço.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...