Esercizio Vogliamo scrivere delle funzioni che ci permettano di estrarre delle informazioni statistiche da un vettore (array) di dati: Media e deviazione standard Mediana Vogliamo poi provare l utilizzo di tali funzioni
File sorgente per le funzioni statistiche Creiamo un file.cpp in cui scriveremo le funzioni richieste: chiamiamolo ad es. stats.cpp, e includiamo le intestazioni delle librerie I/O standard di C++, le <iostream> #include <iostream> using namespace std;
File stats.cpp #include <iostream> using namespace std;
Funzione per calcolare media e deviazione standard Definisco il momento di ordine k di una serie di N dati [x 1,...,x N ] la quantità M k 1 N x k i N i = 1 = In tale maniera la media è M 1 mentre la varianza (il quadrato della deviazione standard) è M 2 -M 1 2
Funzione per calcolare media e deviazione standard: parametri di ingresso Per prima cosa pensiamo che la funzione deve agire sui dati di un vettore, che deve essere uno dei parametri di ingresso La dimensione del vettore deve essere anch esso un parametro di ingresso Dal momento che si vuole restituire media E deviazione standard, è necessario prevedere un modo per salvare due risultati: le variabili dove i risultati verranno scritti saranno due variabili passate per riferimento (e quindi modificabili) alla funzione
Funzione per calcolare media e deviazione standard Nel file stats.cpp possiamo cominciare a scrivere la funzione: tipo di dato restituito dalla funzione nome della funzione Parametri passati per riferimento dove salverò i risultati int MediaStD(double *vettore, int dimensione, double &media, double &std) return 0; La funzione per ora non fa nulla e restituisce il valore 0
File stats.cpp #include <iostream> using namespace std; int MediaStD(double *vettore, int dimensione, double &media, double &std) return 0;
Funzione per calcolare media e deviazione standard Scriviamo il corpo della funzione: int MediaStD(double *vettore, int dimensione, double &media, double &std) int i; double M1, M2; M1=0; M2=0; for (i=0; i<dimensione; i++) M1=M1+vettore[i]; M2=M2+vettore[i]*vettore[i]; M1=M1/dimensione; M2=M2/dimensione; media = M1; std=sqrt(m2-m1*m1); return 0; Inizializzo i valori di M1 ed M2 a zero Calcolo i momenti di ordine 1 e 2 dei dati La funzione radice quadrata (sqrt), è definita nelle librerie matematiche del C++. Per utilizzarla devo includere i prototipi contenuti in <cmath>
File stats.cpp #include <iostream> #include <cmath> using namespace std; int MediaStD(double *vettore, int dimensione, double &media, double &std) int i; double M1, M2; M1=0; M2=0; for (i=0; i<dimensione; i++) M1=M1+vettore[i]; M2=M2+vettore[i]*vettore[i]; M1=M1/dimensione; M2=M2/dimensione; media = M1; std=sqrt(m2-m1*m1); return 0;
File di intestazione per le funzioni statistiche Creiamo ora un file.h che contenga i prototipi delle funzioni che sono presenti nel file stats.cpp, in modo da poterle utilizzare nel programma principale
File stats.h #include <iostream> #include <cmath> int MediaStD(double *vettore, int dimensione, double &media, double &std);
File sorgente del programma principale Creiamo un file.cpp in cui scriveremo il programma principale per provare le funzioni statistiche: chiamiamolo ad es. principale.cpp, e includiamo le intestazioni delle librerie I/O standard di C++, le <iostream>
File principale.cpp #include <iostream> using namespace std; int main() return 0; La funzione per ora non fa nulla e restituisce il valore 0
Programma principale Vorremmo fare in modo di: Chiedere all utente la dimensione del vettore Far inserire i dati nel vettore dall utente Calcolare media e deviazione standard con la funzione scritta Visualizzare a schermo i risultati
File principale.cpp #include <iostream> #include <new> using namespace std; Creo un vettore di dimensione opportuna allocando dinamicamente la memoria con l operatore new, il cui prototipo è contento in <new> int main() int dimensione; double *vettore; cout<< Inserisci la dimensione del vettore \n ; cin >> dimensione; vettore = new double[dimensione]; delete [] vettore; return 0; Appena alloco l array, scrivo anche l istruzione per la sua cancellazione prima dell uscita dal programma
File principale.cpp #include <iostream> #include <new> using namespace std; int main() int dimensione,i; double *vettore; cout<< Inserisci la dimensione del vettore \n ; cin >> dimensione; vettore = new double[dimensione]; for(i=0;i<dimensione;i++) cout<< Inserisci un dato: ; cin >> vettore[i]; delete [] vettore; return 0; Riempio l array con dati inseriti dall utente
File principale.cpp #include <iostream> #include <new> #include stats.h using namespace std; int main() int dimensione,i; double *vettore; double media, std; Per utilizzare la funzione che calcola media e deviazione standard devo includere il file di intestazione che contiene il suo prototipo cout<< Inserisci la dimensione del vettore \n ; cin >> dimensione; vettore = new double[dimensione]; for(i=0;i<dimensione;i++) cout<< Inserisci un dato: ; cin >> vettore[i]; Calcolo media e std e visualizzo i loro valori a video MediaStD(vettore,dimensione,media,std); cout << La media dei dati inseriti e << media << \n ; cout << La deviazione standard dei dati inseriti e << std << \n ; delete [] vettore; return 0;
Compilazione A questo punto bisogna compilare il codice del programma principale ed il codice della funzione MediaStd: >> g++ principale.cpp stats.cpp o prova >> Se tutto è corretto non dovrei avere errori, che altrimenti vanno individuati e corretti, e sono pronto a provare il programma
Funzione per calcolare la mediana La mediana è il dato per cui metà dei valori nell array gli sono inferiori e metà superiori. Può essere calcolata in modo semplice prendendo il valore che sta nella posizione centrale di un array ordinato Per calcolare la mediana di un array di dimensione N bisogna dunque: 1. Ordinare l array 2. Individuare la posizione centrale dell array ordinato e prenderne il valore
Funzione per ordinare un vettore Per prima cosa pensiamo che la funzione deve agire sui dati di un vettore, che deve essere uno dei parametri di ingresso La dimensione del vettore deve essere anch esso un parametro di ingresso
File stats.cpp #include <iostream> #include <cmath> using namespace std; int MediaStD(double *vettore, int dimensione, double &media, double &std)... int Ordina(double *vettore, int dimensione) int i,j; double tmp; Utilizzo BubbleSort per ordinare un vettore for (i=1;i<dimensione;i++) for(j=dimensione-1;j>i;j--) if(vettore[j-1]>vettore[j]) tmp=vettore[j-1]; vettore[j-1]=vettore[j]; vettore[j]=tmp; return 0;
File stats.h #include <iostream> #include <cmath> int MediaStD(double *vettore, int dimensione, double &media, double &std); int Ordina(double *vettore, int dimensione);
Funzione per calcolare la mediana di un vettore La funzione ha bisogno di un vettore e della sua dimensione come parametri di ingresso Deve restituire il valore mediano del vettore che è un double
File stats.cpp #include <iostream> #include <cmath> #include stats.h using namespace std; La funzione Mediana ha bisogno della funzione di ordinamento. Il suo prototipo si trova in stats.h, cha va dunque incluso int MediaStD(double *vettore, int dimensione, double &media, double &std)... int Ordina(double *vettore, int dimensione)... double Mediana(double *vettore, int dimensione) int centro; Ordina(vettore,dimensione); centro=dimensione/2; Calcolo della mediana: ordinamento dell array e restituzione del valore centrale return vettore[centro];
File stats.h #include <iostream> #include <cmath> int MediaStD(double *vettore, int dimensione, double &media, double &std); int Ordina(double *vettore, int dimensione); double Mediana(double *vettore, int dimensione);
File principale.cpp #include <iostream> #include <new> #include stats.h using namespace std; int main() int dimensione,i; double *vettore; double media, std, mediana; Calcolo della mediana e sua visualizzazione a video cout<< Inserisci la dimensione del vettore \n ; cin >> dimensione; vettore = new double[dimensione]; for(i=0;i<dimensione;i++) cout<< Inserisci un dato: ; cin >> vettore[i]; MediaStD(vettore,dimensione,media,std); cout << La media dei dati inseriti e << media << \n ; cout << La deviazione standard dei dati inseriti e << std << \n ; mediana=mediana(vettore,dimensione); cout << La mediana dei dati inseriti e << mediana << \n ; delete [] vettore; return 0;
Compilazione Perchè le modifiche al codice siano attuate, bisogna ri-compilare i due files che contengono il codice C++: >> g++ principale.cpp stats.cpp o prova >> Se tutto è corretto non dovrei avere errori, che altrimenti vanno individuati e corretti, e sono pronto a provare il programma
Esercizio 1 Provare ad aggiungere la funzione statistica che calcola il p-esimo valore percentile di un array. Se N è il numero di elementi di un array, il suo p- esimo percentile è l elemento che sta nella posizione p*n/100, con p variabile da 1 a 100. Da notare che il 50-esimo percentile corrisponde alla mediana
Esercizio 2 Aggiungere la funione statistica che calcoli il il momento centrale di ordine k di una serie di N dati [x 1,...,x N ] : N 1 m = ( x M ) k i 1 N i = 1 k In cui M 1 è la media dei dati