Ir ao conteúdo
  • Cadastre-se

C Dificuldade com Permutação em C


Posts recomendados

Tenho um trabalho para entregar para meu professor da faculdade e estou com alguns problemas, eu sei fazer permutação na matemática mas utilizando o Codeblocks (C) é um pouco diferente haha. 
Estou colocando o código comentado abaixo caso alguém queira ajudar e o enunciado do exercício.

"Elabore um programa em C que leia um conjunto de símbolos (letras e números) através de listas encadeadas, sem repetições via teclado, calcule a quantidade e liste:
• Permutações
• Arranjos
• Combinações
dos elementos do conjunto lido.
Entrada:
BOLA
Saída:
permutações: 24
B O L A
B O A L
B L O A
B L A O
B A O L
B A L O
O B L A
O B A L
O L B A
O L A B
O A B L
O A L B
L B O A
L B A O
L O B A
L O A B
L A B O
L A O B
A B O L
A B L O
A O B L
A O L B
A L B O
A L O B
Entrada:
elementos para arranjar: 3
Saída:
arranjos(4,3): 24
B O L
B O A
B L O
B L A
B A O
B A L
O B L
O B A
O L B
O L A
O A B
O A L
L B O
L B A
L O B
L O A
L A B
L A O
A B O
A B L
A O B
A O L
A L B
A L O
Entrada:
elementos para combinar: 3
Saída:
combinações (4,3): 4
B O L
B O A
B L A
O L A
Para palavras que tenham caracteres repetidos, requer apenas as permutações.
Entrada:
BALA
Saída:
permutações: 12
B A L A
B A A L
B L A A
A B A L
A B L A
A A B L
A A L B
A L B A
A L A B
L B A A
L A B A
L A A B

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


//Corpo do codigo
int main(){
    //Variaveis
    char palavra[255], aux;
    int tam, i, j, permu = 1;
    bool tf;


    printf("Digite uma palavra SEM ACENTOS para checar suas Permutacoes, Arranjos e Combinacoes\n");


    //Limpa o Buffer, tirando todo o lixo
    setbuf(stdin, 0);


    //Ler a string, precisa de uma FILE, no caso standard input
    fgets(palavra, 255, stdin);


    //Limpando os espacos que nao foram utilizados
    palavra[strlen(palavra) - 1] = '\0';


    //Adquirindo o tamanho da palavra
    tam = strlen(palavra);


    //Verificando se existem letras que se repetem
    for(i=0; palavra[i] != '\0'; i++){
        for(j=0; palavra[j] != '\0'; j++){
            if((palavra[i] == palavra[j])&&(i != j)){
                tf = true;
                break;
            }else{
                tf = false;
            }
        }
    }

    //Inicio das operacoes
    if(tf){
        for(i=tam; i>0; i--){
        permu = permu*i;
        }
    printf("\nNumero de permutacoes:%d", permu);
    printf("\n");

    //MOSTRAR AS PERMUTACOES
    for(i=0; i < permu; i++){
        for(j=0; j < tam; j++){
            printf("%c",palavra[j]);
            aux = palavra[tam];
            palavra[tam] = palavra[i];
            palavra[i]=aux;
        }
        printf("\n");
    }

    }else{
    printf("FALSE");//SEM REPETICAO
    }

    return 0;
}


OBS: Eu conheço LISTAS ENCADEADAS mas não sei como utilizar, então estou fazendo o programa com uma array do tipo string mesmo.

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

V!OLADOR, eu assisti aos vídeos e li o programa do link que você me enviou, percebi até que o cara tinha um método para descartar os anagramas repetidos.
Entretanto ainda não consegui terminar esse programa, eu não sou muito bom programando e estou travado de novo... já tem algumas horas que estou tentando resolver esse problema mas nada vem a minha cabeça.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX 255

//Structs

typedef struct lista{
    char letra[MAX];
    struct lista* prox;
};

//Funções

//Função comparativa que permite uso do qsort
int compare(const void* a, const void* b)
{
    return (*(char*)a - *(char*)b);
}

//Função de Troca de caracters
void troca(char* a, char* b)
{
    char t = *a;
    *a = *b;
    *b = t;
}

int findCeil(char palavra[], char primeiro, int left, int h)
{
    int ceilIndex = left;

    for (int i = left + 1; i <= h; i++)
        if (palavra[i] > primeiro && palavra[i] < palavra[ceilIndex])
            ceilIndex = i;

    return ceilIndex;
}

//Função que printa as pemutações
void sortedPermutations(char palavra[])
{
    int size = strlen(palavra);

    qsort(palavra, size, sizeof(palavra[0]), compare);

    bool isFinished = false;
    while (!isFinished) {
        static int x = 1;
        printf("%d  %s \n", x++, palavra);
        int i;
        for (i = size - 2; i >= 0; --i)
            if (palavra[i] < palavra[i + 1])
                break;
        if (i == -1)
            isFinished = true;
        else {
            int ceilIndex = findCeil(palavra, palavra[i], i + 1, size - 1);
            troca(&palavra[i], &palavra[ceilIndex]);
            qsort(palavra + i + 1, size - i - 1, sizeof(palavra[0]), compare);
        }
    }
}

//n! formula de permu

//n!/(n - k)!

//Função que printa as pemutações
void sortedArrangement(char palavra[], int arranjos)
{
    int size = strlen(palavra);

    qsort(palavra, size, sizeof(palavra[0]), compare);

    bool isFinished = false;
    while (!isFinished) {

        static int x = 1;
        printf("%d  %s \n", x++, palavra);

        int i;
        for (i = size - 2; i >= 0; --i)
            if (palavra[i] < palavra[i + 1])
                break;
        if (i == -1)
            isFinished = true;
        else {
            int ceilIndex = findCeil(palavra, palavra[i], i + 1, size - 1);
            troca(&palavra[i], &palavra[ceilIndex]);
            qsort(palavra + i + 1, size - i - 1, sizeof(palavra[0]), compare);
        }
    }
}

//Corpo do codigo
int main(){
    //Variaveis
    char palavra[255], aux;
    int tam, i, j, permu = 1;
    bool tf;

    printf("Digite uma palavra SEM ACENTOS para checar suas Permutacoes, Arranjos e Combinacoes\n");

    //Limpa o Buffer, tirando todo o lixo
    setbuf(stdin, 0);

    //Ler a string, precisa de uma FILE, no caso standard input
    fgets(palavra, 255, stdin);

    //Limpando os espacos que nao foram utilizados
    palavra[strlen(palavra) - 1] = '\0';

    //Adquirindo o tamanho da palavra
    tam = strlen(palavra);

    int cont[tam];

    //Verificando se existem letras que se repetem
    for(i=0; palavra[i] != '\0'; i++){
        for(j=0; palavra[j] != '\0'; j++){
            if((palavra[i] == palavra[j])&&(i != j)){
                tf = true;
                break;
            }else{
                tf = false;
            }
        }
    }

    //Inicio das operacoes
    if(tf){
        for(i=0; palavra[i] != '\0'; i++){
            for(j=0; palavra[j] != '\0'; j++){
                if((palavra[i] == palavra[j])&&(i != j)){

            }
        }
    }
    //MOSTRA AS PERMUTACOES

    sortedPermutations(palavra);

    }else{

    //MOSTRA AS PERMUTACOES
    sortedPermutations(palavra);

    //MOSTRA OS ARRANJOS
    printf("Informe o numero de Arranjos:");
    int arranjos;
    scanf("%d", &arranjos);
    printf("\n");

    sortedArrangement(palavra, arranjos)
    
    
    //MOSTRA AS COMBINACOES
    printf("Informe o numero de Combinacoes:");
    int combinacao;
    scanf("%d", &combinacao);
    printf("\n");

    }

    return 0;
}


Eu estou tentando inserir a Lista encadeada no lugar da String padrão e também tentei alterar a função de Permutação para Fazer os Arranjos e as Combinações mas nenhuma das lógicas que fiz deu certo, então apaguei do programa (provavelmente devia ter deixado para verem minha lógica), o ultimo protótipo salvo foi esse, se alguém puder dar uma olhada no código, o enunciado do problema foi postado na cabeça do tópico!

Link para o comentário
Compartilhar em outros sites

Olá

 

Este é um programa de programação ou de estatística?

 

Entenda que

  • não há nenhuma vantagem em usar listas ligadas para resolver isso. Pelo contrário, só vai ter mais trabalho.
  • ao implementar listas ligadas quase sempre é um problema não ter ponteiros para os dois lados. É um inferno ter que voltar ao início ou ao fim da lista para qualquer operação. É mais difícil e não mais fácil. Uma lista "duplamente encadeada" é muito mais simples de usar que uma "simplesmente"  encadeada. Eu vejo textos e pessoas ensinando isso e reforçando essa ideia, e não sei de onde veio. É mais difícil sem ter ponteiros para os dois lados
  • uma lista é uma coleção de nós. NÃO é um nó. Nunca deve programar uma lista a partir de uma estrutura Node e sim a partir de uma estrutura Lista.  Só vai ter muito mais trabalho e muito menos resultado em muito  mais tempo.
  • arranjos e permutações tem fórmulas simples: apenas use as fórmulas e calcule o tamanho dos vetores e preencha com as permutações. Escreva seu programa em torno dos dados.
  • como seu enunciado pede o uso de listas, use apenas para o óbvio: ler os valores da entrada e colocar na lista, inserindo no início que é mais fácil, já que no seu caso a ordem não importa.
     

Pena que tem que escrever em C e não C++: em C++ pode obter as permutações em uma linha, porque faz parte da biblioteca padrão.

 

 

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