/*
 * MODYFIKACJA: teraz używamy tablicy oraz wskaźników 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. Wskaźniki, przekazywanie tablic do funkcji jako wskaźników
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 */
#include <iostream>
#include <iomanip>
#include <limits>
#include <math>

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

const unsigned  MaksymalnyRozmiarTablicy = 1000;

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

int 
main()
{
  while (true)
  {
    double          Tb[MaksymalnyRozmiarTablicy];
    cout << "Podaj ilosc pomiarow 1.." << MaksymalnyRozmiarTablicy << " (0-koniec): ";
    unsigned        N;
    cin >> N;
    if ((cin) && (N <= MaksymalnyRozmiarTablicy))
    {
      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');
	Wypelnij(Tb, N, Od, Do);
	Drukuj(Tb, N);
	cout << endl;
	continue;
      }
    }
    cin.clear();
    cin.ignore(INT_MAX, '\n');
    cout << "Blad wprowadzenia" << endl << endl;
  }
  return 0;
}

void 
Drukuj(double *T, unsigned N)
{
  cout.setf(ios::fixed);
  for (double *Koniec = T + N; T < Koniec; ++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 ?
  {
    unsigned        i = 0;
    for (double *Koniec = T + N, Zakres = Do - Od; T < Koniec; ++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);
}
