#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
class fecha{
friend class agenda;
private:
int dd,mm,aa;
bool valido;
public:
// solicitamos al usuario los datos de fecha
friend istream& operator >> (istream &medio, fecha &f2){
do{
cout << "Introduce el dia: "; medio >> f2.dd; medio.ignore();
cout << "Introduce el mes: "; medio >> f2.mm; medio.ignore();
cout << "Introduce el anyo: "; medio >> f2.aa; medio.ignore();
f2.valido=f2.comprobar();
}while (f2.valido==false);
return(medio);
}
//mostramos al usuario los datos de fecha
friend ostream& operator << (ostream &medio, fecha f2){
medio << f2.dd << "/" << f2.mm << "/" << f2.aa << endl;
return(medio);
}
//comprobamos si la fecha es correcta
bool comprobar (){
valido=true;
if (dd<1 || dd>31) valido=false;
if (mm<1 || mm>12) valido=false;
if (aa<1950 || aa>2011) valido=false;
return (valido);
}
};
class direccion{
friend class agenda;
private:
string calle, localidad;
int numero;
public:
//solicitamos al usuario los datos de direccion
friend istream& operator >> (istream &medio, direccion &d2){
cout << "Introduce la calle: ";getline (medio,d2.calle);
cout << "Introuce el numero: "; medio >> d2.numero; medio.ignore();
cout << "Introduce la localidad: "; getline (medio,d2.localidad);
return(medio);
}
//mostramos al usuario los datos de direccion
friend ostream& operator << (ostream &medio, direccion d2){
cout << "Calle: "; medio << d2.calle << endl;
cout << "Numero: "; medio << d2.numero << endl;
cout << "Localidad: "; medio << d2.localidad << endl;
return(medio);
}
};
class contacto{
friend class agenda;
private:
fecha f1;
direccion d1;
string nombre, apellidos;
public:
//solicitamos los datos del contacto
friend istream& operator >> (istream &medio, contacto &c1){
cout <<"Introduce el nombre: "; getline (medio,c1.nombre);
cout << "Introduce los apellidos: "; getline (medio,c1.apellidos);
medio >> c1.f1;
medio >> c1.d1;
return(medio);
}
//mostramos los datos del contacto
friend ostream& operator << (ostream &medio, contacto c1){
cout << "Nombre: "; medio << c1.nombre<< endl;
cout << "Apellidos: "; medio << c1.apellidos<< endl;
medio << c1.f1;
medio << c1.d1;
cout << endl;
return(medio);
}
};
class agenda{
private:
string buscarnombre;
contacto *lista;
bool centinela;
int n;
public:
//constructor de agenda
agenda (){
cout << "constructor agenda" << endl;
n=0;
lista = NULL;
centinela=true;
return;
}
agenda (contacto micontacto){
lista = new contacto[n+1];
lista[n]=micontacto;
return;
}
//destructor de agenda
~agenda (){
cout << "destructor de agenda" << endl;
if (lista!=NULL)
delete []lista;
return;
}
//constructor de copia de agenda
agenda (const agenda &copialista){
cout << "constructor de copia" << endl;
n=copialista.n;
lista= new contacto[n+1];
for (int i=0; i<n; i++){
lista[i]=copialista.lista[i];
}
return;
}
agenda operator+(agenda ag1){
agenda resul;
resul.lista= new contacto [n+1];
for (int i=0;i<n;i++){
resul.lista[i]=ag1.lista[i];
}
return (resul);
}
agenda operator+=(contacto micontacto){
agenda resul,ag1(*this),ag2(micontacto);
resul=ag1+ag2;
return(resul);
}
agenda operator=(agenda ag1){
ag1.n=n;
for (int i=0;i<ag1.n;i++){
lista[i]=ag1.lista[i];
n++;
}
return (*this);
}
//mostrar todos los contactos de la agenda
friend ostream& operator << (ostream &medio, agenda ag1){
if (ag1.n==0){
cout << "La lista de contactos esta vacia" << endl;
}else{
for (int i=0;i<ag1.n;i++)cout << ag1.lista[i];
}
cout << endl << "Presiona una tecla para volver al menu";
return(medio);
}
void ordenar (void){
string compara1, compara2,comparanom1, comparanom2;
contacto aux;
for (int i=0;i<n-1;i++){
for (int j=i+1;j<n;j++){
compara1=lista[i].apellidos;
compara2=lista[j].apellidos;
if (compara1>compara2){
aux=lista[i];
lista[i]=lista[j];
lista[j]=aux;
}
if (compara1==compara2){
comparanom1=lista[i].nombre;
comparanom2=lista[j].nombre;
if (comparanom1>comparanom2){
aux=lista[i];
lista[i]=lista[j];
lista[j]=aux;
}
}
}
}
return;
}
// buscar un contacto en la agenda
void buscar (void){
if (lista!=NULL){
cout << "Introduce el nombre del contacto: ";
getline (cin,buscarnombre);
for (int i=0;i<n;i++){
if (lista[i].nombre==buscarnombre){
cout << endl;
cout << lista[i];
centinela=false;
}
}
if (centinela==true){
cout << endl << "No existe ningun contacto con ese nombre";
}
}
cout << endl << "Presiona una tecla para volver al menu";
return;
}
};
class menu{
private:
agenda miagenda;
contacto micontacto;
int eleccion;
public:
int solicitar (void){
do{
cout << "1- Nuevo contacto" << endl;
cout << "2- Listar contactos" << endl;
cout << "3- Buscar contacto" << endl;
cout << "4- Salir" << endl << endl;
cout << "Introduce tu eleccion: ";
cin >> eleccion; cin.ignore();
}while (eleccion<1 || eleccion>4);
return (eleccion);
}
void seleccion (void){
do{
eleccion=solicitar();
miagenda.ordenar();
switch(eleccion){
case 1:
cin >> micontacto;
miagenda+=micontacto;
break;
case 2:
cout << miagenda;
break;
case 3:
miagenda.buscar();
break;
}
}while (eleccion!=4);
}
};
int main (void){
menu m1;
m1.seleccion();
return(0);
}