/*
 * Wprowadzenie danych do dynamicznej tablicy. Program prosi o podanie ciągu
 * liczb który użytkownik kończy średnikiem. W trakcie wprowadzenia gromadzi
 * liczby w dynamicznej tablice. Po wypełnieniu tablicy usuwa wartości
 * zerowe.
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 */
#include <iostream>
#include <limits>

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

void 
Drukuj(const double *T, unsigned N)
{
  if (N)
  {
    unsigned        i = 0;
    for (const double *K = T + N; T < K; ++T)
      cout << "T[" << (i++) << "]=" << *T << ';' << endl;
  } else
    cout << "Tablica pusta" << endl;
}

void 
UsunZera(double *&T, unsigned &N)
{
  unsigned        Nx = N;
  for (const double *K = T + (N - 1); T <= K; --K)
    if (!*K)
      --Nx;
  if (Nx != N)
  {
    double         *Tx = Nx ? new double[Nx] : 0;
    if (Nx)
    {
      double         *Px = Tx;
      for (const double *P, *K = (P = T) + N; P < K; ++P)
	if (*P)
	  *(Px++) = *P;
    }
    delete[] T;
    T = Tx;
    N = Nx;
  }
}

int 
main()
{
  while (true)
  {
    unsigned        Ilosc = 0;
    double         *T = 0;
    while (true)
    {
      cout << "Podaj liczbe nr " << (Ilosc + 1) << " (;-koniec): ";
      double          X;
      cin >> X;
      if (cin)
      {
	double         *N = new double[Ilosc + 1];
	if (T)
	{
	  memcpy(N, T, Ilosc * sizeof(double));
	  delete[] T;
	}
	T = N;
	N[Ilosc++] = X;
      } else
      {
	cin.clear();
	if (cin.get() == ';')
	  break;
	cout << "Blad wprowadzania" << endl;
      }
      cin.ignore(INT_MAX, '\n');
    }
    if (!Ilosc)
      break;
    cout << endl;
    Drukuj(T, Ilosc);
    UsunZera(T, Ilosc);
    cout << endl;
    Drukuj(T, Ilosc);
    delete[] T;
    cout << endl;
  }
  return 0;
}

