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