/*
 * MODYFIKACJA: teraz używamy dynamicznej pamięci Wydruk tabliczki wartości
 * funkcji w podanych przedziałach. funkcja: y=2*sin(x)*sin(x) Program prosi
 * o podanie zakresu Od - Do oraz ilości "pomiarów" N. W podanych
 * przedziałach rozkłada równomiernie N wartości x i dla nich oblicza y.
 * Dynamiczne przydzielanie tablic. Przekazywanie dynamicznie przydzielonych
 * tablic do funkcji
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 */
#include <iostream>
#include <iomanip>
#include <limits>
#include <math>

using namespace std;
//w starszych kompilatorach trzeba zakomentowa ć ten wiersz

double          f(double x);
void            Wypelnij(double *T, unsigned N, double Od, double Do);
void            Drukuj(const double *T, unsigned N);

int 
main()
{
  while (true)
  {
    cout << "Podaj ilosc pomiarow (0-koniec): ";
    unsigned        N;
    cin >> N;
    if (cin)
    {
      if (!N)
	break;
      cin.ignore(INT_MAX, '\n');
      cout << "Podaj przedzialy Od-Do: ";
      double          Od, Do;
      cin >> Od >> Do;
      if (cin)
      {
	cin.ignore(INT_MAX, '\n');
	double         *Tb = new double[N];
	Wypelnij(Tb, N, Od, Do);
	Drukuj(Tb, N);
	delete[] Tb;
	cout << endl;
	continue;
      }
    }
    cin.clear();
    cin.ignore(INT_MAX, '\n');
    cout << "Blad wprowadzenia" << endl << endl;
  }
  return 0;
}

void 
Drukuj(const double *T, unsigned N)
{
  cout.setf(ios::fixed);
  for (const double *K = T + N; T < K; ++T)
    cout << setprecision(12) << *T << endl;
}

void 
Wypelnij(double *T, unsigned N, double Od, double Do)
{
  unsigned        M = N - 1;
  if (M)
    //nie chcemy dzieli ć przez zero, prawda ?
  {
    double          Zakres = (Do - Od);
    unsigned        i = 0;
    for (double *K = T + N; T < K; ++T)
      *T = f(Od + (i++) * Zakres / M);
  } else
    *T = f((Od + Do) / 2);
}

double 
f(double x)
{
  double          sx = sin(x);
  return (2 * sx * sx);
}
