#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#define MAX 30
typedef struct parola_s
{
char anagr[MAX+1];
struct parola_s *prossimo;
} tipo_parola;
typedef enum{FALSE, TRUE} boolean;
void genera_anagramma(char parola[], char anagramma[], boolean usato[],
int lung_parola, int posiz, tipo_parola **p_punttesta);
unsigned long double fattoriale(int n);
boolean presente(char anagramma[], tipo_parola *punttesta);
void libera_memoria(tipo_parola *punttesta, char anagramma[],
boolean usato[]);
unsigned long double numero_anagrammi, calcolati;
time_t tempo_iniziale, tempo_corrente, tempo_impiegato;
int minuti, secondi, ore, trovati;
main()
{
char parola[MAX+1], *anagramma, salva, nome_file[MAX];
boolean *usato, scelta_corretta, finito;
int lung_parola, i, posiz;
tipo_parola *punttesta, *puntcor;
FILE *file_in;
posiz = trovati = 0;
calcolati = 0;
minuti = secondi = ore = 0;
scelta_corretta = finito = FALSE;
while(!finito)
{
punttesta = puntcor = NULL;
calcolati = 0;
trovati = 0;
scelta_corretta = FALSE;
clrscr();
printf("Inserisci la parola da anagrammare (exit per terminare): \n");
scanf("%s", parola);
while(getchar() != '\n');
if(strcmp(parola, "exit") != 0)
{
lung_parola = strlen(parola);
numero_anagrammi = fattoriale(lung_parola);
anagramma = (char *) malloc((lung_parola+1) * sizeof(char));
usato = (boolean *) malloc(lung_parola * sizeof(boolean));
for(i = 0; i < lung_parola; i++)
{
anagramma[i] = parola[0];
usato[i] = FALSE;
}
tempo_iniziale = time(NULL);
genera_anagramma(parola, anagramma, usato, lung_parola,
posiz, &punttesta);
if(punttesta != NULL)
{
while(!scelta_corretta)
{
printf("\nVuoi salvare i risultati ottenuti? (s/n): ");
scanf("%c", &salva);
while(getchar() != '\n');
if((salva == 's') || (salva == 'S'))
{
scelta_corretta = TRUE;
printf("\nDigita il nome del file su cui salvare\n(il file verra' creato nella stessa cartella del programma):\n");
scanf("%s", nome_file);
if((file_in = fopen(nome_file, "w")) != NULL)
{
puntcor = punttesta;
while(puntcor != NULL)
{
fprintf(file_in, "%s\n", (*puntcor).anagr);
puntcor = (*puntcor).prossimo;
}
printf("Anagrammi salvati correttamente in %s\n", nome_file
);
fclose(file_in);
getch();
}
else
printf("Impossibile scrivere il file!\n");
}
else
if((salva == 'n') || (salva == 'N'))
scelta_corretta = TRUE;
}
}
else
{
printf("Non sono stati trovati anagrammi\n");
getch();
}
}
else
finito = TRUE;
libera_memoria(punttesta, anagramma, usato);
}
}
void genera_anagramma(char parola[], char anagramma[], boolean usato[],
int lung_parola, int posiz, tipo_parola **p_punttesta)
{
int indice, indice_aux;
FILE *f_parole;
char file_parole[MAX], estensione[3], parola_corrente[MAX+1];
boolean trovato = FALSE;
tipo_parola *puntcor, *puntaux;
sprintf(estensione, ".%c", anagramma[0]);
sprintf(file_parole, "ita%s", estensione);
if(posiz >= lung_parola)
{
anagramma[posiz] = '\0';
if((f_parole = fopen(file_parole, "r")) != NULL)
{
while((fscanf(f_parole, "%s", parola_corrente) != EOF)
&& !trovato)
{
if(strcmp(anagramma, parola_corrente) == 0)
{
trovato = TRUE;
if((strcmp(parola, anagramma) != 0) &&
!presente(anagramma, *p_punttesta))
{
trovati++;
puntaux = (tipo_parola *) malloc(sizeof(tipo_parola));
strcpy((*puntaux).anagr, anagramma);
(*puntaux).prossimo = NULL;
if(*p_punttesta == NULL)
*p_punttesta = puntaux;
else
{
puntcor = *p_punttesta;
while((*puntcor).prossimo != NULL)
puntcor = (*puntcor).prossimo;
(*puntcor).prossimo = puntaux;
}
}
}
}
}
fclose(f_parole);
calcolati++;
clrscr();
printf("Parola anagrammata: %s\n\n", parola
);
printf("%.0Lf anagrammi analizzati su %.0Lf anagrammi totali\n",
calcolati, numero_anagrammi);
tempo_corrente = time(NULL);
tempo_impiegato = tempo_corrente - tempo_iniziale;
ore = tempo_impiegato / 3600;
minuti = (tempo_impiegato / 60) - (ore * 60);
secondi = tempo_impiegato % 60;
printf("Tempo trascorso: %dh %dm %ds\n", ore
, minuti
, secondi
);
printf("\nAnagrammi trovati: %d\n", trovati
);
if(*p_punttesta != NULL)
{
puntcor = *p_punttesta;
while(puntcor != NULL)
{
printf("%s\n", (*puntcor
).
anagr);
puntcor = (*puntcor).prossimo;
}
}
}
else
{
for(indice = 0; indice < lung_parola; indice++)
if(!usato[indice])
{
usato[indice] = TRUE;
anagramma[posiz] = parola[indice];
genera_anagramma(parola, anagramma, usato, lung_parola, posiz+1,
p_punttesta);
usato[indice] = FALSE;
}
}
}
unsigned long double fattoriale(int n)
{
unsigned long double fat;
if(n == 0)
fat = 1;
else
fat = (unsigned long double)n * fattoriale(n-1);
return(fat);
}
boolean presente(char anagramma[], tipo_parola *punttesta)
{
tipo_parola *puntcor;
boolean trovato = FALSE;
puntcor = punttesta;
while((puntcor != NULL) && !trovato)
if(strcmp(anagramma, (*puntcor).anagr) == 0)
trovato = TRUE;
else
puntcor = (*puntcor).prossimo;
return(trovato);
}
void libera_memoria(tipo_parola *punttesta, char anagramma[],
boolean usato[])
{
tipo_parola *puntcor, *puntprec;
puntcor = punttesta;
while(puntcor != NULL)
{
puntprec = puntcor;
puntcor = (*puntcor).prossimo;
free(puntprec);
}
free(usato);
free(anagramma);
}