/*
 * 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