HerenciaOrdenada.cpp

Ir a la documentación de este archivo.
00001 // HerenciaOrdenada.cpp (c) 2005 [email protected]
00002 
00003 /** \file  HerenciaOrdenada.cpp
00004     \brief Ejemplo de uso de funciones virtuales usando algoritmos de ordenamiento.
00005 
00006     \author Alejandro Di Mare <[email protected]>
00007     \author Adolfo Di Mare <[email protected]>
00008     \date   2005
00009 */
00010 
00011 #define  INCLUDE_iostream
00012 #include "ADH_port.h"  // Biblioteca de compatibilidad BC++ v3.1 && MS C++
00013 
00014 #include <cstdlib>
00015 #include <ctime>
00016 
00017 /// Clase abstracta cuyos hijos son contenedores que pueden ser ordenados.
00018 /// - Tanto la \c "Lista_Ordenable" como el \c "Vector_Ordenable" son sus clases derivadas
00019 class Contenedor_Ordenable {
00020 protected:
00021     /// Cantidad de valores almacenados en el \c "Contenedor_Ordenable"
00022     int m_cantidad_de_elementos;
00023 
00024 public:
00025     typedef int value_type; ///< Tipo de valor almacenado en el contenedor
00026 
00027     Contenedor_Ordenable(unsigned N); ///< Constructor
00028     virtual ~Contenedor_Ordenable(); ///< Destructor
00029 
00030     /// Intercambia los valores de los elementos que están
00031     /// en las posiciones [i] <=> [j].
00032     virtual void Intercambie(int i, int j) = 0;
00033 
00034     /// Compara los elementos en las dos posiciones \c "i" && \c "j" del contenedor.
00035     /// - Retorna \c "true" cuando el primero es menor que el segundo.
00036     /// - Retorna \c "false" cuando el primero es mayor o igual que el segundo.
00037     ///   \pre <code>(i < Dimension()) && (j < Dimension())</code>
00038     virtual bool Es_Menor(int, int) const = 0;
00039 
00040     /// \v V[i]
00041     virtual value_type& operator[](int) = 0;
00042 
00043     /// Devuelve la cantidad de valores almacenados en el \c "Contenedor_Ordenable".
00044     unsigned Dimension() const { return m_cantidad_de_elementos; }
00045 
00046     /// Graba en \c "cout" todos los valores almacenados en el contendor.
00047     /// - Los graba en el orden en el que se encuentran almacenados.
00048     virtual void ImprimaSe() const = 0;
00049 
00050     /// Nombre del contenedor
00051     virtual const char* Nombre() const = 0;
00052 };
00053 
00054 
00055 /// Lista ordenable simple, compuesta de nodos, que almacena números enteros.
00056 /// - Este \c "Contenedor_Ordenable" es una lista de enteros de tamaño
00057 ///   \c "Contenedor_Ordenable::_cantidad_de_elementos".
00058 class Lista_Ordenable : public Contenedor_Ordenable {
00059 
00060 private:
00061     /// Nodos de la \c "Lista_Ordenable"
00062     class Nodo {
00063     public:
00064         /// Construye un nuevo \c "Nodo" cuyo valor almacenado es \c "v"
00065         Nodo(value_type v);
00066         ~Nodo(); ///< Destructor
00067 
00068         Nodo *     next;  ///< Puntero al próximo nodo
00069         value_type m_val; ///< Valor entero almacenado en el nodo
00070     };
00071 
00072     /// Agrega una copia de \c "v" al prinicipio de \c "*this"
00073     void Agregar_Valor(value_type v);
00074 
00075 public:
00076     /// Constructor que inserta \c "N" valores (aleatorios) en el contenedor.
00077     Lista_Ordenable(unsigned N);
00078     virtual ~Lista_Ordenable(); ///< Destructor
00079 
00080     virtual void Intercambie(int, int);
00081     virtual bool Es_Menor(int, int) const;
00082     virtual value_type& operator[](int);
00083 
00084     virtual void ImprimaSe() const;
00085     virtual const char* Nombre() const;
00086 private:
00087     Nodo * m_cabeza; ///< Primer \c "Nodo" de la lista
00088 };
00089 
00090 
00091 /// Vector ordenable que almacena enteros.
00092 /// - Este \c "Contenedor_Ordenable" es un vector de enteros de tamaño
00093 ///   \c "Contenedor_Ordenable::m_cantidad_de_elementos"
00094 class Vector_Ordenable : public Contenedor_Ordenable {
00095 
00096 private:
00097     value_type * m_vec;
00098 
00099 public:
00100     /// Constructor que inserta \c "N" valores (aleatorios) en el contenedor.
00101     Vector_Ordenable(unsigned N);
00102     virtual ~Vector_Ordenable(); ///< Destructor
00103 
00104     virtual void Intercambie(int, int);
00105     virtual bool Es_Menor(int, int) const;
00106     virtual value_type& operator[](int);
00107 
00108     virtual void ImprimaSe() const;
00109     virtual const char* Nombre() const;
00110 };
00111 
00112 
00113 /// Clase abstracta que se usa para derivar de ella los algoritmos
00114 /// que sirven para ordenar instancias de \c "Contenedor_Ordenable".
00115 /// - No contiene campo alguno; sirve como "funtor" polimórfico.
00116 class Algoritmo_Ordenador {
00117 private: // "Rep vacío"
00118 public:
00119     /// Este es el método que hace todo el trabajo.
00120     /// - Ordena el \c "Contenedor_Ordenable" usando el
00121     ///   \c "Algoritmo_Ordenador"
00122     virtual void Ordene(Contenedor_Ordenable &C) = 0;
00123 
00124     Algoritmo_Ordenador(); ///< Constructor
00125     virtual ~Algoritmo_Ordenador(); ///< Destructor
00126 
00127     // Nombre del algoritmo de ordenamiento
00128     virtual const char* Nombre() const = 0;
00129 };
00130 
00131 
00132 /// Clase de empaque alrededor del método de ordenamiento por "Burbuja".
00133 /// - Está derivada de \c "Algoritmo_Ordenador" para homologar su funcionalidad.
00134 /// - El método \c Ordene() es el que implementa el algoritmo de ordenamiento.
00135 class Ordenador_Burbuja : public Algoritmo_Ordenador {
00136 public:
00137     Ordenador_Burbuja(); ///< Constructor
00138     virtual ~Ordenador_Burbuja(); ///< Destructor
00139 
00140     /// Método que realiza el ordenamiento por "Burbuja".
00141     virtual void Ordene(Contenedor_Ordenable &);
00142     /// Retorna en nombre \c "Ordenador_Burbuja".
00143     virtual const char* Nombre() const;
00144 };
00145 
00146 
00147 /// Clase de empaque alrededor del método de ordenamiento por "Burbuja Optimizada".
00148 /// - Está derivada de \c "Algoritmo_Ordenador" para homologar su funcionalidad.
00149 /// - El método \c Ordene() es el que implementa el algoritmo de ordenamiento.
00150 class Ordenador_Burbuja_Optimizada : public Algoritmo_Ordenador {
00151 public:
00152     Ordenador_Burbuja_Optimizada(); ///< Constructor
00153     virtual ~Ordenador_Burbuja_Optimizada(); ///< Destructor
00154 
00155     /// Método que realiza el ordenamiento por "Burbuja Optimizada".
00156     virtual void Ordene(Contenedor_Ordenable &);
00157     /// Retorna en nombre \c "Ordenador_Burbuja_Optimizada".
00158     virtual const char* Nombre() const;
00159 };
00160 
00161 
00162 /// Clase de empaque alrededor del método de ordenamiento por "Selección".
00163 /// - Está derivada de \c "Algoritmo_Ordenador" para homologar su funcionalidad.
00164 /// - El método \c Ordene() es el que implementa el algoritmo de ordenamiento.
00165 class Ordenador_Seleccion : public Algoritmo_Ordenador {
00166 public:
00167     Ordenador_Seleccion(); ///< Constructor
00168     virtual ~Ordenador_Seleccion(); ///< Destructor
00169 
00170     virtual void Ordene(Contenedor_Ordenable &);
00171     /// Retorna en nombre \c "Ordenador_Seleccion".
00172     virtual const char* Nombre() const;
00173 };
00174 class Ordenador_Insercion : public Algoritmo_Ordenador{
00175 public:
00176     Ordenador_Insercion(); ///< Constructor
00177     virtual ~Ordenador_Insercion(); ///< Destructor
00178 
00179     /// Método que realiza el ordenamiento por "Insercion".
00180     virtual void Ordene(Contenedor_Ordenable &);
00181     /// Retorna en nombre \c "Ordenador_Inserción".
00182     virtual const char* Nombre() const;
00183 };
00184 
00185 
00186 /// Clase de empaque alrededor del método de ordenamiento por "Mezcla".
00187 /// - Está derivada de \c "Algoritmo_Ordenador" para homologar su funcionalidad.
00188 /// - El método \c Ordene() es el que implementa el algoritmo de ordenamiento.
00189 class Ordenador_Mezcla : public Algoritmo_Ordenador{
00190 private:
00191         Lista_Ordenable TMP(20);
00192         /// Itera a través del vector temporal
00193         /// e inicializa cada elemento en cero
00194         for (int i=0; i < 20; ++i) {
00195                 TMP[i] = 0;
00196         }
00197 public:
00198     Ordenador_Mezcla(); ///< Constructor
00199     virtual ~Ordenador_Mezcla(); ///< Destructor
00200 
00201     /// Método que realiza el ordenamiento por "Mezcla".
00202         virtual void Ordene(Contenedor_Ordenable &);
00203         /// Método que recursivamente ordena las 2 mitades por separado del arreglo
00204         void m_sort(Contenedor_Ordenable &, Lista_Ordenable &, int left, int right);
00205         /// Método que mezcla ordenadamente las 2 mitades ya ordenadas del arreglo
00206         void merge(Contenedor_Ordenable &, Lista_Ordenable &, int left, int mid, int right);
00207     /// Retorna en nombre \c "Ordenador_Mezcla".
00208     virtual const char* Nombre() const;
00209 };
00210 
00211 Lista_Ordenable::Lista_Ordenable(unsigned N) : Contenedor_Ordenable(N) {
00212     m_cabeza = 0;
00213     this->m_cantidad_de_elementos = N;
00214 
00215     srand(time(0));
00216     for (unsigned i = 0; i < N; ++i) {
00217         Agregar_Valor( rand() % 100 );
00218     }
00219 }
00220 
00221 Lista_Ordenable::~Lista_Ordenable() {
00222     if (m_cabeza != 0) {
00223         delete m_cabeza;
00224     }
00225 }
00226 
00227 Lista_Ordenable::Nodo::Nodo(value_type v) {
00228     this->m_val = v;
00229     next = 0;
00230 }
00231 
00232 Lista_Ordenable::Nodo::~Nodo() {
00233     // Implementación recursiva de la destrucción de la lista de nodos
00234     if (next != 0) {
00235         delete next; // HORRIBLE: ==> Usa O( size() ) espacio
00236     }
00237 }
00238 
00239 void Lista_Ordenable::Agregar_Valor(value_type v) {
00240     if (m_cabeza == 0) {
00241         m_cabeza = new Nodo(v);
00242     }
00243     else {
00244         Nodo * p  = new Nodo(v);
00245         p->next   = m_cabeza;
00246         m_cabeza    = p;
00247     }
00248 }
00249 
00250 void Lista_Ordenable::Intercambie(int i, int j) {
00251     Nodo * pI = m_cabeza;
00252     Nodo * pJ = m_cabeza;
00253 
00254     int k;
00255     for (k = 0; k < i; ++k) {
00256         pI = pI->next;
00257     }
00258     for (k = 0; k < j; ++k) {
00259         pJ = pJ->next;
00260     }
00261 
00262     value_type temp;
00263     temp = pJ->m_val;
00264     pJ->m_val = pI->m_val; // NO intercambia los nodos
00265     pI->m_val = temp;      // intercambia los valores
00266 }
00267 
00268 bool Lista_Ordenable::Es_Menor(int i, int j) const {
00269     Nodo * pI = m_cabeza;
00270     Nodo * pJ = m_cabeza;
00271 
00272     int k;
00273     for (k = 0; k < i; ++k) {
00274         pI = pI->next;
00275     }
00276 
00277     for (k = 0; k < j; ++k) {
00278         pJ = pJ->next;
00279     }
00280     return (pI->m_val  <  pJ->m_val);
00281 }
00282 
00283 int& Lista_Ordenable::operator[](int i) {
00284     Nodo * pI = m_cabeza;
00285 
00286     int k;
00287     for (k = 0; k < i; ++k) {
00288         pI = pI->next;
00289     }
00290     return pI->m_val;
00291 }
00292 
00293 void Lista_Ordenable::ImprimaSe() const {
00294     Nodo * p = m_cabeza;
00295     Nodo * end = 0;
00296     cout << "[";
00297     while (p != end) {
00298         cout << p ->m_val;
00299         if (p->next != end) { // ¿último nodo de la lista?
00300             cout << " ";
00301         }
00302         p = p->next;
00303     }
00304     cout << "]" << endl;
00305 }
00306 
00307 const char* Lista_Ordenable::Nombre() const {
00308     #ifdef    __BORLANDC__
00309         // Este método no puede ser definido dentro de la clase porque
00310         // BC++ lo considera "inline", lo que impide que sea "virtual"
00311     #endif // __BORLANDC__
00312     return "Lista_Ordenable";
00313 }
00314 Vector_Ordenable::Vector_Ordenable(unsigned N) : Contenedor_Ordenable(N) {
00315     // assert( N == m_cantidad_de_elementos );
00316     m_vec = new Contenedor_Ordenable::value_type [ m_cantidad_de_elementos ];
00317     srand( time(0) );
00318 
00319     for (int i = 0; i < m_cantidad_de_elementos; ++i) {
00320         m_vec[i] = rand() % 100;
00321     }
00322 }
00323 
00324 Vector_Ordenable::~Vector_Ordenable() {
00325     if (m_vec != 0) {
00326         delete [] m_vec;
00327     }
00328 }
00329 
00330 void Vector_Ordenable::ImprimaSe() const {
00331     value_type * p = m_vec;
00332     value_type * end = & m_vec[ m_cantidad_de_elementos ];
00333     cout << "[";
00334     while (p != end) {
00335         cout << *p;
00336         if (p+1 != end) { // ¿último valor del vector?
00337            cout << " ";
00338         }
00339         p++;
00340     }
00341     cout << "]" << endl;
00342 }
00343 
00344 bool Vector_Ordenable::Es_Menor(int i, int j) const {
00345     return (m_vec[i] < m_vec[j]);
00346 }
00347 
00348 int& Vector_Ordenable::operator[](int i) {
00349     return m_vec[i];
00350 }
00351 
00352 void Vector_Ordenable::Intercambie(int i, int j) {
00353     value_type temp;
00354 
00355     temp   = m_vec[i];
00356     m_vec[i] = m_vec[j];
00357     m_vec[j] = temp;
00358 }
00359 
00360 const char* Vector_Ordenable::Nombre() const {
00361     return "Vector_Ordenable";
00362 }
00363 
00364 void Ordenador_Burbuja::Ordene(Contenedor_Ordenable & C) {
00365     int i,j;
00366     for (i = C.Dimension(); i > 0; --i) {
00367         for (j = 1; j < i; j++) {
00368             if ( C.Es_Menor(j, j-1) ) {
00369                 C.Intercambie(j, j-1);
00370             }
00371         }
00372     }
00373 }
00374 void Ordenador_Insercion :: Ordene (Contenedor_Ordenable & C){
00375      // Ordenador insercion                                                     
00376      // ciclo atraves de todos los elementos de Contenedor_Ordenable                                
00377      for ( int next = 1; next < C.Dimension(); next++ )                        
00378      {                                                                     
00379         int moveItem = next; // inicializa el lugar para la colocacion de elementos       
00380                                                                            
00381         // busqueda del lugar en donde colocar el elemento actualmente analizado     
00382                 while ( ( moveItem > 0 ) && ( C.Es_Menor(moveItem, moveItem-1) ) )    
00383         {                                                                  
00384            // intercambia los elementos en las posiciones determinadas                          
00385            C.Intercambie(moveItem, moveItem-1);                        
00386            moveItem--;                                                     
00387         } // fin del while                                                     
00388                                                                            
00389      } // fin del for                                                          
00390 }
00391 void Ordenador_Mezcla :: Ordene (Contenedor_Ordenable & C){
00392     /// Crea un vector temporal para almacenar los valores a ordenar
00393         
00394         m_sort(C, TMP, 0, C.Dimension() - 1);
00395 }
00396 void Ordenador_Mezcla :: m_sort(Contenedor_Ordenable & C, Lista_Ordenable & temp, int left, int right)
00397 { 
00398   /// Valor en la mitad del vector      
00399   int mid;
00400 
00401   if (right > left)
00402   {
00403     mid = (right + left) / 2;
00404     m_sort(C, temp, left, mid);
00405     m_sort(C, temp, mid+1, right);
00406 
00407     merge(C, temp, left, mid+1, right);
00408   }
00409 }
00410 void Ordenador_Mezcla :: merge(Contenedor_Ordenable & C, Lista_Ordenable & temp, int left, int mid, int right)
00411 {
00412   int i, left_end, num_elements, tmp_pos;
00413 
00414   left_end = mid - 1;
00415   tmp_pos = left;
00416   num_elements = right - left + 1;
00417 
00418   while ((left <= left_end) && (mid <= right))
00419   {
00420           if (C[left] <= C[mid])
00421     {
00422       temp[tmp_pos] = C[left];
00423       tmp_pos = tmp_pos + 1;
00424       left = left +1;
00425     }
00426     else
00427     {
00428       temp[tmp_pos] = C[mid];
00429       tmp_pos = tmp_pos + 1;
00430       mid = mid + 1;
00431     }
00432   }
00433 
00434   while (left <= left_end)
00435   {
00436     temp[tmp_pos] = C[left];
00437     left = left + 1;
00438     tmp_pos = tmp_pos + 1;
00439   }
00440   while (mid <= right)
00441   {
00442     temp[tmp_pos] = C[mid];
00443     mid = mid + 1;
00444     tmp_pos = tmp_pos + 1;
00445   }
00446 
00447   for (i=0; i <= num_elements; i++)
00448   {
00449     C[right] = temp[right];
00450     right = right - 1;
00451   }
00452 }
00453 
00454 void Ordenador_Burbuja_Optimizada::Ordene(Contenedor_Ordenable & C) {
00455     bool cambio = true;
00456     for (int i = C.Dimension(); i > 0 && cambio; --i) {
00457         cambio = false;
00458         for (int j = 1; j < i; j++) {
00459             if (C[j] < C[j-1] ) {
00460                 C.Intercambie(j, j-1);
00461                 cambio = true;
00462             }
00463         }
00464     }
00465 }
00466 
00467 void Ordenador_Seleccion::Ordene(Contenedor_Ordenable & C) {
00468     int n = C.Dimension();
00469     for (int i=0; i < n-1; i++) {
00470         int menor = i;
00471 
00472         for (int j=i+1; j<n; j++) {
00473             if (/* C.Es_Menor(j,menor) */ C[j] < C[menor] ) {
00474                 menor = j;
00475             }
00476         }
00477         C.Intercambie(i, menor);
00478     }
00479 }
00480 
00481 Contenedor_Ordenable::Contenedor_Ordenable(unsigned N)
00482     : m_cantidad_de_elementos(N) {
00483 }
00484 
00485 Contenedor_Ordenable::~Contenedor_Ordenable() {
00486     // No hace nada porque no usa memoria dinámica
00487 }
00488 
00489 Algoritmo_Ordenador::Algoritmo_Ordenador() {
00490     // No hace nada porque el "Rep" está vacío
00491 }
00492 
00493 Algoritmo_Ordenador::~Algoritmo_Ordenador() {
00494     // No hace nada porque el "Rep" está vacío
00495 }
00496 
00497 Ordenador_Burbuja::Ordenador_Burbuja() {
00498     // No hace nada porque el "Rep" está vacío
00499 }
00500 
00501 Ordenador_Burbuja::~Ordenador_Burbuja() {
00502     // No hace nada porque el "Rep" está vacío
00503 }
00504 
00505 const char* Ordenador_Burbuja::Nombre() const {
00506     return "Ordenador_Burbuja";
00507 }
00508 Ordenador_Insercion::~Ordenador_Insercion() {
00509     // No hace nada porque el "Rep" está vacío
00510 }
00511 
00512 Ordenador_Insercion::Ordenador_Insercion(){
00513         //No hace nada porque el "Rep" está vacío
00514 }
00515 
00516 const char* Ordenador_Insercion::Nombre() const {
00517     return "Ordenador_Insercion";
00518 }
00519 Ordenador_Mezcla::~Ordenador_Mezcla() {
00520     for(int i = 0; i< 20; i++)
00521                 delete TMP[i];// No hace nada porque el "Rep" está vacío
00522 }
00523 
00524 Ordenador_Mezcla::Ordenador_Mezcla(){
00525         //No hace nada porque el "Rep" está vacío
00526 }
00527 
00528 const char* Ordenador_Mezcla::Nombre() const {
00529     return "Ordenador_Mezcla";
00530 }
00531 
00532 Ordenador_Seleccion::Ordenador_Seleccion() {
00533     // No hace nada porque el "Rep" está vacío
00534 }
00535 
00536 Ordenador_Seleccion::~Ordenador_Seleccion() {
00537     // No hace nada porque el "Rep" está vacío
00538 }
00539 
00540 const char* Ordenador_Seleccion::Nombre() const {
00541     return "Ordenador_Seleccion";
00542 }
00543 
00544 Ordenador_Burbuja_Optimizada::Ordenador_Burbuja_Optimizada() {
00545     // No hace nada porque el "Rep" está vacío
00546 }
00547 
00548 Ordenador_Burbuja_Optimizada::~Ordenador_Burbuja_Optimizada() {
00549     // No hace nada porque el "Rep" está vacío
00550 }
00551 
00552 const char* Ordenador_Burbuja_Optimizada::Nombre() const {
00553     return "Ordenador_Burbuja_Optimizada";
00554 }
00555 
00556 
00557 /// Retorna \c "true" cuando el contenedor \c "C" está ordenado no decrecientemente.
00558 bool Esta_Ordenado ( const Contenedor_Ordenable &C ) {
00559     unsigned i;
00560     for (i = 0; i < C.Dimension()-1; ++i) {
00561         if ( C.Es_Menor(i+1,i) ) {
00562             return false;
00563         }
00564     }
00565     return true;
00566 }
00567 
00568 #include <assert.h>
00569 
00570 /// Rutina principal del programa.
00571 /// - En cada iteración de su ciclo principal elije un contenedor para almacenar
00572 ///   valores (lista vs vector), y un algoritmo de ordenamiento
00573 ///   (Burbuja vs Burbuja_Optimizada vs Seleccion).
00574 int main() {
00575     Algoritmo_Ordenador  * pOrdenador;  // puntero "polimórfico" para el algoritmo
00576     Contenedor_Ordenable * pContenedor; // puntero "polimórfico" para el contenedor
00577     srand( time(0) );
00578     cout << endl << endl << endl;
00579     for (int i = 0; i < 5; ++i) {         // Algoritmo_Ordenador
00580         for (int j = 0; j < 2; ++j) {     // Contenedor_Ordenable
00581 
00582             cout << endl;
00583             cout << "======================";
00584             cout << "======================";
00585             cout << "======================" << endl;
00586 
00587             // Selecciona el algoritmo de ordenamiento
00588             switch ( i ) {
00589                 case 0: pOrdenador = new Ordenador_Burbuja();            break;
00590                 case 1: pOrdenador = new Ordenador_Burbuja_Optimizada(); break;
00591                 case 2: pOrdenador = new Ordenador_Seleccion();          break;
00592                                 case 3: pOrdenador = new Ordenador_Insercion();          break;
00593                                 case 4: pOrdenador = new Ordenador_Mezcla();          break;
00594             }
00595 
00596             // Selecciona "Lista_Ordenable" o "Vector_Ordenable" como contenedor
00597             switch ( j ) {
00598                 case 0: pContenedor = new Vector_Ordenable( 20 ); break;
00599                 case 1: pContenedor = new Lista_Ordenable(  20 ); break;
00600             }
00601 
00602             cout << "<<< " << 2*i+j+1 << " >>> => ";
00603             cout << pContenedor->Nombre() << " <===> ";
00604             cout << pOrdenador->Nombre() << endl;
00605             // Se imprime la lista desordenada generada al azar
00606             cout << endl << "[Sin orden]: ";
00607             pContenedor->ImprimaSe();
00608 
00609             pOrdenador->Ordene( *pContenedor );
00610             cout << endl << "[Ordenados]: ";
00611             pContenedor->ImprimaSe();
00612 
00613             if (! Esta_Ordenado( *pContenedor ) ) {
00614                 cout << endl;
00615                 cout << "ERRROR: El contenedor " << pContenedor->Nombre() << " NO está ordenado" << endl;
00616                 assert( "ERRROR: El contenedor NO está ordenado" && false );
00617             }
00618 
00619             // Destruye "pOrdenador" && "pContenedor"
00620             delete pOrdenador;
00621             delete pContenedor;
00622         }
00623     }
00624     return 0;
00625 }
00626 // EOF: HerenciaOrdenada.cpp

Generado el Wed Sep 6 15:18:43 2006 para Herencia Ordenada: por  doxygen 1.4.7
Hosted by www.Geocities.ws

1