#include <cstdlib>
#include <iostream>
using namespace std;
class Fecha {
private:
int dia, mes, anio;
bool fechavalida(int ndia, int nmes, int nanio){
if(ndia<1 || ndia>31) return false;
else if (nmes<1 || nmes>12) return false;
else switch(nmes)
{
case 4: case 6: case 9: case 11:
if(ndia>30) return false;
break;
case 2:
if (ndia>28)return false;
break;
}
return true;
}
public:
Fecha (int d=0, int m=0, int a=0) {
// Constructor
if(fechavalida(d,m,a)){
dia=d; mes=m; anio=a;
} else {
cout<<"ERROR: Se trato de introducir fecha incorrecta"<<endl;
}
}
int damedia(void){
return dia;
}
int damemes(void){
return mes;
}
int dameanio(void){
return anio;
}
void imprimefecha(void){
cout<<damedia()<< "-" << damemes()<<"-" << dameanio()<< endl;
}
void guardarfecha(int d=0, int m=0, int a=0){
if(fechavalida(d,m,a)) {
dia=d; mes=m; anio=a;
} else {
cout<<"ERROR: Introducir fecha incorrecta"<<endl;
}
}
void scanfecha(){
int d, m, a;
if (scanf("%d-%d-%d",&d,&m,&a)!=3)
{
cout << "Error en lectura de fecha.";
}
else if(fechavalida(d,m,a)) {
dia=d; mes=m; anio=a;
}
}
// declaración de funcioón externa amiga:
friend int dif_dias (Fecha A, Fecha B);
};
//Definición de la función amiga (diferencia en dias):
int dif_dias (Fecha A, Fecha B){
int d,m,a, dif=0;
// Si estan al reves suspendemos el cálculo:
if(A.anio > B.anio) return -1;
else if(A.anio == B.anio && A.mes > B.mes) return -1;
else if(A.anio == B.anio && A.mes == B.mes && A.dia > B.dia) return -1;
// Si son fechas del mismo año:
if(A.anio == B.anio) {
if(A.mes == B.mes) return B.dia-A.dia;
// Dias por meses completos:
for(a=A.mes+1; a<B.mes ; a++)
{
switch(a) {
case 4: case 6: case 9: case 11:
dif+=30;
break;
case 2:
dif+=28;
break;
default:
dif+= 31;
}
}
// Dias que faltan para terminar el mes de A:
switch(A.mes) {
case 4: case 6: case 9: case 11:
dif+=30-A.dia;
break;
case 2:
dif+=28-A.dia;
break;
default:
dif+= 31-A.dia;
}
// Dias del mes de B:
dif+=B.dia;
return dif;
}
// Si son dias de años distintos:
// Años completos de diferencia:
else dif = (B.anio - (A.anio+1)) * 365;
// Ahora los meses hasta fin del año de A:
for(a=A.mes+1; a<=12 ; a++)
{
switch(a) {
case 4: case 6: case 9: case 11:
dif+=30;
break;
case 2:
dif+=28;
break;
default:
dif+= 31;
}
}
// Y los meses desde ppio del año de B:
for(a=1; a<B.mes ; a++)
{
switch(a) {
case 4: case 6: case 9: case 11:
dif+=30;
break;
case 2:
dif+=28;
break;
default:
dif+= 31;
}
}
// Dias que faltan para terminar el mes de A:
switch(a) {
case 4: case 6: case 9: case 11:
dif+=30-A.dia;
break;
case 2:
dif+=28-A.dia;
break;
default:
dif+= 31-A.dia;
}
// Dias del mes de B:
dif+=B.dia;
return dif;
}
int main(int argc, char *argv[])
{
int dia_aux, anio_aux, mes_aux;
Fecha diaA(20,4,2006), diaB(1,1,0);
cout<< "dia: " << diaA.damedia()<< endl;
cout<< "mes: " << diaA.damemes()<< endl;
cout<< "anio: " << diaA.dameanio()<< endl;
cout<<"Fecha completa: ";
diaA.imprimefecha();
cout <<endl<< "Introduzca dia: ";
cin >> dia_aux;
cout <<endl<< "Introduzca mes: ";
cin >> mes_aux;
cout <<endl<< "Introduzca anio: ";
cin >> anio_aux;
diaA.guardarfecha(dia_aux,mes_aux,anio_aux);
cout<<"Fecha introducida: ";
diaA.imprimefecha();
cout <<endl<< "Introduzca fecha completa (dd-mm-aaaa): ";
diaA.scanfecha();
cout<<"Fecha introducida: ";
diaA.imprimefecha();
cout<< endl << endl <<"Demo diferencia en dias. Intro una fecha: ";
diaA.scanfecha();
cout<< endl <<"Intro una fecha posterior: ";
diaB.scanfecha();
cout << endl << "Diferencia en dias=> " <<dif_dias (diaA,diaB) << endl;
cin.get();
return EXIT_SUCCESS;
}
Comentarios sobre la versión: 20071126 (1)