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