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: