#include <iostream>
#ifdef __BORLANDC__
#else
  using namespace std;
#endif

class TablicaDouble
  {
   private:
   unsigned R;
   double *T;
   public:
   TablicaDouble(unsigned Rozmiar=0);
   TablicaDouble(const TablicaDouble &Tb);
   ~TablicaDouble();
   unsigned Rozmiar()const { return(R); }
   void Rozmiar(unsigned NowyR);
   unsigned operator()()const { return(R); } // jak unsigned Rozmiar()const
   void operator()(unsigned NowyR) { Rozmiar(NowyR); }
   double &operator[](unsigned i);
   const double &operator[](unsigned i)const;
   TablicaDouble &operator=(const TablicaDouble &Tb);
  };

TablicaDouble::TablicaDouble(unsigned Rozmiar):
  R(Rozmiar),
  T(R?new double[R]:0)
  {
  }

TablicaDouble::TablicaDouble(const TablicaDouble &Tb):
  R(Tb.R),
  T(R?new double[R]:0)
  {
   memcpy(T,Tb.T,R*sizeof(double));
  }

TablicaDouble::~TablicaDouble()
  {
   if(R) delete[] T;
  }

void TablicaDouble::Rozmiar(unsigned NowyR)
  {
   double *NowyT=NowyR?new double[NowyR]:0;
   if(R)
     {
      memcpy(NowyT,T,(R<NowyR?R:NowyR)*sizeof(double));
      delete[] T;
     }
   T=NowyT;
   R=NowyR;
  }

double &TablicaDouble::operator[](unsigned i)
  {
   if(i>=R) throw i;
   return(T[i]);
  }

const double &TablicaDouble::operator[](unsigned i)const
  {
   if(i>=R) throw i;
   return(T[i]);
  }

TablicaDouble &TablicaDouble::operator=(const TablicaDouble &Tb)
  {
   if(R) delete[] T;
   R=Tb.R;
   T=R?new double[R]:0;
   memcpy(T,Tb.T,R*sizeof(double));
   return(*this);
  }

ostream &operator<<(ostream &s,const TablicaDouble &Tb)
  {
   s<<'{';
   for(unsigned i=0;i<Tb();++i) // uzycie operatora: unsigned operator()()const
     {
      if(i) s<<';';
      s<<Tb[i]; // uzycie operatora: const double &operator[](unsigned i)const
     }
   return(s<<'}');
  }

istream &operator>>(istream &s,TablicaDouble &Tb)
  {
   for(unsigned i=0;i<Tb();++i) // uzycie operatora: unsigned operator()()const
     {
      s>>Tb[i]; // uzycie operatora: double &operator[](unsigned i)
     }
   return(s);
  }

int main()
  {
   int N;
   cout<<"Podaj rozmiar: ";
   cin>>N;
   TablicaDouble T(N),A,B(7);
   for(unsigned i=0;i<T();++i) T[i]=(double)i/2+1;

   cout<<"T="<<T<<endl;
   cout<<"A="<<A<<endl;
   cout<<"B="<<B<<endl;

   TablicaDouble C=T;
   //cout<<C[1000]<<endl; // wygeneruje wyjatek
   A(N); // zmiana rozmiaru: void operator()(unsigned NowyR)
   for(unsigned i=0;i<A();++i) A[i]=(double)i/4+1;
   cout<<"A="<<A<<endl;
   B=A; // TablicaDouble &operator=(const TablicaDouble &Tb)
   cout<<"Wprowadz B[1.."<<B()<<"]:"<<endl;
   cin>>B;
   cout<<"B="<<B<<endl;
   return(0);
  }
