// Dit programma vraagt de gebruiker om twee data tussen 1 januari 1900 en
// 31 december 2100 op te geven. Vervolgens wordt voor elk van deze data
// berekend de hoeveelste dag sinds 1 januari 1900 het is. Als de eerste
// datum eerder valt dan de tweede datum (of gelijk) wordt vervolgens
// berekend hoeveel dagen er verstreken zijn tussen de twee data.

// Rudy van Vliet,        30 september 2002

#include <iostream>

//****************************************************************************

void VraagDatum (int Nr, int &Dag1, int &Maand1, int &Jaar1)
 // vraag de gebruiker om de Nr-e datum in te voeren
{
  cout << endl;
  cout << "Geef de " << Nr << "-e datum op, drie getallen (dag, maandnummer,\n";
  cout << "  jaartal) gescheiden door spaties: ";
  cin >> Dag1 >> Maand1 >> Jaar1;

}  // VraagDatum

//****************************************************************************

bool SchrikkelJaar (int Jaar)
 // is het jaar Jaar een schrikkeljaar of niet (volgens de huidige regels)
 // aanname: 1900 <= Jaar
 //            (i.h.b.: positief jaartal en huidige regels voor schrikkeljaar
 //            zijn van toepassing)
{ bool Schrik;

  if (Jaar%4 != 0)
    Schrik = false;
  else  // deelbaar door 4
    if (Jaar%100 != 0)
      Schrik = true;
    else
      if (Jaar%400 != 0)
        Schrik = false;
      else
        Schrik = true;

  return Schrik;

}  // SchrikkelJaar

//****************************************************************************

int DagenInMaand (int Maand, int Jaar)
 // hoeveel dagen zijn er in de maand Maand in het jaar Jaar
 // aanname: 1 <= Maand <= 12
 //          1900 <= Jaar
 //            (i.h.b.: positief jaartal en huidige regels voor schrikkeljaar
 //            zijn van toepassing)
{ int DagenDezeMaand;

  switch (Maand)
  { case 2: if (SchrikkelJaar (Jaar))
            DagenDezeMaand = 29;
          else
            DagenDezeMaand = 28;
          break;
    case 4: 
    case 6: 
    case 9: 
    case 11: DagenDezeMaand = 30;
             break;
    default: DagenDezeMaand = 31;
  }

  return DagenDezeMaand;

}  // DagenInMaand

//****************************************************************************

bool GeldigeDatum (int Dag, int Maand, int Jaar)
 // controleer of de opgegeven datum een geldige datum tussen 1 januari 1900
 // en 31 december 2100 (inclusief) is
{ int DagenDezeMaand;
  bool Geldig;

  if ((Jaar < 1900) || (Jaar > 2100))
    Geldig = false;
  else  // Jaar is OK
    if ((Maand < 1) || (Maand > 12))
      Geldig = false;
    else  // ook Maand is OK
    { DagenDezeMaand = DagenInMaand (Maand, Jaar);
      if ((Dag < 1) || (Dag > DagenDezeMaand))
        Geldig = false;
      else
        Geldig = true;
    }

  return Geldig;
  
}  // GeldigeDatum

//****************************************************************************

int DagenSinds1_1_1900 (int Dag, int Maand, int Jaar)
 // bereken voor de meegegeven datum: de hoeveelste dag is het sinds
 //   1 januari 1900 (1 januari 1900 zelf is 1)
 // aanname: we hebben een geldige datum, niet eerder dan 1 januari 1900
{ int Dagen = 0,
      LoopJaar,
      LoopMaand;

   // we tellen eerst de hele jaren
  LoopJaar = 1900;
  while (LoopJaar < Jaar)
  { if (!SchrikkelJaar (LoopJaar))
      Dagen += 365;
    else
      Dagen += 366;
    LoopJaar ++;
  }

   // we zitten nu in het jaar Jaar
   // we tellen nu de hele maanden
  LoopMaand = 1;
  while (LoopMaand < Maand)
  { Dagen += DagenInMaand (LoopMaand, Jaar);
    LoopMaand ++;
  }
  
   // we zitten nu in de maand Maand
   // tel de resterende dagen
  Dagen += Dag;

  return Dagen;

}

//****************************************************************************

int main ()
{ int Dag1, Maand1, Jaar1,
      Dag2, Maand2, Jaar2,
      Dagen1, Dagen2;
  bool Geldig;

  cout << endl;
  cout << "Dit programma is gemaakt door Rudy van Vliet,\n";
  cout << "docent van het vak Inleiding Programmeren in C++\n";
  cout << "voor startende ondernemers in de ICT.\n";

  cout << endl;
  cout <<
     "U kunt twee data opgeven, tussen 1 januari 1900 en 31 december 2100.\n";
  VraagDatum (1, Dag1, Maand1, Jaar1);
  VraagDatum (2, Dag2, Maand2, Jaar2);

  Geldig = true;
  if (!GeldigeDatum (Dag1, Maand1, Jaar1))
  { Geldig = false;
    cout << endl;
    cout << "De eerste datum was niet geldig.\n";
  }
  if (!GeldigeDatum (Dag2, Maand2, Jaar2))
  { Geldig = false;
    cout << endl;
    cout << "De tweede datum was niet geldig.\n";
  }

  if (Geldig)
  { cout << endl;
    Dagen1 = DagenSinds1_1_1900 (Dag1, Maand1, Jaar1);
    cout << "De datum " << Dag1 << " " << Maand1 << " " << Jaar1
         << " is de " << Dagen1 << "-e dag sinds 1 januari 1900.\n";
    Dagen2 = DagenSinds1_1_1900 (Dag2, Maand2, Jaar2);
    cout << "De datum " << Dag2 << " " << Maand2 << " " << Jaar2
         << " is de " << Dagen2 << "-e dag sinds 1 januari 1900.\n";

    if (Dagen1 <= Dagen2)
      cout << "De tweede datum is " << Dagen2 - Dagen1
           << " dagen later dan de eerste datum.\n";
    else
      cout << "De tweede datum ligt voor de eerste datum.\n";
  }

  return 0;

}

