Algoritmo de Java para C

1. Algoritmo de Java para C

Taciane Santos
taciSantos

(usa Ubuntu)

Enviado em 18/02/2020 - 17:19h

Olá, boa tarde à todos!

Estou a pouco aqui, então, se tiver algo de errado, me desculpem. Vamos lá.
Tenho um algoritmo em java que eu preciso passar para C, ele é sobre o desafio do anagrama (que é gerar todos os anagramas possíveis de uma palavra fornecida pelo usuário e/ou de um txt com várias palavras). Vou fazendo e testando, mas na contagem de letras repetidas, ele não diz o total certo de letras e ele n ta gerando anagrama. Por enquanto eu estou assim:


#include "model.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

FILE *p_arquivo = NULL;

static lista_palavra *p_lista = NULL;

static lista_palavra *no()
{
lista_palavra *p_no = (lista_palavra *)malloc(sizeof(lista_palavra)); // Atribui o p_no à lista (lista palavra)
return p_no; // Retorna o endereço do primeiro nó
}

int abre_arquivo(void)
{

p_arquivo = fopen("palavras.txt", "r");

if (p_arquivo == NULL)
{
return -1;
}
else if (p_arquivo != NULL)
{
return 0;
}
}

int ler_arquivo(void)
{
int cont = 0, cont_letra = 0;
char *ler_palavra;
ler_palavra = malloc(32);

if (ler_palavra == NULL)
{
return -1;
}
abre_arquivo();

while (!feof(p_arquivo))
{
if (fscanf(p_arquivo, "%s", ler_palavra) < 0)
{
printf("Error");
}
add_lista(ler_palavra);
}

fclose(p_arquivo);
free(ler_palavra);
return 0;
}

void add_lista(char *ler_palavra)
{
lista_palavra *p_palavra = no(); // Ponteiro que aponta para primeiro no da lista(p_lista)

if (p_palavra == NULL)
{
exit(0);
}

strcpy(p_palavra->palavra, ler_palavra);

if (p_lista == NULL) // Adiciona na primeira posição
{
p_lista = p_palavra;
p_palavra->proximo = NULL;
}
else
{
p_palavra->proximo = p_lista;
p_lista = p_palavra;
}

geraAnagramas(p_palavra);
}

void imp_lista(void)
{
FILE *p_arquivo;
lista_palavra *p;
p = p_lista;
char *palavra;
palavra = malloc(32);

strcpy(palavra, p->palavra);
p_arquivo = fopen("impPalavra.txt", "w");
if (p_arquivo == NULL)
{
printf("Não foi possivel abrir o arquivo");
}
while (p != NULL)
{
fprintf(p_arquivo, "%s\n", palavra);
p = p->proximo;
}
free(palavra);
fclose(p_arquivo);
}

int fatorial(int num)
{
int fat = 1;
{
for (int i = 1; i <= num; i++)
{
fat *= i;
}
return fat;
}
}

int geraAnagramas(lista_palavra *p)
{
char *palavra;
palavra = malloc(32);

strcpy(palavra, p->palavra);

int cont_letra = strlen(palavra);
char letras[cont_letra];
int letras_repetidas = 0, distintas = 0, posicoes[cont_letra], lugar = 0;

memset(letras, 0, cont_letra);

for (int i = 0; i < cont_letra; i++)
{
letras[i] = palavra[i];
lugar = -1;

for (int j = 0; j < distintas; j++)
{
if ((letras[j] == palavra[i]))
{
lugar = j;
break;
}
}

if (lugar < 0)
{
letras[distintas] = palavra[i];
posicoes[distintas] = i;
distintas++;
}
else
{
letras_repetidas++;
}
}

printf("Repetidas: %d\n\n", letras_repetidas);

printf("Distintas: %d\n\n", distintas);

int numAnagramasSemRepeticao = fatorial(cont_letra);
for (int i = 0; i < distintas; i++)
{
numAnagramasSemRepeticao = numAnagramasSemRepeticao / (fatorial(letras_repetidas));
}

int i = 0, j = 0;
char *resto, *anagramasResto;

for (int i = 0; i < distintas; ++i)
{
int pos = 0;
pos = posicoes[i];

resto = substr(palavra, 0, pos + 1);
add_lista(resto);
//geraAnagramas(resto);

int k = 0;
char ret[40];
for (int j = 0; j < strlen(resto); j++)
{
ret[k] = letras[i] + anagramasResto[j];
imp_arquivo(ret[k]);
}
free(resto);
}
geraAnagramas(resto);

// imp_arquivo();

free(anagramasResto);

return 0;
}

char *substr(char *p1, int x, int y)
{
char *p2;
int i = 0, cont = 0;
p2 = malloc(40);

memset(p2, 0, 40);

memcpy(p2, &p1[x], y - x);

return p2;
}

void imp_arquivo()
{
FILE *p_arquivo;
char angrama;

p_arquivo = fopen("AnagGerado.txt", "w");
if (p_arquivo == NULL)
{
printf("Erro ao abrir a arquivo");
}
while (p_arquivo != NULL)
{
fprintf(p_arquivo, "%s\n", angrama);
}
}







  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts