/* * Esame Informatica 21/1/2004 * * Memoria necessaria: * - occorre registrare almeno il conteggio delle frequenze di ogni modalita', * da aggiornare dopo ogni lettura di osservazione; array di N elementi omogenei (interi) * - per il passaggio alle frequenze relative occorre contare le osservazioni, con un * singolo contatore * La condizione di terminazione determinata dal confronto fra la frequenza minima e un * valore di soglia assegnato. Il ciclo di lettura dovra' essere eseguito almeno una volta, per poter * valutare la condizione di terminazione. * * Algoritmo: * - inizializza i contatori delle frequenze a zero * - ripeti finche' la condizione di terminazione non soddisfatta * - sollecita l'inserimento di una osservazione e leggi l'osservazione * - aggiorna la frequenza assoluta della modalita' osservata * - cerca la frequenza assoluta minima fra le varie modalita' * - calcola le grandezze per valutare la condizione di terminazione * - fine ripetizione * - per ogni modalita' * - visualizza la modalita' e le frequenze richieste * La ricerca della frequenza minima puo' essere fatta con una funzione che cerca la posizione * del minimo in un array di interi * */ #include <stdio.h> #define N 4 int cercaMin(int *a, int n); // main: int main() { int freq[N]; // array frequenze assolute, la frequenza della modalita' 1 andra' in posizione 0 int i, // indice per le modalita' x, // osservazione letta in input cont=0, // contatore osservazioni lette, inizializzato a 0 posFreqMin; // modalita' a frequenza minima float cum=0, // frequenza cumulata freqMin, // frequenza relativa minima, ricalcolata a ogni lettura soglia; // soglia per valutare la condizione di terminazione for (i=0; i<N; i++) freq[i]=0; // inizializza freq soglia = (float)1/2/N; printf("soglia %f\n",soglia); do { // ciclo da eseguire almeno una volta printf("Inserire osservazione "); scanf("%d", &x); freq[x-1]++; cont++; posFreqMin = cercaMin(freq,N); freqMin = (float)freq[posFreqMin]/cont; // aggiorna per confronto con soglia } while (freqMin<=soglia); // while: termina quando la // frequenza minima supera la soglia for (i=0; i<N; i++) // visualizza frequenze printf("Modalita' %d: freq assoluta %d freq relativa %f freq cumulata %f\n", i+1, freq[i], (float)freq[i]/cont, cum+=(float)freq[i]/cont); return 0; } // main // cercaMin: restituisce la posizione del minimo in un array di n interi int cercaMin(int *a, int n){ int i, pm; // posizione del minimo pm=0; // provvisoriamente prendo il primo for (i=1;i<n;i++) if (a[i]<a[pm]) pm=i; return pm; } // cercaMin