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

Tarea #6 [solución]

Uso del contenedor diccionario de la biblioteca STL

      Complete, corriga y documente el programa que se muestra acá.

//////////////////////////
//TAREA PROGRAMADA 6    //
//Bananito Perez Sancho //
//carne:B007zz          //
//////////////////////////

#include <iostream>
#include <fstream>
#include <iomanip>
#include <map>
#include <string>

using namespace std;

//      mul....   padre   hijo's
typedef multimap< string, string > diccionario;

void lee(                string,       diccionario & );
void busca_ancestro(     string, const diccionario & );
void busca_descendiente( string, const diccionario & );
void despliega(                  const diccionario & );

const int W_padre = 10;         // ancho del setw()
const int W_hijo  = 13;
const int W = W_padre + W_hijo; // ancho del setw()

int main() {
    cout << "Este programa busca descendientes y ancestros" << endl;
    cout << "de alguna persona" << endl;
    diccionario D;  // instancia el diccionario "D"
    int opc;

    do {   // menu
        cout << "" << endl;
        cout << "Digite: " << endl;
        cout << "1 Para leer un nuevo archivo" << endl;
        cout << "2 Ver todas las parejas de padre - hijo" << endl;
        cout << "3 Buscar ancestros" << endl;
        cout << "4 Buscar descendientes" << endl;
        cout << "5 Salir" << endl;

        cin  >> opc;
        if (opc==1) { // lee archivo
            string nom_arch;
            nom_arch.erase (0, nom_arch.end());  // limpia nom_arch
            cout << endl << "Digite el nombre del archivo a leer: ";
            cin  >> nom_arch;
            lee (nom_arch, D);
        } else if (opc==2) { // despliega el contenido del diccionario
            despliega(D);
        } else if (opc==3) { // busca ancestros
            string hijo;
            cout << endl << "introduzca un nombre para buscar sus ancestros: ";
            cin  >> hijo;
            cout << endl;
            cout << "             Padre" << setw(W) << "Hijo" << endl;
            busca_ancestro(hijo, D);
        } else if (opc==4) { // busca descendientes
            string padre;
            cout << endl << "introduzca un nombre para buscar sus descendientes: ";
            cin  >> padre;
            cout << endl;
            cout << "             Padre" << setw(W) << "Hijo" << endl;
            busca_descendiente(padre, D);
        } else if (opc==5) { // termina
            return 0;
        }
    } while (opc != -1);

    return 0;
} // main()

void lee(string,   diccionario & );
void lee(string F, multimap< string, string > &D) {
/*  resultado
    Esta funcion lee un archivo de texto con pares de nombres
    padre-hijo, y los agrega al diccionario D
*/
    string padre, hijo;
    ifstream leer( (F.c_str()), ios::in ); // ifstream::operator bool () { ... }

    if (!leer) { // si no se pudo abrir
        cout << "No se pudo abrir el archivo" << F << endl;
        exit(1);
    }

    // Agrega el contenido del archivo al diccionario
    while (!leer.eof()) {
        leer >> padre >> hijo;
        D.insert( diccionario::value_type(padre, hijo) );
    }

//  leer.clear();   // limpia el archivo
//  leer.seekg(0);  // se ubica en el inicio del archivo
    leer.close();   // cierra el archivo
} // lee()

void despliega(const diccionario &D) {
/*  resultado
    Despliega todo el contenido del diccionario "D"
*/
    cout << "Parejas que contiene el diccionario :\n";
    cout << setiosflags (ios::left)
         << setw(W_padre) << "Padre"
         << setw(W_hijo)  << "Hijo" << endl;

    diccionario::const_iterator it;  // recorre el diccionario
    for (it = D.begin(); it != D.end(); ++it) {
        cout << setiosflags(ios::left)
             << setw(W_padre) << it->first
             << setw(W_hijo)  << it->second
             << endl;
    }
} // despliega()

void busca_ancestro(string hijo, const diccionario &D) {
/*  resultado
    Busca recursivamente los ancestros del nombre "hijo" en "D"
*/  
} // busca_ancestro()

void busca_descendiente(string padre, const diccionario &D) {
/*  resultado
    Busca recursivamente los descendientes del nombre "D"
*/
    bool encontrado = false;  // "true" si se encontraron descendientes
    diccionario::const_iterator it;  // iterador para el diccionario

    for (it = D.begin(); it != D.end(); ++it) {
        if (it->first == padre) { // si encuentra el nombre
            cout << endl << "Encontrado: ";
            cout << it->first << setw(W) << it->second;
            cout << endl;  // despliega

            // llamado recursivo con el descendientes encontrado
            busca_descendiente (it->second, D);
            encontrado = true;
        }
    }

    if (!encontrado) { // si no se encuentra
        cout << endl << "No se encontraron hijos para: " << padre << endl;
    }
} // busca_descendiente()
Figura 1:

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 3 días
Modalidad: Individual

Soluciones

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