Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1101
II Semestre 2000
[<=] [home] [<>] [\/] [=>]
CI-1101 Programación I

Tarea #8 [solución]

La clase Bolsa implementada usando punteros

class Bolsa {
public:
    int Esta(int i); // # de veces que "i" Está() en la Bolsa
    void Agrega(int i);  // incrementa "Esta(i)"
//  ...
}; // Bolsa
Figura 1

      En la tarea anterior usted implementó un programa para leer números y contar la cantidad de veces que cada número aparece usando la clase Bolsa cuya definición parcial está en la Figura 1. Para implementar la clase Bolsa usted usó un vector ordenado para contar los números repetidos.

// lab11.cpp  (c) 2000 adolfo@di-mare.com

/*  resultado:
    Este programa implementa y usa la clase Bolsa para contar
    números.
    - La implementaci›n se hace usando una lista con punteros.
*/

#include <iostream> // #include <iostream.h>
#include <climits>
#include <bool.h>

class ostream;

class Bolsa {
    class nodo {
        nodo *_next;  // apuntador al siguiente nodo
        long  _val;   // valor almacenado
        int   _cont;  // cantidad de veces que _val está en la bolsa
        friend class Bolsa;
    }; // nodo
public:
    Bolsa() : _prm(0) {}
    int  Esta(long n); // # de veces que "i" Est () en la Bolsa
    void Agrega(long i);   // incrementa "Esta(i)"
    void Graba(ostream&);  // graba todos los valores
private:
    nodo *_prm; // primer nodo de la lista
}; // Bolsa


void Bolsa::Agrega(long n) {
/*  resultado
    Agrega el valor "n" a la bolsa. Si ya estaba, se
    incremente en uno el valor que "Esta()" retorna.
*/
    Bolsa::nodo *p, *q;  // "q" va detr s de "p"
    p = _prm;  // p = this->_prm;

    // recorre la lista para encontrar el valor "n"
    while (p !=0) {
        q = p;  // recuerda el anterior

        if (n == p->_val) { // lo encontró
            (p->_cont)++;
            return;
        }
        p = p->_next;
    }

    // crea un nuevo nodo para "n"
    Bolsa::nodo *nuevo = new Bolsa::nodo;
    nuevo->_val  = n;
    nuevo->_cont = 1;
    nuevo->_next = 0;

    // enlaza el nodo
    if (_prm == 0) {
        _prm = nuevo; // agrega el primer nodo de la lista
    }
    else {
        q->_next = nuevo;  // conecta después del último nodo
    }
    return;
} // Bolsa::Agrega()


int Bolsa::Esta(long n) {
/*  resultado
    Retorna la cantidad de veces que el valor "n" ha sido
    agregado a la bolsa.
    - Retorna cero si "n" nunca ha sido agregado.
*/
    Bolsa::nodo *p;  // "p" recorre la lista
    p = this->_prm;  // p = _prm;

    // recorre la lista para encontrar el valor "n"
    while (p !=0) {
        if (n == p->_val) { // lo encontró
            return p->_cont;
        }
        p = p->_next;
    }
    return 0;
} // Bolsa::Esta()

void Bolsa::Graba(ostream& COUT) {
/*  resultado
    Graba todos los valores almacenados en la bolsa,
    en orden creciente. */

    for (long n=0; n<LONG_MAX; ++n) {
        if (0 != Esta(n)) {
            COUT << n << " está " << Esta(n);
            COUT << " veces en al bolsa" << endl;
        }
    }
} // Bolsa::Graba()


int main() {
    Bolsa B;
    long n;

    // lee todos los valores
    while (cin >> n) {
        B.Agrega(n);
    }

    // despliega los valores
    B.Graba(cout);

    return 0;
} // main()

// EOF: lab11.cpp
Figura 2

      En esta tarea usted cambiará la implementación de la clase Bolsa por una que usa punteros, similar a la de la Figura 2. Para su implemetación, a diferencia de la que aparece aquí, usted debe usar un vector que mantenga ordenados los valores almacenados en la bolsa. En particular, eso evitará que el método Bolsa::Graba() deba recorrer todo el rango de números enteros para grabar el contenido de la bolsa. Una vez que termine la implementación, envíe su trabajo a los asistentes del curso por correo electrónico.

Envío de tareas por correo electrónico

[mailto:]Andrés Arias y Tomás Rodríguez

 

Tiempo de entrega: 3 Días
Modalidad: Individual

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2000
Derechos de autor reservados © 2000
[home] <> [/\]