text: #include "InputHandler.h"
  #include <vector>
  using namespace std;
  
  class Calculo{
  public:
      Calculo();
      vector<double> vectorX;
      vector<double> vectorY;
      int varN;
      double varRxy;
      int varXk;
      double varB0;
      double varB1;
      double varYk;
      void execute();
  
  };
  
  //.i
  /**
   * Constructor default
   */
  Calculo::Calculo(){
      varN=0;
  }
  
  //defiinición de método calculate para hacer el cálculo de la regresión
  int calculate(string fileName,vector<double> vectorX, vector<double> vectorY, int varN, double &varB1, double  &varRxy, double &varB0, double &varYk);
  
  //.i
  /**
   * Función principal para input de datos y llamada a las funciones de validación de archivos
   */
  void Calculo::execute(){
      string fileName;
      cin>>fileName;
      bool esArchivoValido = InputHandler::verificarExistencia(fileName.c_str());
  
      if(esArchivoValido){
          bool esValidoN = InputHandler::verificarValidezN(fileName, varXk);
          if(esValidoN){
              bool esValidoXY = InputHandler::verificarValidezXY(fileName,varN);
              if(esValidoXY){
                  varXk = calculate(fileName, vectorX, vectorY, varN, varB1, varRxy, varB0, varYk);
                  cout<<"N = "<<this->varN<<endl;
                  cout<<"xk = "<<this->varXk<<endl;
                  cout<<setprecision(5)<<fixed<<"r  = "<<this->varRxy<<endl;
                  cout<<setprecision(5)<<fixed<<"r2 = "<<this->varRxy*this->varRxy<<endl;
                  cout<<setprecision(5)<<fixed<<"b0 = "<<this->varB0<<endl;
                  cout<<setprecision(5)<<fixed<<"b1 = "<<this->varB1<<endl;
                  cout<<setprecision(5)<<fixed<<"yk = "<<this->varYk;
              }else cout<<"Valores en x,y inválidos. Ejecución finalizada";
          }else cout<<"Valor de N inválido. Ejecución finalizada";
      }
      else{
          cout<<"Archivo inexistente o incompatible";
          return;
      }
  
  }
  
  //.i
  /**
   * Rellena dos vectores con los datos leídos del archivo
   *@param nombre del archivo, vectores que reciben datos, variable que guarda xk
   */
  void getVectors(string fileName, vector<double> &vectorX, vector<double> &vectorY, int &primN){
      ifstream archEnt;
      archEnt.open(fileName);
      string sAux = "", primerNumero;
      while(primerNumero == ""){
          archEnt>>primerNumero;
      }
      primN = stoi(primerNumero);
      archEnt.close();
  
      archEnt.open(fileName);
      while(getline(archEnt,sAux)){
          if(contains(sAux,",")){
              string primParte = sAux.substr(0,sAux.find(','));
              string segParte = sAux.substr(sAux.find(',')+1, sAux.length());
              vectorX.push_back(stod(primParte));
              vectorY.push_back(stod(segParte));
          }
      }
  } 
  
  //.i
  /**
   * Regresa una suma de todos los elementos del vector
   *@param vector cuyos elementos sumar 
   *@return double de elementos sumados del vector
   */
  double sumatoriaVector(vector<double> vectorA){
      double dAcum = 0;
      for(int varI = 0; varI<vectorA.size(); varI++){
          dAcum += vectorA[varI];
      }
      return dAcum;
  }
  
  
  //.i
  /**
   * Regresa una sumaproducto de todos los elementos de ambos vectores
   *@param vectores para sumaproducto
   *@return double del resultado de la sumaproducto
   */
  double sumatoriaVectorMultiplicado(vector<double> vectorA, vector<double> vectorB){
      double dAcum = 0;
      for(int varI = 0; varI<vectorA.size(); varI++){
          dAcum += (vectorA[varI]*vectorB[varI]);
      }
      return dAcum;
  }
  
  //.i
  /**
   * Calcula los valores requeridos para la regresión
   *@param string del nombre, vectores con la sumatoria de los números, número de datos, bq, rxy, b0, yk 
   *@return int valor de xk
   */
  int calculate(string fileName,vector<double> vectorX, vector<double> vectorY, int varN, double &varB1, double  &varRxy, double &varB0, double &varYk){
      int primerN;
      getVectors(fileName, vectorX, vectorY, primerN);
      double sumX = sumatoriaVector(vectorX);
      double sumY = sumatoriaVector(vectorY);
      double sumXY = sumatoriaVectorMultiplicado(vectorX, vectorY);
      double sumX2 = sumatoriaVectorMultiplicado(vectorX, vectorX);
      double sumY2 = sumatoriaVectorMultiplicado(vectorY, vectorY);
      double xAvg = sumX/varN;
      double yAvg = sumY/varN;
      varB1 = (sumXY - (varN*xAvg*yAvg)) / (sumX2-(varN*xAvg*xAvg));
      varRxy = (varN*sumXY - sumX*sumY) / sqrt( (varN*sumX2 - sumX*sumX) * (varN*sumY2 - sumY*sumY) );
      varB0 = yAvg - varB1*xAvg;
      varYk = varB0 + varB1*primerN;
      return primerN;
  }
  
  