sábado, 26 de septiembre de 2015

STL Agenda Telefonica Usando Contenedores Map en Visual Studio 2013


Persona.h

//Clase que define el nombre y apellido de una persona

#pragma once

#include <string>
#include <iostream>

using namespace std;

class Persona
{
public:
	
	//constructor
	Persona(const string &nombre = "", const string &apellido = "") : nombrePersona(nombre) , apellidoPersona(apellido) {}

	//constructor Move
	Persona(string &&nombre, string &&apellido) : nombrePersona( move(nombre) ), apellidoPersona( move(apellido) ) {}

	//constructor Move
	Persona(Persona &&persona) :
		nombrePersona( move(persona.nombrePersona) ),
		apellidoPersona( move(persona.apellidoPersona) ) {}

	//Move operador de asignacion
	Persona &operator=(Persona &&persona)
	{
		nombrePersona = move(persona.nombrePersona);
		apellidoPersona = move(persona.apellidoPersona);
	}

	//operador <
	bool operator<(const Persona &p) const
	{
		return (apellidoPersona < p.apellidoPersona ||
			((apellidoPersona == p.apellidoPersona) && (nombrePersona < p.nombrePersona)));
	}

	//Obtener nombre o get
	string getNombre() const
	{
		return nombrePersona + " " + apellidoPersona;
	}


private:

	string nombrePersona ;
	string apellidoPersona;
}; 

Main.cpp

//STL Agenda Telefonica Usando Contenedores Map

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <map>
#include "Persona.h"

using namespace std;

using AgendaTelefonica = map < Persona, string > ;
using Entrada = pair < Persona, string > ;

//Registramos personas
Persona registrarPersona()
{
	string nombre, apellido;
	cout << "Introduce tu nombre: ";
	getline(cin, nombre);
	cout << "Introduce tu apellido: ";
	getline(cin, apellido);

	return Persona{ move(nombre), move(apellido) };
}


Entrada introducirTelefono()
{
	Persona persona{ registrarPersona() };

	string numero;
	cout << "Introduce el numero de telefono para " << persona.getNombre() << " : ";
	getline(cin, numero);

	return make_pair(move(persona), move(numero));
}

//Registramos el telefono
void insertarTelefono(AgendaTelefonica &agenda)
{
	auto pr = agenda.insert(introducirTelefono());

	if (pr.second)
		cout << "Inserto Correctamente" << endl;

	else
	{
		cout << "Entrada coincide con " << pr.first->first.getNombre()
			 << "Y el numero es " << pr.first->second << endl;
	}
}

//lista de contenidos de la agenda telefonica
void listarAgenda(const AgendaTelefonica &agenda)
{
	if (agenda.empty())
	{
		cout << "La agenda esta vacia" << endl;
		return;
	}

	cout << setiosflags(ios::left); //para justificar la salida a la izquierda

	for (const auto &entrada : agenda)
	{
		cout << setw(30) << entrada.first.getNombre()
			<< setw(12) << entrada.second << endl;
	}

	cout << resetiosflags(ios::right); //justificamos a la derecha la salida
}

//Recibimos las entradas de la agenda telefonica
void obtenerEntradas(const AgendaTelefonica &agenda)
{
	Persona persona{ registrarPersona() };
	auto iter = agenda.find(persona);

	if (iter == agenda.end())
	{
		cout << "No encontro a la persona " << persona.getNombre() << endl;
	}

	else
	{
		cout << "El numero para la persona " << persona.getNombre()
			<< " es " << iter->second << endl;
	}
}

//Eliminamos un registro de la agenda telefonica
void eliminarDeAgenda(AgendaTelefonica &agenda)
{
	Persona persona{ registrarPersona() };
	auto iter = agenda.find(persona);

	if (iter == agenda.end())
		cout << "No encontro a la persona " << persona.getNombre() << endl;

	else
	{
		agenda.erase(iter);
		cout << persona.getNombre() << " eliminada" << endl;
	}
}

int main()
{
	AgendaTelefonica agenda;

	char respuesta{};

	while (true)
	{
		cout << "Quieres introducir algo a la agenda(S o N): ";
		cin >> respuesta;

		while (cin.get() != '\n'); //ignora la entrada de una nueva linea

		if (toupper(respuesta) == 'N')
			break;

		if (toupper(respuesta) != 'S')
		{
			cout << "Respuesta invalida, intentalo de nuevo" << endl;
			continue;
		}

		insertarTelefono(agenda);
	}

	//Consultamos la agenda
	while (true)
	{
		cout << "\nEscoge una de las siguientes opciones:" << endl
		<< "A - Agrega un registro  E - Elimina un Registro  B - Buscar Registro" << endl
			<< "L - Listar agenda   C - Cerrar programa" << endl;

		cin >> respuesta;

		while (cin.get() != '\n'); //ignoramos la nueva linea

		switch (toupper(respuesta))
		{
		case 'A':
			insertarTelefono(agenda);
			break;

		case 'B':
			obtenerEntradas(agenda);
			break;

		case 'E':
			eliminarDeAgenda(agenda);
			break;

		case 'L':
			listarAgenda(agenda);
			break;

		case 'C':
			return 0;

		default:
			cout << "Opcion invalida. Intentalo de nuevo" << endl;
			break;
		}
	}
	
	system("pause");
	return 0;
}

No hay comentarios:

Publicar un comentario