/*
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;
  }


