Codice PHP:
#include <stdio.h>
#define SIZE 20
#define MAX 10
#define MIN 0
long InputInt(int mi, int ma);
int MinValue(int array[],int length,int min);
void SortArray (int sorted[],int length);
float CalcMedia(int array[], int length);
int Max(int array[],int length);
int Frequenza(int array[],int length,int max);
float CalcMediana(int array[], int length);
main() {
int var,count,i,moda,max;
int array[count],sorted[count];
count=0;
float media,mediana;
i=0;
do {
printf("Scrivi l'array n.%d immetti 0 per concludere l'immissione.\n",i);
var=InputInt(MIN,MAX);
if (var!=0) {
array[i]=var;
count++;
}
i++;
}
while (i<SIZE && var!=0) ;
for (i=0;i<count;i++) {
sorted[i]=array[i];
}
SortArray(sorted,count);
for (i=0;i<count;i++) {
printf("array ordinato n.%d => %d\n",i,sorted[i]);
}
media=CalcMedia(array,count);
printf("La media e\' => %2f\n",media);
mediana=CalcMediana(sorted,count);
printf("La mediana e\' => %4f\n",mediana);
max=Max(array,count);
moda=Frequenza(array,count,max);
printf("La moda e\' => %4d\n",moda);
system("PAUSE");
}
/*Funzione per il calcolo della mediana. Prende come attributi l'array immesso.
Per calcolare la mediana valuta prima (attraverso il modulo di length) se il numero
è pari o dispari; se è pari, prende i due valori intermedi, li somma e divide per
due; se è dispari prende il valore del valore mediano.*/
float CalcMediana(int array[], int length) {
float mediana;
if (length%2==0) {
mediana=((float)array[length/2-1]+(float)array[length/2])/2;
} else {
mediana=array[length/2];
}
return mediana;
}
/*Funzione per il calcolo della moda. Il valore con maggiore frequenza viene
restituito dalla funzione. Per calcolare tale valore si avvale della funzione
max che permette la creazione di un array con chiave max (rappresenta il voto
massimo) quindi se il voto massimo è 8, l'array avrà lunghezza 0-8 (per fare ciò
bisogna aggiungere 1 a max)..*/
int Frequenza(int array[],int length,int max) {
int j,maxvalue,store;
int frequency[max+1];
for (j=0;j<max+1;j++)
/*Questo ciclo si occupa di settare tutti i valori
dell'array creato a 0.*/ {
frequency[j]=0;
}
for (j=0;j<length;j++)
/*Questo ciclo scansiona l'array e aggiunge 1 all'array
frequenza alla chiave del valore riscontrato.*/ {
frequency[array[j]]++;
}
maxvalue=0;
/*Questa variabile viene settata a zero e si occuperà di
valutare quale elemento dell'array avrà la maggiore frequenza
attraverso il ciclo for successivo.*/
for (j=1;j<max+1;j++) {
if (frequency[j]>maxvalue) {
maxvalue=frequency[j];
store=j;
/*Viene storata la key dell'elemento dell'array con valore massimo
ad esempio se maxvalue è 3 e la chiave è 6 significa che il valore
dell'array 6 è frequente 3 volte.*/
}
}
return store;
}
/*La funzione si occupa semplicemente di trovare il valore massimo, in maniera tale da settare
l'array per il calcolo della moda al valore massimo. Si avvale di una variabile max inizializzata
a zero che cambia ogni volta che il ciclo rileva un valore superiore.*/
int Max(int array[],int length) {
int i;
int max;
max=0;
for (i=0;i<length;i++) {
if (array[i]>max) {
max=array[i];
}
}
return max;
}
/*Funzione che calcola la media; setta una variabile somma a 0, somma tutti i valori
dell'array (ciclo for) e divide il risultato per la lunghezza. Siccome la media è un
valore float, si usa il casting delle variabili somma e length.*/
float CalcMedia(int array[], int length) {
int i;
int somma=0;
float media;
for (i=0;i<length;i++) {
somma+=array[i];
}
media=(float)somma/(float)length;
return media;
}
/*Funzione per l'ordinamento dell'array per il calcolo della mediana. Crea una
copia dell'array immesso; il ciclo for controlla che il valore scandagliato sia
quello minore di tutti attraverso l'interrogazione della funzione MinValue. Il secondo
ciclo for copia nuovamente l'array che era stato modificato dalla funzione MinValue.
La copia dell'array viene distrutta (compare solo nella funzione).*/
void SortArray (int array[],int length) {
int i;
int copy[length];
for (i=0;i<length;i++) {
copy[i]=MinValue(array,20,MAX+1);
}
for (i=0;i<length;i++) {
array[i]=copy[i];
}
}
/*La funzione scandaglia l'array immesso e trova il valore minore; lo preleva e
setta la chiave del valore in questione a 0; ritorna il valore min. alla funzione
chiamante.*/
int MinValue(int array[],int length,int min) {
int i,key;
for (i=0;i<length;i++) {
if (array[i]<=min && array[i]!=0) {
min=array[i];
key=i;
}
}
array[key]=0;
return min;
}
/********************************************************************
* InputInt: input di int compreso tra mi e ma, ritorna il valore
* introdotto, ripete l'input se il valore non e' valido.
********************************************************************/
long InputInt(int mi, int ma) {
int num;
/*numero introdotto*/
int risulta;
/*risultato della scanf*/
int valido;
/*flag di numero valido*/
do {
risulta = scanf("%d",&num);
/*legge numero*/
if (risulta != EOF) {
/*ripulisce se non EOF*/
while (getchar() != '\n')
;
}
valido = (risulta == 1 && num >= mi
&& num <= ma);
/*controlla se ok*/
if (! valido) {
/*segnala errore*/
printf("Devi introdurre un numero intero"
" compreso tra %ld e %ld: \a",mi,ma);
}
}
while (! valido);
/*ripete se non ok*/
return num;
/*ritorna valore*/
}