/*
* Esame Informatica 18/2/2004
* Quesito
* Scrivere un programma che legge un file testuale contenente
* numeri float, uno per riga, visualizza i numeri letti e
* scrive su un secondo file la media aritmetica del numero corrente
* e dei due precedenti.
* Al termine visualizza il minimo e il massimo dei numeri scritti.
* I nomi dei files devono essere parametrici,
* per le prime due letture non scrive nulla nel file.
*
* Memoria necessaria:
* - occorre mantenere almeno il numero corrente e i due precedenti,
* per calcolare la media dopo ogni lettura
* - occorre memorizzare anche il minimo e massimo corrente,
* che al termine divengono definitivi
* La condizione di terminazione determinata dalla fine del file in lettura.
* Tre letture fuori ciclo per inizializzare
* Variabili:
* p - numero corrente letto (e' usato anche per la prima lettura fuori ciclo)
* p1 - numero che precede il numero corrente
* p2 - numero che precede p1
*
* Algoritmo:
* - acquisisci i nomi dei file e apri
* - leggi i primi tre valori p, p2 e p1, calcola e scrive la prima media
* e inizializza a questa il minimo e il massimo delle medie scritte
* - ripeti finche' il file in lettura non terminato
* - leggi un valore
* - calcola media e aggiorna minimo e massimo
* - scrivi valore
* - scorri i valori fra il numero corrente e i due precedenti
* - fine ripetizione
* - visualizza minimo e massimo dei numeri scritti
* - chiudi il file in scrittura
*
*/
#include <stdio.h>
#define N 4
typedef char S[64];
// main:
int main()
{
double p,p1,p2, // numero corrente e due precedenti
m, // media aritmetica da scrivere
mMin, // minimo delle medie scritte
mMax; // massimo delle medie scritte
S nomeIn, nomeOut;
FILE *fIn, *fOut;
printf("Nome file da leggere ");
scanf("%s",nomeIn);
printf("nome file da scrivere ");
scanf("%s",nomeOut);
if((fIn=fopen(nomeIn,"r"))==NULL){
printf("Lettura impossibile\n");
return 1;
}
if((fOut=fopen(nomeOut,"w"))==NULL){
printf("Scrittura impossibile\n");
return 1;
}
fscanf(fIn, "%lf", &p); // legge fuori linea i primi 3 numeri
fscanf(fIn, "%lf", &p2);
fscanf(fIn, "%lf", &p1);
m = (p+p1+p2)/3.0; // calcola la prima media
fprintf(fOut,"%lf\n",m); // scrive la prima media
mMax=m; // prende come massimo e minimo la prima media scritta
mMin=m;
while (fscanf(fIn,"%lf",&p)!=EOF){
m = (p+p1+p2)/3.0; // calcola media
if (m<mMin)
mMin=m; // se necessario aggiorna minimo
if (m>mMax)
mMax=m; // se necessario aggiorna massimo
fprintf(fOut,"%lf\n",m); // scrive media
p2=p1; // scorre valori
p1=p;
}
fclose(fOut);
printf("Minima media %lf \t Massima media %lf \n",mMin,mMax);
return 0;
} // main