#include <stdio.h> #include <string.h> #define DIMSTR 16 #define MAXDIM 10 typedef char Stringa[DIMSTR]; typedef struct { Stringa s; int freq; } modalita; /* definizioni per trattaConteggio */ #define INSERITO 1 #define nonINSERITO 0 int trattaConteggio(modalita *am, int *nMod, Stringa s); /* fine definizioni per trattaConteggio */ /* definizioni per maxFreq */ void maxFreq(modalita *am, int nMod, modalita *modMaxFreq, int *nModMax); /* fine definizioni per maxFreq */ /* Esercizio su array e strutture * acquisisce da input un insieme di rilevazioni di un carattere * per ciascuna modalita' calcola la frequenza e poi visualizza * le modalita' a frequenza massima */ /* main */ int main(){ #define TERM "." /* terminatore delle rilevazioni */ modalita freqComuni[MAXDIM]; int nc=0; /* numero di comuni distinti rilevati */ modalita comuniMaxFreq[MAXDIM]; int ncMax; /* numero di comuni con frequenza massima: verra' * inizializzato in una procedura */ int i; Stringa s; printf("Inserire un comune "); scanf("%s",s); while (strcmp(s,TERM)) { /* acquisisce e tratta un comune */ if (trattaConteggio(freqComuni, &nc, s)==nonINSERITO) printf("Comune %s non trattato per array pieno", s); printf("Inserire un comune (<.> per terminare) "); scanf("%s",s); } for (i=0;i<nc;i++) /* visualizza frequenze assolute */ printf("Comune: %s\t - frequenza: %d\n", freqComuni[i].s, freqComuni[i].freq); maxFreq(freqComuni,nc,comuniMaxFreq,&ncMax); printf("\n\nComuni a frequenza massima %d\n",comuniMaxFreq[0].freq); for (i=0;i<ncMax;i++) printf("%s\n", comuniMaxFreq[i].s); printf("Fine lavoro, premere un tasto"); i=getchar(); return 0; } /* main */ /* trattaConteggio * aggiorna il conteggio di frequenze assolute nell'array di * modalita' am trattando la stringa s * se s non era ancora apparsa incrementa *nMod e la inserisce * in coda all'array con conteggio 1, altrimenti incrementa il conteggio * restituisce nonINSERITO in caso di insuccesso per array pieno * INSERITO in caso di successo */ int trattaConteggio(modalita *am, int *nMod, Stringa s){ int i=0; int nonTrovato=1; while (nonTrovato && i<*nMod) { nonTrovato = strcmp(s,am[i].s); i++; } if (nonTrovato) /* non trovato: devo inserire nuovo */ if (*nMod<MAXDIM) { /* array non pieno: posso inserire */ strcpy(am[*nMod].s,s); am[*nMod].freq=1; (*nMod)++; return INSERITO; } else return nonINSERITO; /* array pieno: non posso inserire */ else { /* trovato: incremento conteggio */ am[i-1].freq++; return INSERITO; } } /* trattaConteggio */ void maxFreq(modalita *am, /* array di modalita' */ int nMod, /* numero di modalita' distinte trovate */ modalita *modMaxFreq, /* array di modalita' * a frequenza massima */ int *nModMax /* numero di modalita' con frequenza * massima */ ){ int i; /* contatore */ modMaxFreq[0] = am[0]; /* il primo massimo va al primo posto * massimo provvisorio */ for (i=1; i<nMod; i++) if (am[i].freq>modMaxFreq[0].freq) modMaxFreq[0] = am[i]; /* aggiorna massimo provvisorio * e' il massimo fra quelli incontrati * finora */ *nModMax = 0; for (i=0; i<nMod; i++) if (am[i].freq==modMaxFreq[0].freq) { modMaxFreq[*nModMax] = am[i]; (*nModMax)++; } } /* maxFreq */