/*
 * MODYFIKACJA: teraz używamy tablicy dwuwymiarowej kolumna x, kolumna f(x)
 * 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 dwówymiarowych do
 * funkcji jako wskaźnika
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 */
#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][2];
    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((double *)Tb, N, Od, Do);
	Drukuj((double *)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 << 1); T < Koniec;)
  {
    cout << setw(20) << setprecision(12) << *(T++);
    cout << setw(20) << 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 << 1), Zakres = Do - Od; T < Koniec;)
    {
      *(T++) = f(*(T++) = Od + (i++) * Zakres / M);
    }
  } else
    *T = f(*(T++) = (Od + Do) / 2);
}

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