program matematyczny obiektowo

0

kilka dni temu pytałem na forum jak przerobić do postaci obiektowej program do obliczania regresji lioniowej zgodnie z wzorem ze strony: http://www.chem.univ.gda.pl/kchfiz/assets/Uploads/ztchf/files/II-CH-MiK_lab/regresja-liniowa.pdf
napisałem coś takiego:

#include <iostream>
#include <vector>
#include <fstream>
#include <string>


using namespace std;

class operacje
{
    public:

  int zlicz( string filename)
  {
    int n=0;
    vector<string> v;

    ifstream file(filename.c_str());

     char line [256];

     while(file.getline(line,256))
     v.push_back(line);

     for(int i=0;i<v.size();i++)
        n++;
      return n;
  }

  double sumax(string filename)
  {
    double suma1=0;
    double suma2=0;

    ifstream liczby(filename.c_str());

    double liczba1;
    double liczba2;

    while (!liczby.eof())
    {
        liczby >> liczba1 >> liczba2;
            suma1=suma1 + liczba1;

            liczba1=0;
            liczba2=0;
    }
        liczby.close();
        return suma1;
  }
  double sumay(string filename)
  {
    double suma2=0;

    ifstream liczby(filename.c_str());

    double liczba1;
    double liczba2;

    while (!liczby.eof())
    {
        liczby >> liczba1 >> liczba2;
            suma2=suma2 + liczba2;

            liczba1=0;
            liczba2=0;
    }
        liczby.close();
        return suma2;
  }


  double sumailoczynu(string filename)
  {


    ifstream liczby(filename.c_str());

    double liczba1;
    double liczba2;
    double sumail=0;

    while (!liczby.eof())
    {
            liczby >> liczba1 >> liczba2;

            sumail= sumail + liczba1*liczba2;

    }
        liczby.close();
        return sumail;
  }
};


class liczby : operacje
{   public:
    double A;
    double oblicza(string filename)
    {   double a;
        a=(zlicz(filename)*sumailoczynu(filename)-sumax(filename)*sumay(filename))/(zlicz(filename)*sumax(filename)*sumax(filename)-sumax(filename)*sumax(filename));
        a=A;
        return a;
    }

    double obliczb (string filename)
    {   double b;
        b=(sumay(filename)-A*sumax(filename))/(zlicz((filename)));
        return b;
    }

};






int main()
{
    string filename;
    cout << "Welcome in Barcik Plot Laboratory" <<  endl;
    cout << "input your sourcefile"<< endl;
    cin >> filename;
  liczby wczytane;

    cout << wczytane.oblicza(filename) << endl;
    cout << wczytane.obliczb(filename) << endl;

    return 0;
}

tylko wyświetla jakieś dziwne wyniki, co o tym myślicie???

0

Z innej beczki. W double sumax masz nieużywaną zmienną suma2.

0

to wiem, ale się tym nie przejmuje, co myślicie raczej o budowie klas i dziedziczeniu, ma to jakiś sens??

0

Dziedziczenie to relacja "jest - czymś". U Ciebie "liczba jest operacją", to raczej sensu nie ma. Poza tym pola klasy (zmienne) powinny być prywatne, a dostęp do nich może być przez publiczne metody, np.

 
class foo
{
	private:
		int varA;
		int varB;
	public:
		void setVarA(int);
		void setVarB(int);
		int getVarA();
		int getVarB();
};
void foo::setVarA(int a)
{
	varA=a;
}
void foo::setVarB(int b)
{
	varB=b;
}
int foo::getVarA()
{
	return varA;
}
int foo::getVarB()
{
	return varB;
}

(jeśli coś źle napisałem, to proszę mnie poprawić :))

0
  1. pisząc narzędzie do obliczeń takich jak regresja liniowa, nie wiążesz api z nazwami plików! Takie coś powinno operować na prostych dancyh, wczytywanie danych powinno być niezależną częścią! Co by było jeśli nie masz tych danych w pliku, ale już w pamięci?
  2. źle stosujesz stl-a. Funkcja eof zwraca True dopiero PO PRÓBIE CZYTANIA POZA PLIKIEM, nie po osiągnięciu końca pliku!
  3. to powinno raczej wyglądać tak:
class LinearRegresionResult {
public:
    double a;
    double b;
    double r;
    double sigma2;
    double a_err;
    double b_err;
    double average_x;
    double average_y;
};

void linearRegresion(double x[], double y[], int n, LinearRegresionResult *result);
void linearRegresion(Point points[], int n, LinearRegresionResult *result);

1 użytkowników online, w tym zalogowanych: 0, gości: 1