// 3.cpp
#include <random>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
void reagrupa(float *ORIGEN, float *DESTINO, int tamDestino, int numDias){
// agrupamos por numDias
float *pOri = &ORIGEN[0];
float *pDest = &DESTINO[0];
const float VALORFALTANTE = -99.0;
for (int i=0; i<tamDestino; i++){
float suma=0 ; // suma de los datos del mes
int j; // contador de dias del mes
int cont=0; // contador de valores faltantes
for (j=0; j<numDias; j++){
float dato = *(pOri + j);
if (dato==VALORFALTANTE)
cont++;
else
suma += dato;
}
*(pDest++) = suma/(numDias-cont);//promedio descontando data faltante
pOri += j;//avanzamos los numDias dias del periodo a promediar
}
}
void imprimeValores(float *A, int tam){
float *p=A;
for (int i=0; i<tam; i++)
cout<<fixed<<setprecision(2)<<setw(7)<<*(p+i);
cout<<endl;
}
int main(){
const int MAXDIARIO = 3600;
const int MAXMENSUAL = MAXDIARIO/30 ;
const int MAXTRIMESTRAL= MAXDIARIO/90;
const int MAXANUAL = MAXDIARIO/360;
float DIARIO[MAXDIARIO];
float MENSUAL[MAXMENSUAL];
float TRIMESTRAL[MAXTRIMESTRAL];
float ANUAL[MAXANUAL];
int tamAnual,tamMensual,tamTrimestral,tamDiario;
cout<<"Ingrese el numero de años de la serie de tiempo (<="<<MAXANUAL<<"): ";
cin>>tamAnual;
tamDiario = 360*tamAnual;
tamMensual = tamDiario/30;
tamTrimestral = tamDiario/90;
// generador de numeros aleatorios
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> dist(10,30);
// este codigo no es obligatorio
// el estudiante puede escribir otras versiones
float *p = &DIARIO[0];
for (int i=0; i<tamDiario; *(p+ i++) = dist(mt) );
// agrupamos por meses
reagrupa(DIARIO, MENSUAL, tamMensual, 30) ;
// agrupamos por trimestres
reagrupa(DIARIO, TRIMESTRAL, tamTrimestral, 90);
// agrupamos por años
reagrupa(DIARIO, ANUAL, tamAnual, 360);
// mostramos los promedios en diferentes periodos
cout<<"Valores mensuales:"<<endl;
imprimeValores(MENSUAL, tamMensual);
cout<<"Valores trimestrales:"<<endl;
imprimeValores(TRIMESTRAL, tamTrimestral);
cout<<"Valores anuales:"<<endl;
imprimeValores(ANUAL, tamAnual);
}