Stazione di monitoraggio 1

..:: Versione con numero di righe ininfluente (lettura-elaborazione) ::..

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

Un esempio di contenuto del file è il seguente:

2019-03-03 23:59:10.120 R101 17.5 20% 0.4

2019-03-02 07:41:59.001 X023 16.9 22% 0.2
2019-03-01 12:10:00.000 X023 22.5 21% 0.3
...

Scrivere un programma che legga il file nel formato illustrato e stampi a video i valori richiesti nei seguenti quesiti.

ATTENZIONE: nel file possono essere presenti delle righe vuote, ovvero che non contengono alcun dato.

Suggerimenti generali

Come si vedrà, per risolvere i quesiti proposti non è necessario caricare in memoria tutti i dati presenti nel file, per esempio in un vettore, per poi elaborarlo. È sufficiente invece leggere una riga alla volta, elaborare i dati letti della singola riga, e passare alla riga successiva.

1) Misure notturne

Il programma deve stampare a video le righe corrispondenti a misurazioni svolte in orario notturno. L'orario notturno va dalle ore 22:00 alle ore 06:00 (escluso).

Le righe vengano stampate nello stesso formato presente nel file stesso, come nell'esempio seguente:

[NOTTURNO]
2019-03-03 23:59:10.120 R101 17.5 20% 0.4
...

Suggerimenti generali

  • realizzare un ciclo di lettura utilizzando fgets e sscanf (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 calcolare i risultati richiesti.

Si può creare una funzione di lettura dichiarata come la segue:

void leggi_file(FILE * fin);

La funzione richiede un argomento:

  • il file da leggere, già aperto in lettura prima di chiamare leggi_file (S8.2.1)

Nella funzione leggi_file:

  • il file può essere letto con un ciclo attraverso fgets (S8.6)
  • da ogni riga, si estraggono i dati tramite sscanf;
    • 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 di char non serve la &)

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 file1.txt come esempio, richiamando l'eseguibile come segue:

./a.out file1.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 è misure1.test.

Il comando da eseguire per il test è il seguente:

pvcheck -f misure1.test ./a.out

Nella prossima pagina potrai esaminare un esempio di soluzione dell'esercizio.