Fecha más antigua de 3 fechas dadas

Ignacio Calvet

/* Este programa pide al usuario tres fechas hasta que las tres
sean correctas y escribe la fecha más antigua por pantalla*/



// PROGRAMA QUE COMPARA 3 FECHAS Y DICE CUAL ES LA MÁS ANTIGUA

#include <iostream>
#include <stdlib.h>
using namespace std;


struct fecha {
 int d, m, a;
};


// PROTOTIPOS
bool esBisiesto(int a);
int nDias(int m, int a);
bool esAnterior(struct fecha x, struct fecha y);
struct fecha fechaAnterior(struct fecha x, struct fecha y);
bool sonFechasIguales(struct fecha x, struct fecha y, struct fecha z);
void escribirFecha(struct fecha x);


// PROGRAMA PRINCIPAL
int main()
{
 struct fecha x, y, z;

 do
 {
 cout << "Introduce una fecha: "; cin >> x.d >> x.m >> x.a;
 cout << "Introduce otra fecha: "; cin >> y.d >> y.m >> y.a;
 cout << "Introduce otra fecha: "; cin >> z.d >> z.m >> z.a;
 } while (x.a < 1600 || x.m < 1 || x.m > 12 || x.d < 1 || x.d > nDias(x.m, x.a) ||
 y.a < 1600 || y.m < 1 || y.m > 12 || y.d < 1 || y.d > nDias(y.m, y.a) ||
 z.a < 1600 || z.m < 1 || z.m > 12 || z.d < 1 || z.d > nDias(z.m, z.a));

 cout << endl;

 if (sonFechasIguales(x,y,z))
 cout<< "Las tres fechas son iguales.";
 else
 {
 if (esAnterior(x,y)) // Si x es anterior a y, escribe la fecha anterior de x, z.
 // Si x no es anterior a y, escribe la fecha anterior de y, z.
 {
 cout << "La fecha ";
 escribirFecha(fechaAnterior(x,z));
 cout << " es anterior a las otras.";
 }
 else
 {
 cout << "La fecha ";
 escribirFecha(fechaAnterior(y,z));
 cout << " es anterior a las otras.";
 }
 }

 cout << endl << endl; system("PAUSE"); return 0;
}


//CÓDIGO

//Determina si el año (a) es o no bisiesto (resultado booleano)
bool esBisiesto(int a) {
 return (a % 400 == 0) || (a % 4 == 0 && a % 100 != 0);
}


//Calcula el número de días que tiene el mes m en el año a
int nDias(int m, int a) {
 switch(m) { //Notar la ausencia de sentencias break;
 case 2: //Es posible por que return finaliza la función.
 if (esBisiesto(a)) return 29;
 else return 28;
 case 4: case 6: case 9: case 11: return 30;
 default: return 31;
 }
}


//Devuelve verdad si la fecha pasada como primer parámetro es anterior a la
//del segundo parámetro (anterior o igual)
bool esAnterior(struct fecha x, struct fecha y) {
 if (x.a != y.a) return (x.a < y.a);
 else if (x.m != y.m) return (x.m < y.m);
 return (x.d <= y.d);
}


//Devuelve como resultado el valor del parámetro que contiene la fecha
//anterior (o igual)
struct fecha fechaAnterior(struct fecha x, struct fecha y) {
 if (x.a < y.a) return x;
 else if (x.a > y.a) return y; //Alternativa más corta:
 else if (x.m < y.m) return x; // if (esAnterior(x, y)
 else if (x.m > y.m) return y; // return x;
 else if (x.d <= y.d) return x; // else return y;
 else return y;
}


//Devuelve verdad si los dos parámetros representan la misma fecha
bool sonFechasIguales(struct fecha x, struct fecha y, struct fecha z) {
 return (x.d == y.d && y.d== z.d && x.m == y.m && y.m== z.m && x.a == y.a && y.a == z.a);
}


//Escribe en pantalla, en el formato dd/mm/aaaa, la fecha pasada como parámetro
//Ejemplo: el 1 de enero de 2000 se escribirá: 01/01/2000
//(Suponemos que el año de la fecha ya tiene cuatro cifras).
void escribirFecha(struct fecha x) {
 if (x.d<10) cout << 0;
 cout << x.d << "/";
 if (x.m<10) cout << 0;
 cout << x.m << "/" << x.a;
}
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s