/* document pour TP4 IUP2 2004-2005 */
/* inspiréeacute; de la correction du TP3  */
/* (c)P. TRAU  ULP IPST             */

#include<iostream.h>
#include<time.h>

class date {
private:
 int jour,mois,an;
public:
 int get_jour(void) {return jour;}
 int get_mois(void) {return mois;}
 int get_an(void) {return an;}
 void saisir(void);
 void afficher(void);
 int comparer_a(date);
 void ajouter(int);
 void maintenant(void);
 int bissextile(void); //dit si l'annee est bissextile
 int longueur_mois(void); //dit combien on a de jours dans le mois actuel
 int valide(void);     //dit si la date est valide (affiche des messages si erreur)
};

void date::saisir(void)
{char c; //c contiendra le caractere de separation, sans rien tester
 do{
   cout<<"entrez la date au format jj/mm/aaaa : ";
   cin>>jour>>c>>mois>>c>>an;
   }
 while(!valide()); 
}
void date::afficher(void)
{
 cout<<"le "<<jour<<"/"<<mois<<"/"<<an;
}
int date::comparer_a(date d)
{
 int r;
 if(d.an>an)r=1;
 else if(d.an<an)r=-1;
 else if(d.mois>mois)r=1;
 else if(d.mois<mois)r=-1;
 else if(d.jour>jour)r=1;
 else if(d.jour<jour)r=-1;
 else r=0;
 return r;
}

void date::ajouter(int nbjours)
{
 jour+=nbjours;
 while(jour>longueur_mois())
  {
   jour-=longueur_mois();
   mois++;
   if(mois>12)
    {mois=1;an++;}
  }
 while(jour<1)
  {
   mois--;
   if(mois<1){mois=12;an--;}
   jour+=longueur_mois();
  }
}

int lng_mois[12]={31,28,31,30,31,30,31,31,30,31,30,31};
void date::maintenant(void)
{
 time_t t=time(NULL);
 t/=86400;
 an=(t*4)/(365*4+1) + 1970;
 t-=(an-1970)*365;
 t-=(an-1970)/4; //pour annee bissextile, marche jusqu'en 2100 au moins
 mois=0;
 while(t>lng_mois[mois]) {t-=lng_mois[mois];mois++;}
 mois++; //car on commence a 1, pas a 0
 jour=t;
}

int date::bissextile(void)
{
 return((an%4)==0); //retourne 0 ou 1
}
int date::longueur_mois(void)
{
 int l;
 l=lng_mois[mois-1];
 if(mois==2) l+=bissextile(); //ajoute 1 ou 0
 return l;
}
int date::valide(void) 
{
 int ok=1;
 if (mois<=0 || mois>12)
  {cout<<"mois invalide\n";ok=0;}
 if(jour<0 || jour>longueur_mois())
  {cout<<"jour invalide\n";ok=0;}
 return ok;
}  
//surcharges des operateurs
ostream& operator<< (ostream &f, date &d)
{d.afficher();return f;}
istream& operator>> (istream&f, date &d)
{d.saisir();return f;}
date operator+ (date d, int nbjours)
{
 date res;
 res=d;
 res.ajouter(nbjours);
 return res;
}
date operator- (date d, int nbjours)
{return d+(-nbjours);}
int operator== (date &d1, date &d2)
{return d1.comparer_a(d2)==0;}
int operator!= (date &d1, date &d2)
{return d1.comparer_a(d2)!=0;}
int operator< (date &d1, date &d2)
{return d1.comparer_a(d2)>0;}
int operator<= (date &d1, date &d2)
{return d1.comparer_a(d2)>=0;}
int operator> (date &d1, date &d2)
{return d1.comparer_a(d2)<0;}
int operator>= (date &d1, date &d2)
{return d1.comparer_a(d2)<0;}
//programme de test (en commentaire si on veut reutiliser la classe autre part !)

/*******************
int main(void)
{
 date d1,d2,d3;
 int n; 
 cin>>d2;
// d2.afficher();
 d3.maintenant();
 if(d2<d3)cout<<"c'etait le passe\n";else cout<<"a venir\n";
 do
  { 
   cout<<"nous sommes "<<d3<<", combien de jours ajouter ? (0 pour quitter) : ";
   cin>>n;
   d3=d3+n;
  }
 while(n);
}
********************/


retour tp4

(c) P. TRAU IPST - ULP 12/1/05