001: #include<stdio.h>
002: #include<stdlib.h>
003: #include<string.h>
004: 
005: // PUNTO 1
006: char *leggi_parola(FILE *fp)
007: {
008:   char tmp[1000];
009:   char *dest;
010: 
011:   if(fscanf(fp, "%s", tmp)==1) // se ho letto una parola fscanf() restituisce 1
012:   {
013:     dest=malloc(strlen(tmp)+1); // alloco spazio sufficiente per stringa e carattere di terminazione
014:     if(!dest) // allocazione fallita
015:     {
016:       perror("");
017:       exit(EXIT_FAILURE);
018:     }
019:     strcpy(dest, tmp);
020:     return dest;
021:   }
022:   return NULL;
023: 
024: 
025: }
026: 
027: int main(int argc, char **argv)
028: {
029:   FILE *fp;
030: 
031:   fp=fopen("parole.txt", "r");
032:   if(!fp)
033:   {
034:     perror("errore");
035:     exit(EXIT_FAILURE) ;
036:   }
037: 
038: 
039:   // PUNTO 2
040:   char **parole=NULL, *lettura; // parole e' un array di stringhe che man mano allargo, lettura lo uso per memorizzare l'indirizzo restituito da leggi_parola()
041:   int nparole=0;
042:   while(lettura=leggi_parola(fp))
043:   {
044:     //printf("*%s* ", lettura); // DEBUG
045:     ++nparole; // aumento contatore numero parole letto
046:     parole=realloc(parole, nparole*sizeof(char*)); // allargo array stringhe
047:     parole[nparole-1]=lettura; // memorizzo come ultimo elemento dell'array l'indirizzo dell'ultima parola letta
048:   }
049: 
050:   fclose(fp);
051: 
052:   // PUNTO 3
053:   int n;
054:   printf("Inserisci la lunghezza delle parole da analizzare: ");
055:   scanf("%d", &n);
056: 
057:   // faccio in due cicli separati i punti 4 e 5 per maggior chiarezza, un ciclo singolo bastava...
058:   // PUNTO 4
059:   int i, conta=0;
060:   for(i=0; i<nparole; ++i)
061:   {
062:     if(strlen(parole[i])==n)
063:     {
064:       ++conta;
065:     }
066:   }
067:   printf("Il numero di parole lunghe %d caratteri e' %d\n", n, conta);
068: 
069: 
070:   // PUNTO 5
071:   int indice=-1; // indice sequenza
072:   int lsequenza=0; // massima lunghezza fino ad ora trovata
073:   int prevlung=0; 
074:   for(i=0; i<nparole; ++i)
075:   {
076:     if(strlen(parole[i])==n) // ho trovato una parola di lunghezza n, vado avanti fino a che ne trovo della stessa lunghezza
077:     {
078:       int j=i;
079:       while(strlen(parole[j])==n)
080:   ++j;
081:       // al termine di questo ciclo j punta alla prima parola che ha lunghezza diversa dall i-esima 
082:       if((j-i) > lsequenza) // verifico se ho trovato una sequenza piu' lunga di quella trovata fino ad adesso
083:       {
084:   indice=i; // memorizzo inizio sequenza
085:   lsequenza=j-i; // memorizzo lunghezza sequenza;
086:       }
087:       i=j-1; // aggiusto il contatore del ciclo, tanto ho gia' analizzato questo pezzo
088:     }
089:   }
090: 
091:   if(indice>=0) // ho trovato una sequenza di stringhe lunga n?
092:   {
093:     printf("La piu' lunga sequenza di parole aventi lunghezza %d inizia all'indice %d, e' lunga %d parole:\n", n, indice, lsequenza);
094:     for(i=indice; i<indice+lsequenza; ++i)
095:       printf(" * %s\n", parole[i]);
096:   }
097:   else
098:   {
099:     printf("Non ho trovato sequenze di parole aventi lunghezza %d\n", n);
100:   }
101: 
102:   // DISALLOCAZIONE STRUTTURA
103:   for(i=0; i<nparole; ++i)
104:     free(parole[i]);
105:   free(parole);
106: }
107: