Linguaggio C: livello d'aqua in un bacino - Studentville

Linguaggio C: livello d'aqua in un bacino

esercizio svolto o teoria

A cura di: Administrator

Il livello dell’acqua di un bacino è controllato tramite uno strumento solitamente molto preciso; tuttavia a causa delle condizioni atmosferiche il valore misurato ogni tanto è inattendibile.

Considerando che il livello dellacqua nel bacino non può subire variazioni improvvise, si definisce accettabile una variazione dell’acqua,tra due misurazioni successive prese a intervallo temporale costante,del più o meno 5 per cento, mentre si devono scartare come errori di misura tutte quelle superiori al 5 per cento in valore assoluto.

Lo strumento memorizza su un file, sotto forma di numeri reali con 3 cifre decimali, un dato per ciascuna riga. Il file ha estensione .WD

Si vuole realizzare un programma per filtrare i dati misurati dallo strumento, eliminando gli errori di misura e sostituendoli con valori interpolati linearmente secondo le regole di seguito descritte:

  • Il primo valore riportato nel file si assume sempre corretto.
  • Se dopo un valore corretto appare un valore scorretto, cioè con variazione maggiore in valore assoluto del 5 per cento, allore bisogna considerare i valori successivi fino a trovare un valore corretto.
  • Una volta trovato il valore corretto successivo,i valori scorretti vanno quindi sostituiti da valori interpolati linearmente tra i due valori corretti agli estremi dellintervallo.
  • Se a partire da un certo momento tutti i valori fossero scorretti fino alla fine del file allora tali valori saranno sostituiti con l’ultimo valore corretto.

Il programma riceve come primo argomento della linea di comando il nome del file contente le misure (senza estensione .WD ) e deve generare un file con lo stesso nome e formato ed estensione .WOK. Inoltre al termine dell’esecuzione, il programma deve visualizzare a video il numero dei valori interpolati.

Ad esempio, se il file PROVA.WD contiene:

  1332.230  1331.900  1331.870  1331.652  1783.265 ***  1331.500  1331.470  12.230 ***  -236.340 ***  1331.230  

Lanciando il programma con: PROG.EXE PROVA, verrà generato il file PROVA.WOK contenente:

  1332.230  1331.900  1331.870  1331.652  1331.576 ***  1331.500  1331.470  1331.390 ***  1331.310 ***  1331.230  

e il messaggio a video: Interpolate 3 misure non attendibili

NOTA:
Nell’esempio i valori con *** corrispondono alle misure non attendibili nel file PROVA.WD e ai valori interpolati nel file PROVA.WOK
Se chiamiamo $d_{ultimo}$ l’ultimo valore corretto prima di un valore non attendibile, $seq_non_att$ il numero di valori non attendibili consecutivi e $d_{primo}$ il primo valore corretto dopo la sequenza di valori non attendibili, il valore interpolato sarà pari a:

$d_{interp} = d_{ultimo} + (((index cdot (d_{primo} – d_{ultimo}))/(seq_non_att + 1)))$

Dove $index$ è la posizione,a partire da 1, del valore non attendibile all’interno della sequenza composta da seq_non_att valori non attendibili.

Riguardo alla correttezza o meno dei dati successivi ad un primo dato scorretto, si deve osservare che il margine di errore con cui si devono fare i confronti per stabilire la correttezza o meno del dato corrente con l’ultimo valore corretto cresce del 5 per cento per il primo dato al 10 per cento per il secondo, al 15 per cento per il terzo, e così via.

Nel nostro esempio, si nota come ci siano due casi in cui si hanno sequenza di valori non attendibili. Nel primo caso d_ultimo è pari a 1331.652, d_primo è 1331.500, seq_non_att è pari a 1 e quindi index potrà valere soltanto 1. Il valore d_interp sarà quindi pari a 1331.576

Soluzione: download sorgente

  
  • Programmazione

Ti potrebbe interessare

Link copiato negli appunti