/*
 * 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