/* quesito a */
/* Memoria: e' necessario un contatore per ogni possibile
coppia di valori (t,s), quindi occorre un array a
due dimensioni, una per titolo di studio e una per
stato civile
Algoritmo:
- inizializza l'array di contatori a zero
- inizializza un contatore a zero (servira per il quesito c)
- ripeti finche' c'e' input
- leggi la coppia di osservazioni ossT e ossS,
controllando che siano entro l'intervallo previsto 0..NT-1 e 1..NS
- incrementa il contatore individuato dalla coppia ossT,ossS-1,
ricordando che per quanto riguarda s e' necessario
"traslare" di una unita', il valore che si
riferisce a s=1 verra' memorizzato in posizione 0
- visualizza l'intero contenuto dell'array, premettendo a ciascuna frequenza rilevata
i valori di t e s; per quanto riguarda s visualizzare il valore incrementato di 1, per
compensare la traslazione effettuata nella posizione di memorizzazione
*/
#include <stdio.h>
#include <stdlib.h>
#define NT 6
#define NS 4
#define FN "dati.txt"
#define ERRORE -1
int main (int argc, const char * argv[]) {
int contaCoppie[NT][NS];
int i,j, /* contatori */
conta, /* conta numero letture valide */
t,s, /* totalizzatori */
cMaxT,cMaxS, /* posizioni del massimo */
ossT, ossS; /* osservazioni per t ed s */
FILE *fin, *fout;
fout=stdout;
if ((fin=fopen(FN, "r"))==NULL){
fprintf(fout,"Impossibile aprire %s in lettura\n");
return ERRORE;
}
for (i=0;i<NT;i++) /* inizializzazione */
for (j=0;j<NS;j++)
contaCoppie[i][j]=0;
conta=0;
while(fscanf(fin, "%d %d",&ossT,&ossS)==2) { /* acquisizione dati */
if (ossT<0 || NT<=ossT || ossS<1 || NS<ossS)
fprintf(fout,"Dati errati: %d %d\n",ossT, ossS);
else
{
contaCoppie[ossT][ossS-1]++; /* ossS va decrementato perche' parte da 1 */
conta++; /* se la lettura e' valida la conteggia */
}
}
/* il numero totale di letture e' in conta */
/* quesito a */
for (i=0;i<NT;i++)
for (j=0;j<NS;j++)
if (contaCoppie[i][j]!=0)
fprintf(fout,
"Titolo studio:%d - Stato civile:%d - Frequenza:%f\n",
i,j+1,(float)contaCoppie[i][j]/conta);
/* j va incrementato, perche' in posizione 0
e' memorizzato il valore per s=1 */
/* quesito b */
/* E' possibile ottenere il risultato a partire dall'array
delle frequenze di coppie ottenuto per il quesito a.
In questo caso e sufficiente fare la somma di tutti i valori
di s per ogni t, calcolando la frequenza assoluta del valore
di t, e poi quella relativa. Con questa soluzione occorre
introdurre solo un totalizzatore, oltre al contatore di
osservazioni
Algoritmo:
- per ogni valore i di titolo di studio da 0 a NT-1
- azzera il totalizzatore
- per ogni posizione j di stato civile da 0 a NS-1
- aggiungi la frequenza assoluta della coppia i,j al totalizzatore
- visualizza i e la frequenza relativa
*/
for (i=0;i<NT;i++){
t=0; /* per ogni valore di i occorre sommare le frequenze assolute dei vari j */
for (j=0;j<NS;j++)
t+=contaCoppie[i][j];
fprintf(fout,"Titolo di studio %d - Frequenza relativa %lf\n",i,(double)t/conta);
/* t e conta sono interi, ma la frequenza relativa deve essere con i decimali
* quindi occorre il type cast (double)
*/
}
/* quesito c */
/* Memoria: vanno memorizzate tutte le frequenze assolute
usate per il quesito a, in piu' occorre la posizione
della frequenza massima, individuata da una coppia di indici
Algoritmo:
- assumi 0,0 come posizione del massimo corrente
- per tutte le posizioni i di titolo di studio, da 0 a NT-1
- per tutte le posizioni j di stato civile da 0 a NS-1
- se la frequenza in posizione i,j e' piu' grande di quella
nel massimo corrente aggiorna la coppia di indici del massimo corrente a i,j
- visualizza gli indici del massimo (incrementando di 1 quello di stato civile) e la
frequenza assoluta
*/
cMaxT=0;cMaxS=0;
for (i=0;i<NT;i++)
for (j=0;j<NS;j++)
if (contaCoppie[i][j]>contaCoppie[cMaxT][cMaxS]){
cMaxT=i;
cMaxS=j;
}
fprintf(fout,"Frequenza massima %d\n",contaCoppie[cMaxT][cMaxS]);
fprintf(fout,"Verificata per le coppie:\n");
for (i=0;i<NT;i++)
for (j=0;j<NS;j++)
if (contaCoppie[i][j]==contaCoppie[cMaxT][cMaxS])
fprintf(fout,"Titolo studio:%d - Stato civile:%d\n",i,j+1);
/* j va incrementato perche' la modalita' parte da 1 */
return 0;
}