//////////////////////////
//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()
|