Il codice è abbastanza commentato, quindi si dovrebbe capire facilmnte. PS: ho fatto qlcke prova e mi pare funzioni, ma non posso esserne sicuro al 100%, se sei interessato fai qlke prova tu ed eventualmente fammi sapere se trovi errori ;)
codice:#include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> //Mantiene le frequenze delle lettere int freqLettere['z' - 'a']; //Mantiene le frequenze dei numeri int freqNumeri[10]; //Mantiene il numero totale di caratteri trovati nel testo //(lettere e numeri) int totaleCaratteri = 0; //Mantiene il numero totale di parole trovate nel testo int totaleParole = 0; //Definizione dell'elemento di una lista typedef struct lista{ char *parola; int frequenza; lista *next; } lista; //Variabile che mantiene le lista di parole lista *parole = NULL; //Inizializza a zero i vettori delle frequenze void inizializza(){ int i; for(i = 0; i < 10; i++) freqNumeri[i] = 0; for(i = 0; i < ('z' - 'a'); i++) freqLettere[i] = 0; } //Aggiorna le frequenze di lettere e numeri void aggiornaFrequenze(char *parola){ int i; char c; int len = strlen(parola); for(i = 0; i < len; i++){ c = parola[i]; //Se è una lettera if(isalpha(c)){ //rendiamo tutte le lettere minuscole c = tolower(c); //incrementiamo la posizione corrispondente di freqLettere freqLettere[c - 'a']++; } //Se è un numero if(isdigit(c)){ //incrementiamo la posizione corrispondente di freqLettere freqNumeri[c - '0']++; } } //Incremento il numero di parole totali totaleParole++; //Incremento il numero di caratteri totali totaleCaratteri = totaleCaratteri + len; } //Restituisce la prossima parola che si trova in testo a partire //dalla posizione posizioneCorrente. Una parola è definita come //una sequenza di lettere e/o numeri senza altri caratteri. //Restituisce NULL se non c'è una prossima parola char *prossimaParola(char *testo){ static int posizioneCorrente = 0; int i; int len = strlen(testo); //mi sposto avanti finche non trovo una lettera o un numero while(! isalnum(testo[posizioneCorrente])){ posizioneCorrente++; //se iuno alla fine senza aver trovato lettere o numeri //ritorno null if(posizioneCorrente >= len) return NULL; } //incremento i finchè trovo numeri e lettere; alla fine del cilco //i punta alla fine della parola corrente i = posizioneCorrente; while(isalnum(testo[i]) && (i < len)) i++; int lunghezza = i - posizioneCorrente; char *parola = (char *)malloc((lunghezza + 1)); for(i = 0; i <= lunghezza; i++) parola[i] = testo[posizioneCorrente + i]; //Inserisco il carattere di fine stringa alla fine della parola parola[lunghezza] = '\0'; posizioneCorrente = posizioneCorrente + i; return parola; } void stampaNumeri(){ printf("\n\n"); int i; for(i = 0; i < 10; i++) printf("\nfrequenza di %d: %d", i, freqNumeri[i]); } void stampaLettere(){ printf("\n\n"); int i; for(i = 0; i < ('z' - 'a'); i++) printf("\nfrequenza di %c: %d", 'a' + i, freqLettere[i]); } void stampaParole(){ printf("\n\n"); lista *temp = parole; while(temp){ printf("\nfrequenza di %s: %d", temp -> parola, temp -> frequenza); temp = temp -> next; } } //Inserisce la parola nella lista parole, se non è gia presente, //altrimenti incrementa la sua frequenza void inserisciParola(char *parola){ lista *temp = parole; //Scorriamo la lista per vedere se la parola è ia stata inserita while(temp){ //Se la parola già c'è ci limitiamo a incrementare //la frequenza if(strcmp(temp -> parola, parola) == 0){ temp -> frequenza++; return; } temp = temp -> next; } //Se la parola non è stata trovata, creiamo un nuovo elemento //che sarà inserito in testa alla lista. temp = (lista *)malloc(sizeof(lista)); temp -> parola = parola; temp -> frequenza = 1; temp -> next = parole; //Facciamo puntare la lista 'parole' all'elemento di testa //appena isnerito parole = temp; } int main(){ char * p; char *testo = "ciao\tt\n1r&7 (re)re t"; while((p = prossimaParola(testo))){ aggiornaFrequenze(p); inserisciParola(p); } stampaNumeri(); stampaLettere(); stampaParole(); printf("\n\nTotale parole: %d", totaleParole); printf("\n\nTotale caratteri: %d", totaleCaratteri); return 0; }

Rispondi quotando