- Alcuni semplici codici per visualizzare e analizzare i dati raccolti in un tipico esperimento del laboratorio di fisica (esperimento di Millikan e misura del rapporto q/m per l'elettrone)
- Un esercizio sull'utilizzo di contenitori e algoritmi della STL (cammino minimo)
- Uno scheletro di codice per l'analisi dei dati pubblicati dall'ISTAT (analisi dei decessi da gennaio 2020 nei comuni e provincie italiani)
Questi esercizi sono pensati per darvi degli spunti di possibili applicazioni concrete degli strumenti che abbiamo sviluppato. A partire
da questi semplici esempi proposti potete poi ampliare e migliorare le funzionalità del vostro codice.
Le stringhe:
Per rappresentare "parole" in C++ possiamo usare un array di char dal C : char myWord[10]
Il C++ infatti non possiede un vero e proprio tipo specifico per trattare le sequenze di caratteri. Tuttavia
le librerie standard del C++ forniscono la classe string, (#include ) che evita tutte le problematiche di allocazione
dei buffer (un po' come il vector risolve i problemi di allocazione della memoria). La stringa e' considerata
internamente come un semplice array di caratteri terminata da un carattere NULL (\o). La classe string include
una serie di metodi utili per semplificare le operazioni.
- Esempio di funzionalità base delle string qui .
- Esempio di parsing di input con la classe stringdtream qui .
Per una referenza più completa sulle string guardare qui .
|
ESERCIZIO
4.0 - Misura del rapporto q/m per l'elettrone (tipo : analisi dati):
Un esperimento molto interessante che si svolge nel laboratorio di fisica riguarda la misura del rapporto tra la carica e la massa di un elettrone. Un fascio di
elettroni di energia nota (determinata dal potenziale 2ΔV applicato ai capi di un condensatore) viene deflesso da un campo magnetico opportunamente generato. Dalla misura del raggio di deflessione r si può ricavare una stima del rapporto q/m.
La misura in laboratorio è piuttosto complessa ( in particolare lo studio delle sistematiche sperimentali ) ma il rapporto q/m può essere determinato
sfruttando la relazione
(rB)2 = (m/q) 2ΔV
come il coefficiente angolare della relazione. Nel file di dati sono riportate le misure prese in laboratorio: nella prima colonna il valore di 2ΔV, nella seconda colonna il valore di (rB)2 e nella terza l'errore sulla determinazione di (rB)2. Provate a scrivere un codice che pemetta di visualizzare i dati raccolti e determinare il rapporto q/m ( in questo caso l'oggetto di ROOT più indicato è il TGraphErrors. Se non ci riuscite potete prendere ispirazione dal questo codice:
- Il file di dati lo potete trovare qui.
- Il file di codice lo potete trovare qui.
ESERCIZIO
4.1 - Misura della carica dell'elettrone (tipo : anslisi dati):
La carica dell'elettrone è stata misurata per la prima volta nel 1909 in uno storico esperimento dal fisico statunitense Robert Millikan. Questo esperimento
si effettua anche nel laboratorio di fisica e consiste nel misurare la velocità di caduta o risalita di goccioline d'olio elettrizzate per strofinio in una
regione con campo elettrico regolabile. Nel file di dati sono riportare le misure di carica elettrica (Qi) per un certo numero di goccioline osservate. Il valore della
carica può essere determinato come il minimo della funzione
S(q)=Σ[(Qi/ki)-q]2
dove ki è il numero intero più vicino al rapporto Qi/q. Provate a scrivere un codice per rappresentare la funzione S(q) e determinare il valore
della carica dell'elettrone. Se non ci riuscite provare prendere ispirazione da questo codice:
- Il file di dati lo potete trovare qui.
- Il file di codice lo potete trovare qui.
ESERCIZIO
4.2 - Determinazione del cammino minimo (tipo : approfondimento uso STL) :
In questo esercizio possiamo provare ad approfondire l'uso di contenitori e algoritmi della STL. Proviamo ad affrontare questo problema: dato un set di punti nel piano cerchiamo il percorso che ci permette ( partendo dall'origine ) di toccare tutti i punti percorrendo la minor distanza possibile. Le coordinate dei punti si trovano in un file. Eventualmente cercate di produrre un grafico del percorso effettuato. In caso potete prendere qualche spunto dal codice linkato qui sotto ( nel codice si può anche trovare un esempio di overloading di operator<< utile per semplificare la lettura da file ) :
- Il file di dati lo potete trovare qui.
- Il file di codice lo potete trovare qui .
ESERCIZIO
4.3 - Studio dati relativi a decessi in Italia nel 2020 (tipo : approfondimento uso STL e analisi dati) :
In questo esercizio proviamo ad utilizzare le classi, i contenitori e gli algoritmi imparati nelle prime tre lezioni per affrontare una analisi dati leggermente più realistica. Per fare questo cerchiamo di analizzare i dati dei decessi mensili per comune italiano da gennaio 2020 a maggio 2020 confrontandoli con la media degli anno 2015-2019 ( fonte Istituto Nazionale di Statistica (ISTAT ).
Scopo dell'esercizio è quello di estrarre dai dati ISTAT l'andamento del rapporto dei decessi da gennaio 2020 a maggio 2020 rapportato alla media degli ultimi quattro anni per una provincia italiana a scelta. Ovviamente questo è solo un esempio delle informazioni che possiamo estrarre da questi dati. Notate inoltre che il sito dell'ISTAT fornisce una sterminata quantità di dati su svariati aspetti della società italiana. Saper analizzare in modo sensato i dati è fondamentale nella nostra preparazione.
1) Il file di input:
Il file di input è scritto in formato csv ( comma separated value ), un file di testo in cui i vari campi sono separati da una virgola. La struttura del file è la seguente:
Come si può notare ogni comune è rappresentato da una riga nel file e le informazioni relative ad un certo comune sono riportate nelle varie colonne. Sono riportati la regione di appartenenza del comune, la provincia, il comune e il numero di decessi medi degli ultimi quattro anno per mese seguiti dal numero di decessi nel primi cinque mesi del 2020. Possiamo poi cercare i comuni italiani in cui il totale dei decessi nei primi cinque mesi del 2020 rispetto alla media degli ultimi quattro anno è risultato più elevato.
2) La classe comune:
Per immagazzinare in modo efficiente i dati presenti nel file di input potremmo pensare di costruire una classe comune che possa essere utilizzata per contenere tutte le informazioni relative ad un certo comune italiano.
3) Le funzioni :
come nelle lezioni precedenti codifichiamo le funzioni necessarie in un file dedicato (funzioni.h ed eventualmente funzioni.cxx).
Potremmo pensare
- Una funzione che accetta un file in input e restituisce un vector di comuni;
- Una funzione che accetta in input il vettore di comuni, il nome della provincia e restituisca l'andamento dei decessi relativo alla media degli ultimi quattro anni.
- Una funzione che accetta in input il vettore di comuni e scrive a video le informazioni principali desiderate.
4) Il file principale :
nel main utilizziamo la classe comune, le funzioni, contenitori e algoritmi della STL. Il main potrà contenere :
- Una chiamata alla funzione ReadFromFile per caricare tutti i dati in modo organizzato dentro un vector di comune.
- Una chiamata alla funzione GroupByProvincia che accetta in input in vettore dei comuni e il nome di una provincia e
restituisce l'andamento dei decessi relativo alla media degli ultimi quattro anni.
- Utilizzo delle funzionalità della STL e dei suoi contenitori per cercare il comune italiano più con l'incremento più elevato
di decessi nel 2020.
Il file di dati e uno scheletro di codice lo potete trovare qui sotto
- Il file di dati lo potete trovare qui.
- L'header file della classe comune lo potete trovare qui.
- L'header file delle funzioni lo potete trovare qui.
- Un esempio di main lo potete trovare qui.
Il namespace:
A volte può capitare di voler avere due funzioni con lo stesso nome ma che facciano cose diverse. In questo caso il
compilatore si lamenterebbe perchè non riuscirebbe a decidere quale delle due funzioni utilizzare.
Il namespace è pensato per risolvere questa limitazione e permettere d di differenziare variabili, classi e funzioni simili mantenendo lo stesso nome ma pensandole come parte di una libreria diversa. Con il namespace potete costruire uno scope in cui le vostre funzioni sono definite e invocare quella desiderata utilizzando l'operatore di scope "::".
- Esempio di definizione di variabili e funzioni mediante un namespace si può trovare qui .
Per una referenza più completa sul namespace guardare qui .
|
Il contenitore map della STL:
Il contenitore map è un contenitore associativo che realizza un dizionario di coppie chiave-valore, ottimizzato per la ricerca sulla
chiave. È implementato con un albero binario di ricerca ordinato sulle chiavi. Ogni nodo contiene una coppia chiave-valore. Non ci sono ripetizioni sulle chiavi.
I dati sono memorizzati in modo ordinato ( secondo la chiave ). Per questo motivo la ricerca di un elemento tramite chiave è rapido, proporzionale a log(n).
Inserimento e cancellazione di elementi può avvenire in qualsiasi punto della mappa e sono veloci ( non richiedono lo spostamento di dati ). Non supportano però
accesso random e pertanto non posso utilizzare direttamente per es. la funzione sort().
- Esempio di utilizzo di un contenitore map si può trovare qui .
Per una referenza più completa sul contenitore map guardare qui .
|
|