Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Anagrammi v1.1 - anagrammi.C

anagrammi.C

Caricato da:
Scarica il programma completo

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <time.h>
  6.  
  7. #define MAX 30
  8.  
  9. typedef struct parola_s
  10. {
  11.         char anagr[MAX+1];
  12.         struct parola_s *prossimo;
  13. } tipo_parola;
  14.  
  15. typedef enum{FALSE, TRUE} boolean;
  16.  
  17. void genera_anagramma(char parola[], char anagramma[], boolean usato[],
  18.                                         int lung_parola, int posiz, tipo_parola **p_punttesta);
  19. unsigned long double fattoriale(int n);
  20. boolean presente(char anagramma[], tipo_parola *punttesta);
  21. void libera_memoria(tipo_parola *punttesta, char anagramma[],
  22.                                                                                                         boolean usato[]);
  23.  
  24. unsigned long double numero_anagrammi, calcolati;
  25. time_t tempo_iniziale, tempo_corrente, tempo_impiegato;
  26. int minuti, secondi, ore, trovati;
  27.  
  28. main()
  29. {
  30. char parola[MAX+1], *anagramma, salva, nome_file[MAX];
  31. boolean *usato, scelta_corretta, finito;
  32. int lung_parola, i, posiz;
  33. tipo_parola *punttesta, *puntcor;
  34. FILE *file_in;
  35.  
  36. posiz = trovati = 0;
  37. calcolati = 0;
  38. minuti = secondi = ore = 0;
  39. scelta_corretta = finito = FALSE;
  40.  
  41. while(!finito)
  42. {
  43.         punttesta = puntcor = NULL;
  44.         calcolati = 0;
  45.         trovati = 0;
  46.         scelta_corretta = FALSE;
  47.         clrscr();
  48.  
  49.         printf("Inserisci la parola da anagrammare (exit per terminare): \n");
  50.         scanf("%s", parola);
  51.         while(getchar() != '\n');
  52.  
  53.         if(strcmp(parola, "exit") != 0)
  54.         {
  55.                 lung_parola = strlen(parola);
  56.                 numero_anagrammi = fattoriale(lung_parola);
  57.  
  58.                 anagramma = (char *) malloc((lung_parola+1) * sizeof(char));
  59.                 usato = (boolean *) malloc(lung_parola * sizeof(boolean));
  60.  
  61.                 for(i = 0; i < lung_parola; i++)
  62.                 {
  63.                         anagramma[i] = parola[0];
  64.                         usato[i] = FALSE;
  65.                 }
  66.                 tempo_iniziale = time(NULL);
  67.                 genera_anagramma(parola, anagramma, usato, lung_parola,
  68.                                                                                                         posiz, &punttesta);
  69.                 if(punttesta != NULL)
  70.                 {
  71.                         while(!scelta_corretta)
  72.                         {
  73.                                 printf("\nVuoi salvare i risultati ottenuti? (s/n): ");
  74.                                 scanf("%c", &salva);
  75.                                 while(getchar() != '\n');
  76.                                 if((salva == 's') || (salva == 'S'))
  77.                                 {
  78.                                         scelta_corretta = TRUE;
  79.                                         printf("\nDigita il nome del file su cui salvare\n(il file verra' creato nella stessa cartella del programma):\n");
  80.                                         scanf("%s", nome_file);
  81.                                         if((file_in = fopen(nome_file, "w")) != NULL)
  82.                                         {
  83.                                                 puntcor = punttesta;
  84.                                                 while(puntcor != NULL)
  85.                                                 {
  86.                                                         fprintf(file_in, "%s\n", (*puntcor).anagr);
  87.                                                         puntcor = (*puntcor).prossimo;
  88.                                                 }
  89.                                                 printf("Anagrammi salvati correttamente in %s\n", nome_file);
  90.                                                 fclose(file_in);
  91.                                                 getch();
  92.                                         }
  93.                                 else
  94.                                         printf("Impossibile scrivere il file!\n");
  95.                                 }
  96.                                 else
  97.                                         if((salva == 'n') || (salva == 'N'))
  98.                                                 scelta_corretta = TRUE;
  99.                         }
  100.                 }
  101.                 else
  102.                 {
  103.                         printf("Non sono stati trovati anagrammi\n");
  104.                         getch();
  105.  
  106.                 }
  107.         }
  108.         else
  109.                 finito = TRUE;
  110.  
  111.         libera_memoria(punttesta, anagramma, usato);
  112.  
  113. }
  114.  
  115. }
  116.  
  117. void genera_anagramma(char parola[], char anagramma[], boolean usato[],
  118.                                         int lung_parola, int posiz, tipo_parola **p_punttesta)
  119. {
  120. int indice, indice_aux;
  121. FILE *f_parole;
  122. char file_parole[MAX], estensione[3], parola_corrente[MAX+1];
  123. boolean trovato = FALSE;
  124. tipo_parola *puntcor, *puntaux;
  125.  
  126. sprintf(estensione, ".%c", anagramma[0]);
  127. sprintf(file_parole, "ita%s", estensione);
  128.  
  129. if(posiz >= lung_parola)
  130. {
  131.         anagramma[posiz] = '\0';
  132.         if((f_parole = fopen(file_parole, "r")) != NULL)
  133.         {
  134.                 while((fscanf(f_parole, "%s", parola_corrente) != EOF)
  135.                                                                                 && !trovato)
  136.                 {
  137.                         if(strcmp(anagramma, parola_corrente) == 0)
  138.                         {
  139.                                 trovato = TRUE;
  140.                                 if((strcmp(parola, anagramma) != 0) &&
  141.                                                                                 !presente(anagramma, *p_punttesta))
  142.                                 {
  143.                                         trovati++;
  144.  
  145.                                         puntaux = (tipo_parola *) malloc(sizeof(tipo_parola));
  146.                                         strcpy((*puntaux).anagr, anagramma);
  147.                                         (*puntaux).prossimo = NULL;
  148.  
  149.                                         if(*p_punttesta == NULL)
  150.                                                 *p_punttesta = puntaux;
  151.                                         else
  152.                                         {
  153.                                                 puntcor = *p_punttesta;
  154.                                                 while((*puntcor).prossimo != NULL)
  155.                                                 puntcor = (*puntcor).prossimo;
  156.                                                 (*puntcor).prossimo = puntaux;
  157.                                         }
  158.                                 }
  159.                         }
  160.                 }
  161.         }
  162.         fclose(f_parole);
  163.         calcolati++;
  164.         clrscr();
  165.         printf("Parola anagrammata: %s\n\n", parola);
  166.         printf("%.0Lf anagrammi analizzati su %.0Lf anagrammi totali\n",
  167.                                                                                         calcolati, numero_anagrammi);
  168.         tempo_corrente = time(NULL);
  169.         tempo_impiegato = tempo_corrente - tempo_iniziale;
  170.  
  171.         ore = tempo_impiegato / 3600;
  172.         minuti = (tempo_impiegato / 60) - (ore * 60);
  173.         secondi = tempo_impiegato % 60;
  174.  
  175.         printf("Tempo trascorso: %dh %dm %ds\n", ore, minuti, secondi);
  176.         printf("\nAnagrammi trovati: %d\n", trovati);
  177.  
  178.         if(*p_punttesta != NULL)
  179.         {
  180.                 puntcor = *p_punttesta;
  181.                 while(puntcor != NULL)
  182.                 {
  183.                         printf("%s\n", (*puntcor).anagr);
  184.                         puntcor = (*puntcor).prossimo;
  185.                 }
  186.         }
  187.  
  188. }
  189. else
  190. {
  191.         for(indice = 0; indice < lung_parola; indice++)
  192.                 if(!usato[indice])
  193.                 {
  194.                         usato[indice] = TRUE;
  195.                         anagramma[posiz] = parola[indice];
  196.                         genera_anagramma(parola, anagramma, usato, lung_parola, posiz+1,
  197.                                                                                                                         p_punttesta);
  198.                         usato[indice] = FALSE;
  199.                 }
  200. }
  201.  
  202. }
  203.  
  204. unsigned long double fattoriale(int n)
  205. {
  206. unsigned long double fat;
  207.  
  208. if(n == 0)
  209.         fat = 1;
  210.  
  211. else
  212.         fat = (unsigned long double)n * fattoriale(n-1);
  213.  
  214. return(fat);
  215. }
  216.  
  217. boolean presente(char anagramma[], tipo_parola *punttesta)
  218. {
  219. tipo_parola *puntcor;
  220. boolean trovato = FALSE;
  221.  
  222. puntcor = punttesta;
  223. while((puntcor != NULL) && !trovato)
  224.         if(strcmp(anagramma, (*puntcor).anagr) == 0)
  225.                 trovato = TRUE;
  226.         else
  227.                 puntcor = (*puntcor).prossimo;
  228.  
  229. return(trovato);
  230. }
  231.  
  232. void libera_memoria(tipo_parola *punttesta, char anagramma[],
  233.                                                                                                         boolean usato[])
  234. {
  235. tipo_parola *puntcor, *puntprec;
  236.  
  237. puntcor = punttesta;
  238. while(puntcor != NULL)
  239. {
  240.         puntprec = puntcor;
  241.         puntcor = (*puntcor).prossimo;
  242.         free(puntprec);
  243. }
  244. free(usato);
  245. free(anagramma);
  246.  
  247. }
  248.