#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void consumo(int numeros, char *inf, char *outf);
int Numero_registros(char *stream);
void Help(void);

int main (int argc, char *argv[])
{
        int registros;

        if (argc < 2){
                fprintf(stderr,"\n\nUse: \nconsumo arq_in arq_out\n");
                Help();
                exit(EXIT_FAILURE);
        }

        registros = Numero_registros(argv[1]);
        consumo(registros, argv[1], argv[2] );

        return (EXIT_SUCCESS);
}

void consumo(int numero, char *inf, char *outf)
{

        int i;
        float *km, *lt, lt_tot, dist, kmplt, pmedio, media_tot;
        FILE *fpin,*fpout;

        if ((fpin = fopen(inf,"rt"))==NULL){
                fprintf(stderr,"\nNao e' possivel abrir arquivo de entrada\n\n");
                exit (EXIT_FAILURE);
        }
        if ((fpout = fopen(outf,"wt"))==NULL){
                fprintf(stderr,"\nNao e' possivel abrir arquivo de saida\n\n");
                exit (EXIT_FAILURE);
        }

        if ((km = malloc(numero * sizeof(float)))==NULL){
                printf("\nNao e' possivel alocar memoria para os Km.\n");
                exit(EXIT_FAILURE);
        }

        if ((lt = malloc(numero * sizeof(float)))==NULL){
                printf("\nNao e' possivel alocar memoria para os litros.\n");
                exit(EXIT_FAILURE);
        }

        for(i=0; i < numero; i++) {
                fscanf(fpin,"%f %f", (km+i), (lt+i));
        }

        lt_tot=*lt;

        for(i=1; i<numero; i++){
                dist   = abs( *(km+i) - *(km+i-1) );
                pmedio = (*(km+i) + *(km+i-1))/2;
                kmplt  = dist / *(lt+i);
                lt_tot += *(lt+i);

                fprintf(stdout,"%08.2f\t%05.2f\n", pmedio, kmplt);
                fprintf(fpout,"%08.2f\t%05.2f\n", pmedio, kmplt);

        }

        media_tot =  *(km+numero-1) / lt_tot;

        printf("\n\n\n");
        printf("\t+------------------------------------------+\n");
        printf("\t| Media no periodo:        %8.2f  Km/l  |\n", media_tot);
        printf("\t| Litros gastos:           %8.2f  lts   |\n",lt_tot);
        printf("\t| Kilomtetros percorridos: %8.0f  Km    |\n", *(km+numero-1));
        printf("\t+------------------------------------------+\n");
        printf("\n\n\t\t1998 (c) Fabricio Ferrari");

        free (km); free(lt);
        fclose(fpin); fclose(fpout);

}    // Fim Consumo




int Numero_registros(char *stream)
{
        int  N = 0;
        float num1, num2;

        FILE *fp;

        if ((fp=fopen(stream,"rt")) == NULL ){
                printf("\a\aArquivo nao pode ser aberto!!!\n");
                exit(0);
                }

        while (!feof(fp)) {
                fscanf(fp,"%f %f",&num1, &num2);
                N++;
                }


        fclose(fp);
        return (N-1);
}


void Help(void)
{
  printf("\n\n\n\
        ++++++++++++++++++++++++++++++++++++++++++      \n\
        +         Programa de Calculo            +      \n\
        +    do Consumo Medio de Combustivel     +      \n\
        ++++++++++++++++++++++++++++++++++++++++++      \n\
                                                        \n\
        Este programa calcula o consumo de combustivel  \n\
         em  periodos  e  o  consumo medio total. Para  \n\
         utiliza-lo, edite um  arquivo  contendo  duas  \n\
         colunas com os dados dos seu veiculo. Na pri-  \n\
         meira coluna ponha  a kilometragem do veiculo  \n\
         na data do abastecimeto e  na segunda  coluna  \n\
         o numero de litros. Por exemplo,  um  arquivo  \n\
         tipico seria:                                  \n\
                                                        \n\
         9451 58.15                                     \n\
         9987 55.30                                     \n\
         10513 47.70                                    \n\
                                                        \n\
         E assim por diante. O arquivo nao deve conter  \n\
         linhas em branco e o separador  decimal  deve  \n\
         ser o ponto. Depois de feito rode o  programa  \n\
         da seguinte maneira:                           \n\
                                                        \n\
         c:\\> consumo entrada saida                     \n\
                                                        \n\
         onde \"entrada\" e' o  nome  do arquivo com  os\n\
         dados  do  seu veiculo e \"saida\" e o  arquivo\n\
         onde serao gravados os resultados.Note que se  \n\
        \"saida\" ja' existe, ele sera sobrescrito.     \n\
        Os valores medio serao colocados na tela,  en-  \n\
         quanto o consumo de cada periodo  estara gra-  \n\
         vado no arquivo \"saida\".  Este  arquivo tera'\n\
         duas colunas, uma com a kilometragem media  e  \n\
         a outra com o consumo medio do periodo.  Este  \n\
         arquivo podera' servir para um grafico dos Km  \n\
         (eixo X) contra o consumo (eixo Y).            \n\
                                                        \n\
                                                        \n\
                            1998 (c) Fabricio Ferrari   \n\
                              (fabricio@ferrari.pro.br)     \n");

}








