0

ご迷惑をおかけして申し訳ありませんが、サポートが必要です。

クラスを使用してプログラムを作成し、線形回帰を計算する割り当てがありますが、リンクリストクラスが1つの値を受け取っているだけで、その理由がわかりません。コードはコンパイルされますが、線形回帰は計算されません。

これが私のコードです:

#include<iostream>
#include<cmath>
#include<fstream>
#include<iomanip>
#include<istream>
#include<string>


float a,b,r;
float X[20],Y[20],n = 10, z;
int intAux = 0, intI;
//double dblSumX,dblSumY,dblSumX2,dblSumY2,dblSumXY;
float dblSumX,dblSumY,dblSumX2,dblSumY2,dblSumXY;
//double dblSXX,dblSYY,dblSXY;
float dblSXX,dblSYY,dblSXY;

using namespace std;

// Clase Nodo
//p.base=
class Nodo {
float fltEstProxySize;
float fltDevelHours;
float fltEst;
Nodo* next;

 public:
  Nodo() {};
  void SetVariables(float data)
  {
      fltEstProxySize = data;
      fltDevelHours = data;
      fltEst = data;
  }

  void SetData(float EPS, float DH, float ES)
  {  
      fltEstProxySize = EPS;
      fltDevelHours = DH;
      fltEst = ES;
  };

  void SetNext(Nodo* aNext) 
  { 
      next = aNext;
  };

  float Data() 
  {  
      return(fltEstProxySize, fltDevelHours, fltEst);
  };

  Nodo* Next() 
  { 
      return next; 
  };
  };


 //p.
 //... Clase de la Lista ...
 class Lista {
Nodo *head;

 public:
  Lista() { head = NULL; };
  void Print();
  void Append(float fltEstProxySize, float fltDevelHours, float fltEst);
  void Delete(float fltEstProxySize, float fltDevelHours, float fltEst);
 };


/**
 * ... Imprime el contenido de la lista
 */
 //i.
void Lista::Print() {

// ... Apuntador temporal ...
Nodo *tmp = head;

// ... No hay Nodos ...
if ( tmp == NULL ) {
    cout << "EMPTY" << endl;
    return;
}

// ... Existe un Nodo in the Lista ...
if ( tmp->Next() == NULL ) {
    cout << tmp->Data();
    cout << " --> ";
    cout << "NULL" << endl;
}
else {
    // ... Recorre la lista y la imprime ...
    do {
        cout << tmp->Data();
        cout << " --> ";
        tmp = tmp->Next();
    }
    while ( tmp != NULL );

    cout << "NULL" << endl;
}
  }

  //i.
  // ... Agrega un nodo a la lista ...
  void Lista::Append(float fltEstProxySize, float fltDevelHours, float fltEst){

// ... Aqui crea a Nodo nuevo ...
Nodo* newNodo = new Nodo();

newNodo->SetData(fltEstProxySize, fltDevelHours, fltEst);
newNodo->SetNext(NULL);

// ... Crea un apuntador temporal ...
Nodo *tmp = head;

if ( tmp != NULL ) {
    // ... El Nodo esta en la Lista ...
    // ... Recorre la Lista ...
    while ( tmp->Next() != NULL ) {
        tmp = tmp->Next();
    }
    // ... El ultimo Nodo de la lista ...
    tmp->SetNext(newNodo);
}
else {
    // ... Nuevo Nodo de la lista ...
    head = newNodo;
}
   }



   /**
    * ... Borra un Nodo de la Lista ...
    */
  //i.
  void Lista::Delete(float fltEstProxySize, float fltDevelHours, float fltEst){

// ... Crea un Nodo temporal ...
Nodo *tmp = head;

// ... No hay Nodos ...
if ( tmp == NULL )
    return;

// ... ultimo Nodo de la Lista ...
if ( tmp->Next() == NULL ) {
    delete tmp;
    head = NULL;
}
else {
    // ... Recorre los nodos ...
    Nodo *prev;
    do {
        //if ( tmp->Data() == data ) break;
        if(tmp->Data() == fltEstProxySize && tmp->Data() == fltDevelHours) break;
        prev = tmp;
        tmp = tmp->Next();
    } while ( tmp != NULL );

    // ... Ajusta los Nodos ...
    prev->SetNext(tmp->Next());

    // ... Borra el Nodo actual ...
    delete tmp;
}
   }



   //i.
   class RegresionLineal
   {
Nodo *head;
int i;
//double dblSumX=0,dblSumY=0,dblSumX2=0,dblSumY2=0,dblSumXY=0;
//double dblSumX,dblSumY,dblSumX2,dblSumY2,dblSumXY;
//double dblSXX,dblSYY,dblSXY;

   public:
RegresionLineal(){head = NULL;};
void Calculo();

  };

  void RegresionLineal::Calculo()
  {
for (intI=0;intI < 20; intI++)
{   
    //if (X[intI] != 0)
    //{
        dblSumX += X[intI];
        dblSumX2 += (X[intI] * X[intI]);
    //}

    //if(Y[intI] !=0)
    //{
        dblSumY += Y[intI];
        dblSumY2 += (Y[intI] * Y[intI]);
        dblSumXY += (X[intI] * Y[intI]);
    //}
}

dblSXX = dblSumX2 - dblSumX * dblSumX / n;
dblSYY = dblSumY2 - dblSumY * dblSumY / n;
dblSXY = dblSumXY - dblSumX * dblSumY / n;

// ... pendiente infinita ...
if (abs(dblSXX) == 0)
    //return 0;
    z=0;


// ... calcula la pendiente ...
b = dblSXY / dblSXX;
a = dblSumY / n - (b) * dblSumX / n;

// ... calcula el coeficiente de regresion ...
if (abs(dblSYY) == 0)
    r = 1;
else
    r = dblSXY / sqrt(dblSXX * dblSYY);


     }


     // ... ... ... ... ... ... ... ... ... ... ... ... ...
    int main()
    {
   // ... Variables auxiliares ...
       float fltMedia2 = 0;
       float fltDevStd1 = 0;
   float fltDevStd2 = 0;
   float fltSuma1 = 0;
   float fltSuma2 = 0;
   float fltCuenta = 0;
   int intF = 0;
   float fltAux1 = 0, fltAux4 = 0, fltMedia1, fltAux3;
float fltAux2 = 0;


Lista lista;
RegresionLineal RL;

// ... inicializa arreglo ...
for (intI = 0; intI < 20; intI++)
{
    X[intI] = 0;
    Y[intI] = 0;
}

// ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 

cout << "\nPlease introduce the values of table 1: (Note: to finish just type -1 and hit enter)\n";

while(!cin.eof())
{   //d.
    cout << "\nPlease introduce X: ";
    cin >> fltAux1;
    cout << "\nPlease introduce Y: ";
    cin >> fltAux2;
    cout << "\nPlease introduce the estimate: ";
    cin >> fltAux3;
    //d.
    //d.

    if ((fltAux1 == -1) || (fltAux2 == -1))
    {
        break;
    }
    else
    {
        lista.Append(fltAux1, fltAux2, fltAux3);
        X[intI] = fltAux1;
        Y[intI] = fltAux2;
        fltCuenta = fltCuenta + 1;
        intI++;
        cout << "fltAux1: " << fltAux1 << endl;
        cout << "fltAux2: " << fltAux2 << endl;
    }
}

lista.Print();
// ... Calcula la regresión lineal ...
RL.Calculo();
cout << "\na: " << a << "\n" << endl;

cout << "Suma X: " << dblSumX << endl;
cout << "Suma Y: " << dblSumY << endl;
cout << "Suma X2: " << dblSumX2 << endl;
cout << "Suma Y2: " << dblSumY2 << endl;
cout << "Suma X*Y:" << dblSumXY << endl;


return 0;
   }
4

1 に答える 1

1

コードには他にもいくつかの問題/考えられる改善がありますが、現在直面している問題は、関数のループのintI前に0にリセットされていないためです。whilemain

以下は、修正されたコードの抜粋です。

// ... inicializa arreglo ...
for (intI = 0; intI < 20; intI++)
{
    X[intI] = 0;
    Y[intI] = 0;
}

// ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 

cout << "\nPlease introduce the values of table 1: (Note: to finish just type -1 and hit enter)\n";

intI = 0;          //Corrected here

while(!cin.eof())
于 2012-09-20T04:55:03.860 に答える