// ho.C - Hip, 2009-11-16

#include <iostream>
#include <iomanip>
using namespace std;

// klasa materijalna tocka
class mt {
  double m; // masa
  double x; // polozaj
  double v; // brzina

public:
  mt(double masa, double x0, double v0) {
    m = masa; x = x0; v = v0;
  } // konstruktor

  void pomakni(double dt, double F) {
    v = v + F / m * dt;
    x = x + v * dt;
  } // pomakni

  double energija() { return 0.5 * m * v * v; } // kineticka energija

  double polozaj() { return x; } // trenutni polozaj
  double brzina() { return v; } // trenutna brzina

  void ispis() {
    cout << setw(7) << x << " / " << setw(7) << v << endl;
  } // ispis
}; // mt

class opruga {
  double k; // konstanta opruge

public:
  opruga(double konstanta) { k = konstanta; } // konstuktor

  double sila(double x) { return -k * x; } // Hookov zakon

  double energija(double x) { return 0.5 * k * x * x; }
}; // opruga

class kugla: public mt {
  double polumjer;

public:
  kugla(double masa, double x, double v, double r) : mt(masa, x, v) {
    polumjer = r;
  } // konstruktor
}; // kugla

int main(int argv, char** argc) {
  int nispis, i = 0;
  double t;  // vrijeme
  double dt; // vremenski korak
  double F;  // sila
  kugla kugla1(2.0, 5.0, 0.0, 1.0);
  opruga opruga1(1.0);

  cout << endl;
  cout << "Harmonijski oscilator" << endl;
  cout << "~~~~~~~~~~~~~~~~~~~~~" << endl;
  cout << endl;
  cout << "Vremenski korak: "; cin >> dt;
  cout << "Ispis poslije svakih koliko koraka: "; cin >> nispis;
  cout << endl;
  cout << "Pocetna energija: ";
  cout << kugla1.energija() + opruga1.energija(kugla1.polozaj()) << endl;
  cout << endl;

  for(t = dt; t < 10.0; t += dt) {
    F = opruga1.sila(kugla1.polozaj()); // elasticna sila opruge
    kugla1.pomakni(dt, F);

    if(++i == nispis) {
      cout << setiosflags(ios::fixed) << setprecision(4) <<
        setw(8) << t << " : " ;
      cout << kugla1.energija() + opruga1.energija(kugla1.polozaj()) << " : ";
      kugla1.ispis();
      i = 0;
    }
  }
  return 0;
} // main
    

