Stazione di monitoraggio 3
..:: Versione con numero di righe riportate nel file ::..
Un dispositivo di rilevazione misura diversi parametri ambientali per mezzo di sensori. I dati misurati vengono memorizzati in un file insieme all'istante temporale nel quale sono rilevati (detto, in gergo, timestamp).
Ciascuna riga del file ha il seguente formato:
AAAA-MM-GG hh:mm:ss.ms ID TEMP UMID VEL
Il significato dei diveri elementi è riportato nella seguente tabella.
Valore | Significato | Tipo | Intervallo/dimensione |
---|---|---|---|
AAAA | anno | intero | |
MM | mese | intero | [1..12] |
GG | giorno | intero | [1..31] |
hh | ore | intero | [0..23] |
mm | minuti | intero | [0..59] |
ss | secondi | intero | [0..59] |
ms | millisecondi | intero | [0..999] |
ID | identificativo del dispositivo | stringa | max 10 caratteri |
TEMP | temperatura [gradi] | float | |
UMID | umidità [%] | intero | [0..100] |
VEL | velocità del vento [m/s] | float | >= 0 |
Le prime due righe del file contengono rispettivamente i valori numerici interi a
e b
.
Si ha che 0 <= a <= b
.
Essi delimitano l'intervallo di righe [a,b]
da leggere tra quelle presenti successivamente nel file.
La prima riga contenente una misura è quella di indice 0
(zero).
Il numero totale di righe n
non è noto.
Potrebbe accadere che n <= a
e/o n <= b
.
Un esempio di contenuto del file è il seguente:
1
1000
2019-03-03 23:59:10.120 ID000 17.5 20% 0.4
2019-03-02 07:41:59.001 ID001 16.9 22% 0.2
2019-03-01 12:10:00.000 ID002 22.5 21% 0.3
Nel caso in esempio, vanno considerate soltanto la seconda e la terza riga contenente i valori misurati.
Scrivere un programma che legga il file nel formato illustrato e stampi a video i valori richiesti nei seguenti quesiti.
Suggerimenti generali
1) Identificativi
Il programma deve stampare a video gli indentificativi contenuti nelle righe nell'intervallo [a,b]
in ordine invertito rispetto al loro ordine nel file.
La stampa avvenga utilizzando il formato come nell'esempio seguente:
[IDENTIFICATIVI]
ID002
ID001
Suggerimenti generali
Dovendo stampare i dati in ordine inverso rispetto al loro ordine nel file, i dati vanno prima caricati in memoria per poterli poi stampare.
In questo caso, il numero massimo di righe da leggere viene indicato esplicitamente nel file.
Si può quindi allocare dinamincamente tramite malloc
un vettore che possa ospitare tale quantità di dati.
- realizzare un ciclo di lettura utilizzando
fgets
esscanf
(vedi S8.6) - ad ogni riga letta, verificare se corrisponde ad un orario notturno e, nel caso, effettuare la stampa
Il nome del file da leggere sarà l'argomento argv[1]
del main
(vedi S6.9), mentre per aprire il file in lettura con fopen
(S8.2.1).
Funzione di lettura
La parte principale dell'elaborazione viene fatta durante la lettura del file. Quando viene letta una riga, questa viene elaborata per memorizzare i punteggi di piloti e scuderie.
Si può creare una funzione di lettura dichiarata come la segue:
struct misura *leggi_file(FILE *f, int *n);
La funzione restituisce un puntatore a struttura di tipo struct misusa
, che conterrà l'indirizzo del primo elemento del vettore di strutture allocato tramite malloc
all''interno della funzione e usato per ospitare i dati letti.
Gli argomenti della funzione, invece, sono quattro:
- il file da leggere, già aperto in lettura prima di chiamare
leggi_file
(S8.2.1)
Nella funzione leggi_file
:
- vanno lette le prime due righe per estrarre il valore di
a
eb
- per fare questo, si può usare la funzione
fgets
(S8.6) senza la necessità di un ciclowhile
- da ogni riga, si estraggono i dati tramite
sscanf
; - il vettore deve essere allocato con
malloc
per una dimensione adeguata- ricorda che per estrarre una stringa con
sscanf
si usa lo specificatore%s
(S8.6! - nella
sscanf
, la variabile stringa nella quale memorizzare il nome estratto va passato per riferimento (e visto che si tratta di un vettore dichar
non serve la&
)
- ricorda che per estrarre una stringa con
Nel main
:
- bisogna chiamare la funzione
leggi_file
2) Massima temperatura
Determinare la temperatura massima tra tutte quelle misurate, indicata con max_temp
, e stamparne a video il valore con il seguente formato:
[MAX-TEMP]
max_temp
Suggerimenti generali
Per l'individuazione del valore massimo di temperatura basta effettuare i necessari controlli mentre viene letto il file.
È possibile modificare la funzione di lettura implementata al punto precedente per tenere traccia del valore massimo letto, e stamparne il valore al termine della lettura.
3) Numero di righe lette
....
[RIGHE]
n
Verifica manuale
La verifica del funzionamento del programma può essere fatta manualmente, utilizzando il file di input file3.txt come esempio, richiamando l'eseguibile come segue:
./a.out file3.txt
Verifica automatica
Si può utilizzare il tool pvcheck
di verifica automatica per testare il corretto funzionamento del programma (maggiori informazioni circa l'uso di pvcheck
sono disponibili qui).
Il file contenente i test è misure3.test.
Il comando da eseguire per il test è il seguente:
pvcheck -f misure3.test ./a.out
Nella prossima pagina potrai esaminare un esempio di soluzione dell'esercizio.